blackberry.toolchain.cmake 9.6 KB

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