#
# Licensed to the Apache Software Foundation (ASF) under one or more 
# contributor license agreements. See the NOTICE file distributed with  
# this work for additional information regarding copyright ownership. 
# The ASF licenses this file to you under the Apache License, Version  
# 2.0 (the "License"); you may not use this file except in compliance  
# with the License. You may obtain a copy of the License at 
# 
# http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and 
# limitations under the License. 
#

SET (TARGET_OS iPhoneOS)
SET (TARGET_ARCH ARM64)

INCLUDE(CMakeForceCompiler)
CMAKE_FORCE_C_COMPILER(clang clang)
CMAKE_FORCE_CXX_COMPILER(clang++ clang)

SET (CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")

IF(NOT SDK_VERSION)
	SET (SDK_VERSION "7.1" CACHE STRING "iOS SDK-Version" FORCE)
	MESSAGE(STATUS "   WARNING: The SDK_VERSION was set to default to ${SDK_VERSION}, you can specify an other SDK by using \"-DSDK_VERSION=7.1\" or by using the CMake GUI")
ELSE()
	SET (SDK_VERSION "${SDK_VERSION}" CACHE STRING "iOS SDK-Version" FORCE)
ENDIF()

SET (DEVELOPER_ROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer" CACHE STRING "Developer Root Path" FORCE)
SET (SDK_ROOT "${DEVELOPER_ROOT}/SDKs/iPhoneOS${SDK_VERSION}.sdk" CACHE STRING "SDK Root Path" FORCE)

SET (CMAKE_OSX_SYSROOT "${SDK_ROOT}")
SET (CMAKE_OSX_DEPLOYMENT_TARGET "")
SET (CMAKE_OSX_ARCHITECTURES "arm64")

SET (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos")

SET (CMAKE_C_FLAGS_DEBUG "-ggdb -Wall -D_DEBUG" CACHE STRING "C Flags Debug" FORCE)
SET (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "CXX Flags Debug" FORCE)

SET (CMAKE_C_FLAGS_RELEASE "-Wall -O3 -DNDEBUG" CACHE STRING "C Flags Release" FORCE)
SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "CXX Flags Release" FORCE)

ADD_DEFINITIONS ("-DTARGET_OS=iPhoneOS")
ADD_DEFINITIONS ("-DTARGET_ARCH=ARM64")
ADD_DEFINITIONS ("-DOS_IPHONEOS")
ADD_DEFINITIONS ("-DARCH_ARM64")

#disable GTEST ARM Targets
SET(CONFIG_BUILD_TESTS FALSE)
