1# ------------------------------------------------------------------------------ 2# BlackBerry CMake toolchain file, for use with the BlackBerry 10 NDK 3# Requires cmake 2.6.3 or newer (2.8.3 or newer is recommended). 4# 5# Usage Linux: 6# $ source /absolute/path/to/the/bbndk/bbndk-env.sh 7# $ mkdir build 8# $ cd build 9# $ cmake .. -DCMAKE_TOOLCHAIN_FILE="../blackberry.toolchain.cmake" -DBLACKBERRY_ARCHITECTURE=arm -DFREEGLUT_GLES=ON -DFREEGLUT_BUILD_DEMOS=NO -DCMAKE_VERBOSE_MAKEFILE=TRUE -G "Eclipse CDT4 - Unix Makefiles" 10# $ make -j8 11# 12# Usage Mac: 13# Same as the steps on Linux 14# 15# Usage Windows: 16# > /absolute/path/to/the/bbndk/bbndk-env.bat 17# > mkdir build 18# > cd build 19# > cmake .. -DCMAKE_TOOLCHAIN_FILE="../blackberry.toolchain.cmake" -DBLACKBERRY_ARCHITECTURE=arm -DFREEGLUT_GLES=ON -DFREEGLUT_BUILD_DEMOS=NO -DCMAKE_VERBOSE_MAKEFILE=TRUE -G "Eclipse CDT4 - Unix Makefiles" 20# > make -j8 21# 22 23cmake_minimum_required( VERSION 2.6.3 ) 24 25if( DEFINED CMAKE_CROSSCOMPILING ) 26 # Subsequent toolchain loading is not really needed 27 return() 28endif() 29 30set( BLACKBERRY_TOOLCHAIN_ROOT "$ENV{QNX_HOST}" ) 31set( BLACKBERRY_TARGET_ROOT "$ENV{QNX_TARGET}" ) 32set( CMAKE_SYSTEM_NAME Linux ) 33set( CMAKE_SYSTEM_VERSION 1 ) 34 35# Check for PlayBook 36if( EXISTS "${BLACKBERRY_TARGET_ROOT}/x86/lib/gcc/4.4.2" ) 37 set( PLAYBOOK True ) 38endif() 39 40# Check for for GCC 4.8.2 41if( EXISTS "${BLACKBERRY_TARGET_ROOT}/x86/lib/gcc/4.8.2" ) 42 set( BB_GCC_482 True ) 43endif() 44 45# STL version: by default gnustl_static will be used 46set( BLACKBERRY_USE_STLPORT FALSE CACHE BOOL "Experimental: use stlport_static instead of gnustl_static") 47mark_as_advanced( BLACKBERRY_USE_STLPORT ) 48 49# Detect host platform 50set( TOOL_OS_SUFFIX "" ) 51if( CMAKE_HOST_APPLE ) 52 set( BLACKBERRY_NDK_HOST_SYSTEM_NAME "darwin-x86" ) 53elseif( CMAKE_HOST_WIN32 ) 54 set( BLACKBERRY_NDK_HOST_SYSTEM_NAME "windows" ) 55 set( TOOL_OS_SUFFIX ".exe" ) 56elseif( CMAKE_HOST_UNIX ) 57 set(BLACKBERRY_NDK_HOST_SYSTEM_NAME "linux-x86" ) 58else() 59 message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" ) 60endif() 61 62# Specify the cross compiler 63set( CMAKE_C_COMPILER "$ENV{QNX_HOST}/usr/bin/qcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc" ) 64set( CMAKE_CXX_COMPILER "$ENV{QNX_HOST}/usr/bin/qcc${TOOL_OS_SUFFIX}" CACHE PATH "g++" ) 65set( CMAKE_ASM_COMPILER "$ENV{QNX_HOST}/usr/bin/qcc${TOOL_OS_SUFFIX}" CACHE PATH "Assembler" ) 66if( CMAKE_VERSION VERSION_LESS 2.8.5 ) 67 set( CMAKE_ASM_COMPILER_ARG1 "-c" ) 68endif() 69 70# There may be a way to make cmake reduce these TODO 71if( BLACKBERRY_ARCHITECTURE STREQUAL "arm" ) 72 set( NEUTRINO_ARCH "v7" ) 73else() 74 set( NEUTRINO_ARCH "" ) 75endif() 76set( CMAKE_STRIP "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" ) 77set( CMAKE_AR "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" ) 78set( CMAKE_LINKER "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}${NEUTRINO_ARCH}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" ) 79set( CMAKE_NM "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}${NEUTRINO_ARCH}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" ) 80set( CMAKE_OBJCOPY "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}${NEUTRINO_ARCH}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" ) 81set( CMAKE_OBJDUMP "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}${NEUTRINO_ARCH}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" ) 82set( CMAKE_RANLIB "$ENV{QNX_HOST}/usr/bin/nto${BLACKBERRY_ARCHITECTURE}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" ) 83 84# Installer 85#if( APPLE ) 86# find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool ) 87# if( NOT CMAKE_INSTALL_NAME_TOOL ) 88# message( FATAL_ERROR "Could not find install_name_tool, please check your #installation." ) 89# endif() 90# mark_as_advanced( CMAKE_INSTALL_NAME_TOOL ) 91# endif() 92 93# Setup output directories 94set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" ) 95set( CMAKE_INSTALL_PREFIX "${BLACKBERRY_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) 96 97if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" ) 98 set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" ) 99else() 100 set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" ) 101endif() 102 103# Includes 104if( PLAYBOOK ) 105 list( APPEND BLACKBERRY_SYSTEM_INCLUDE_DIRS "${BLACKBERRY_TARGET_ROOT}/usr/include" ) 106else() 107 list( APPEND BLACKBERRY_SYSTEM_INCLUDE_DIRS "${BLACKBERRY_TARGET_ROOT}/qnx6/usr/include" ) 108endif() 109 110# Flags and preprocessor definitions 111set( BB_USING_GCC_482 False ) 112if( PLAYBOOK ) 113 set( BLACKBERRY_COMP_DEF "-D__PLAYBOOK__" ) 114 set( BLACKBERRY_COMP_VERSION "4.4.2" ) 115else() 116 set( BLACKBERRY_COMP_DEF "-D__QNX__" ) 117 if( BB_GCC_482 AND BLACKBERRY_USE_GCC_4_8 ) 118 set( BLACKBERRY_COMP_VERSION "4.8.2" ) 119 set( BB_USING_GCC_482 True ) 120 else() 121 set( BLACKBERRY_COMP_VERSION "4.6.3" ) 122 endif() 123endif() 124if( BLACKBERRY_ARCHITECTURE STREQUAL "arm" ) 125 set( BLACKBERRY_COMP_TARGET "gcc_ntoarmv7le" ) 126else() 127 set( BLACKBERRY_COMP_TARGET "gcc_ntox86" ) 128endif() 129set( BLACKBERRY_CXX_COMP_LIB "" ) 130if( BLACKBERRY_DINKUM ) 131 set( DINKUM 1 ) 132 if( BB_USING_GCC_482 ) 133 set( BLACKBERRY_COMP_TARGET "${BLACKBERRY_COMP_TARGET}_cpp" ) 134 else() 135 set( BLACKBERRY_CXX_COMP_LIB "-Y_cpp" ) 136 endif() 137else() 138 set( DINKUM 0 ) 139 if( BB_USING_GCC_482 ) 140 set( BLACKBERRY_COMP_TARGET "${BLACKBERRY_COMP_TARGET}_gpp" ) 141 else() 142 set( BLACKBERRY_CXX_COMP_LIB "-Y_gpp" ) 143 endif() 144endif() 145set( BLACKBERRY_CC_FLAGS " -V${BLACKBERRY_COMP_VERSION},${BLACKBERRY_COMP_TARGET} ${BLACKBERRY_COMP_DEF}" ) 146set( BLACKBERRY_CXX_FLAGS " -V${BLACKBERRY_COMP_VERSION},${BLACKBERRY_COMP_TARGET} ${BLACKBERRY_CXX_COMP_LIB} ${BLACKBERRY_COMP_DEF}" ) 147set( BLACKBERRY 1 ) 148 149# NDK flags 150if( DINKUM ) 151 set( CMAKE_CXX_FLAGS "${BLACKBERRY_CXX_FLAGS} -DBLACKBERRY_DINKUM=1" ) 152 set( CMAKE_C_FLAGS "${BLACKBERRY_CC_FLAGS} -DBLACKBERRY_DINKUM=1" ) 153else() 154 set( CMAKE_CXX_FLAGS "${BLACKBERRY_CXX_FLAGS}" ) 155 set( CMAKE_C_FLAGS "${BLACKBERRY_CC_FLAGS}" ) 156endif() 157set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions" ) 158set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" ) 159 160# Release and Debug flags 161if( BLACKBERRY_ARCHITECTURE STREQUAL "arm" ) 162 set( CMAKE_CXX_FLAGS_RELEASE "-mthumb -O3" ) 163 set( CMAKE_C_FLAGS_RELEASE "-mthumb -O3" ) 164 set( CMAKE_CXX_FLAGS_DEBUG "-marm -Os -finline-limit=64" ) 165 set( CMAKE_C_FLAGS_DEBUG "-marm -Os -finline-limit=64" ) 166else() 167 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i486" ) 168 set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i486" ) 169endif() 170 171# Cache flags 172set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags" ) 173set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags" ) 174set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "c++ Release flags" ) 175set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "c Release flags" ) 176set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "c++ Debug flags" ) 177set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "c Debug flags" ) 178set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) 179SET( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" CACHE STRING "linker flags") 180SET( CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "" CACHE STRING "linker flags") 181set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) 182set( CMAKE_EXE_LINKER_FLAGS "-lstdc++" CACHE STRING "linker flags" ) 183 184# Finish flags 185set( BLACKBERRY_CXX_FLAGS "${BLACKBERRY_CXX_FLAGS}" CACHE INTERNAL "Extra BlackBerry compiler flags") 186set( BLACKBERRY_LINKER_FLAGS "${BLACKBERRY_LINKER_FLAGS}" CACHE INTERNAL "Extra BlackBerry linker flags") 187set( CMAKE_CXX_FLAGS "${BLACKBERRY_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" ) 188set( CMAKE_C_FLAGS "${BLACKBERRY_CXX_FLAGS} ${CMAKE_C_FLAGS}" ) 189 190# Global flags for cmake client scripts to change behavior 191set( BLACKBERRY True ) 192# Find the Target environment 193set( CMAKE_FIND_ROOT_PATH "${CMAKE_SOURCE_DIR}" "${BLACKBERRY_TARGET_ROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" ) 194# Search for libraries and includes in the ndk toolchain 195set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) 196set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) 197set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) 198 199# Macro to find packages on the host OS 200macro( find_host_package ) 201 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) 202 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) 203 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) 204 if( CMAKE_HOST_WIN32 ) 205 SET( WIN32 1 ) 206 SET( UNIX ) 207 elseif( CMAKE_HOST_APPLE ) 208 SET( APPLE 1 ) 209 SET( UNIX ) 210 endif() 211 find_package( ${ARGN} ) 212 SET( WIN32 ) 213 SET( APPLE ) 214 SET( UNIX 1 ) 215 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) 216 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) 217 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) 218endmacro() 219 220# Macro to find programs on the host OS 221macro( find_host_program ) 222 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) 223 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) 224 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) 225 if( CMAKE_HOST_WIN32 ) 226 SET( WIN32 1 ) 227 SET( UNIX ) 228 elseif( CMAKE_HOST_APPLE ) 229 SET( APPLE 1 ) 230 SET( UNIX ) 231 endif() 232 find_program( ${ARGN} ) 233 SET( WIN32 ) 234 SET( APPLE ) 235 SET( UNIX 1 ) 236 set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) 237 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) 238 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) 239endmacro() 240 241# We are doing cross compiling, reset the OS information of the Building system 242UNSET( APPLE ) 243UNSET( WIN32 ) 244UNSET( UNIX ) 245