#
# 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. 

#------------------------------------------------------------------#
#
#HOW TO BUILD CAPU FOR QNX:
#1. set QNX_HOST environment variable to your host's build tools
#2. set QNX_TARGET environment variable to the qnx target location
#3. add QNX_HOST/usr/bin to your path
#   Windows: set PATH=%QNX_HOST%\usr\bin;%PATH%
#   Linux: export PATH=$QNX_HOST/usr/bin:$PATH
#4. execute cmake in build-folder:
#   cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=<path to toolchain>/QNX_X86.toolchain -DCMAKE_BUILD_TYPE=Debug|Release ..
#5. make
#
#------------------------------------------------------------------#

INCLUDE(CMakeForceCompiler)

SET(CMAKE_SYSTEM_NAME QNX)

SET(TARGET_OS QNX)
SET(TARGET_ARCH X86_32)
SET(TARGET_COMPILER GCC)

SET(CMAKE_SYSTEM_PROCESSOR x86)

#set successful exit value on target system
SET(THREADS_PTHREAD_ARG 0)

#check environment variables
IF ("$ENV{QNX_HOST}" STREQUAL "")
	MESSAGE(FATAL_ERROR "QNX_HOST environment variable not found. Please set the variable to your host's build tools")
ENDIF ()
IF ("$ENV{QNX_TARGET}" STREQUAL "")
	MESSAGE(FATAL_ERROR "QNX_TARGET environment variable not found. Please set the variable to the qnx target location")
ENDIF ()

#set executable suffix	
IF(CMAKE_HOST_WIN32)
	SET(HOST_EXECUTABLE_SUFFIX ".exe")
	#convert windows paths to cmake paths
	FILE(TO_CMAKE_PATH "$ENV{QNX_HOST}" QNX_HOST)
	FILE(TO_CMAKE_PATH "$ENV{QNX_TARGET}" QNX_TARGET)
ELSE()
	SET(QNX_HOST "$ENV{QNX_HOST}")
	SET(QNX_TARGET "$ENV{QNX_TARGET}")
ENDIF()

MESSAGE(STATUS "using QNX_HOST ${QNX_HOST}")
MESSAGE(STATUS "using QNX_TARGET ${QNX_TARGET}")

#set c compiler and flags
SET(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-gcc${HOST_EXECUTABLE_SUFFIX})
SET(CMAKE_C_FLAGS "-march=i486")
SET(CMAKE_C_FLAGS_DEBUG "{CMAKE_C_FLAGS} -g -D_DEBUG" CACHE STRING "C Flags Debug" FORCE)
SET(CMAKE_C_FLAGS_RELEASE "{CMAKE_C_FLAGS} -O3 -DNDEBUG" CACHE STRING "CXX Flags Debug" FORCE)

#set c++ compiler and flags
SET(CMAKE_CXX_COMPILER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-g++${HOST_EXECUTABLE_SUFFIX}")
SET(CMAKE_CXX_FLAGS "-march=i486")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -D_DEBUG" CACHE STRING "C Flags Release" FORCE)
SET(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS} -O3 -DNDEBUG" CACHE STRING "CXX Flags Release" FORCE)

#set linker
SET(CMAKE_LINKER       "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ld${HOST_EXECUTABLE_SUFFIX}"     CACHE PATH "QNX Linker Program")

#set make
SET(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}"                                 CACHE PATH "QNX Make Program")

#set other tools
SET(CMAKE_AR           "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ar${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX ar Program")
SET(CMAKE_NM           "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-nm${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX nm Program")
SET(CMAKE_OBJCOPY      "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objcopy${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objcopy Program")
SET(CMAKE_OBJDUMP      "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objdump${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objdump Program")
SET(CMAKE_RANLIB       "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ranlib${HOST_EXECUTABLE_SUFFIX}"  CACHE PATH "QNX ranlib Program")
SET(CMAKE_SH           "${QNX_HOST}/usr/bin/sh${HOST_EXECUTABLE_SUFFIX}"                                   CACHE PATH "QNX shell Program")
SET(CMAKE_STRIP        "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-strip${HOST_EXECUTABLE_SUFFIX}"   CACHE PATH "QNX Strip Program")

#set target environment
SET(CMAKE_FIND_ROOT_PATH "${QNX_TARGET}")

# search for programs in the build host directories only
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

ADD_DEFINITIONS("-DTARGET_OS=QNX")
ADD_DEFINITIONS("-DTARGET_ARCH=X86_32")
ADD_DEFINITIONS("-DOS_QNX")
ADD_DEFINITIONS("-DARCH_X86_32")

# necessary for gmock
ADD_DEFINITIONS("-DGTEST_HAS_PTHREAD=1")
