toolchain.cmake 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. set(CROSS_ROOTFS $ENV{ROOTFS_DIR})
  2. set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH})
  3. if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version)
  4. set(CMAKE_SYSTEM_NAME FreeBSD)
  5. set(FREEBSD 1)
  6. elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc)
  7. set(CMAKE_SYSTEM_NAME SunOS)
  8. set(ILLUMOS 1)
  9. elseif(EXISTS ${CROSS_ROOTFS}/boot/system/develop/headers/config/HaikuConfig.h)
  10. set(CMAKE_SYSTEM_NAME Haiku)
  11. else()
  12. set(CMAKE_SYSTEM_NAME Linux)
  13. set(LINUX 1)
  14. endif()
  15. set(CMAKE_SYSTEM_VERSION 1)
  16. if(EXISTS ${CROSS_ROOTFS}/etc/tizen-release)
  17. set(TIZEN 1)
  18. elseif(EXISTS ${CROSS_ROOTFS}/android_platform)
  19. set(ANDROID 1)
  20. endif()
  21. if(TARGET_ARCH_NAME STREQUAL "arm")
  22. set(CMAKE_SYSTEM_PROCESSOR armv7l)
  23. if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf)
  24. set(TOOLCHAIN "armv7-alpine-linux-musleabihf")
  25. elseif(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
  26. set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
  27. else()
  28. set(TOOLCHAIN "arm-linux-gnueabihf")
  29. endif()
  30. if(TIZEN)
  31. set(TIZEN_TOOLCHAIN "armv7hl-tizen-linux-gnueabihf/9.2.0")
  32. endif()
  33. elseif(TARGET_ARCH_NAME STREQUAL "arm64")
  34. set(CMAKE_SYSTEM_PROCESSOR aarch64)
  35. if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl)
  36. set(TOOLCHAIN "aarch64-alpine-linux-musl")
  37. elseif(LINUX)
  38. set(TOOLCHAIN "aarch64-linux-gnu")
  39. if(TIZEN)
  40. set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
  41. endif()
  42. elseif(FREEBSD)
  43. set(triple "aarch64-unknown-freebsd12")
  44. endif()
  45. elseif(TARGET_ARCH_NAME STREQUAL "armel")
  46. set(CMAKE_SYSTEM_PROCESSOR armv7l)
  47. set(TOOLCHAIN "arm-linux-gnueabi")
  48. if(TIZEN)
  49. set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0")
  50. endif()
  51. elseif(TARGET_ARCH_NAME STREQUAL "armv6")
  52. set(CMAKE_SYSTEM_PROCESSOR armv6l)
  53. if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
  54. set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
  55. else()
  56. set(TOOLCHAIN "arm-linux-gnueabihf")
  57. endif()
  58. elseif(TARGET_ARCH_NAME STREQUAL "ppc64le")
  59. set(CMAKE_SYSTEM_PROCESSOR ppc64le)
  60. set(TOOLCHAIN "powerpc64le-linux-gnu")
  61. elseif(TARGET_ARCH_NAME STREQUAL "riscv64")
  62. set(CMAKE_SYSTEM_PROCESSOR riscv64)
  63. set(TOOLCHAIN "riscv64-linux-gnu")
  64. elseif(TARGET_ARCH_NAME STREQUAL "s390x")
  65. set(CMAKE_SYSTEM_PROCESSOR s390x)
  66. set(TOOLCHAIN "s390x-linux-gnu")
  67. elseif(TARGET_ARCH_NAME STREQUAL "x64")
  68. set(CMAKE_SYSTEM_PROCESSOR x86_64)
  69. if(LINUX)
  70. set(TOOLCHAIN "x86_64-linux-gnu")
  71. if(TIZEN)
  72. set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu/9.2.0")
  73. endif()
  74. elseif(FREEBSD)
  75. set(triple "x86_64-unknown-freebsd12")
  76. elseif(ILLUMOS)
  77. set(TOOLCHAIN "x86_64-illumos")
  78. elseif(HAIKU)
  79. set(TOOLCHAIN "x64_64-unknown-haiku")
  80. endif()
  81. elseif(TARGET_ARCH_NAME STREQUAL "x86")
  82. set(CMAKE_SYSTEM_PROCESSOR i686)
  83. set(TOOLCHAIN "i686-linux-gnu")
  84. if(TIZEN)
  85. set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0")
  86. endif()
  87. else()
  88. message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, ppc64le, riscv64, s390x, x64 and x86 are supported!")
  89. endif()
  90. if(DEFINED ENV{TOOLCHAIN})
  91. set(TOOLCHAIN $ENV{TOOLCHAIN})
  92. endif()
  93. # Specify include paths
  94. if(TIZEN)
  95. if(TARGET_ARCH_NAME STREQUAL "arm")
  96. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
  97. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7hl-tizen-linux-gnueabihf)
  98. endif()
  99. if(TARGET_ARCH_NAME STREQUAL "armel")
  100. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
  101. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi)
  102. endif()
  103. if(TARGET_ARCH_NAME STREQUAL "arm64")
  104. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
  105. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/aarch64-tizen-linux-gnu)
  106. endif()
  107. if(TARGET_ARCH_NAME STREQUAL "x86")
  108. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
  109. include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/i586-tizen-linux-gnu)
  110. endif()
  111. endif()
  112. if(ANDROID)
  113. if(TARGET_ARCH_NAME STREQUAL "arm")
  114. set(ANDROID_ABI armeabi-v7a)
  115. elseif(TARGET_ARCH_NAME STREQUAL "arm64")
  116. set(ANDROID_ABI arm64-v8a)
  117. endif()
  118. # extract platform number required by the NDK's toolchain
  119. file(READ "${CROSS_ROOTFS}/android_platform" RID_FILE_CONTENTS)
  120. string(REPLACE "RID=" "" ANDROID_RID "${RID_FILE_CONTENTS}")
  121. string(REGEX REPLACE ".*\\.([0-9]+)-.*" "\\1" ANDROID_PLATFORM "${ANDROID_RID}")
  122. set(ANDROID_TOOLCHAIN clang)
  123. set(FEATURE_EVENT_TRACE 0) # disable event trace as there is no lttng-ust package in termux repository
  124. set(CMAKE_SYSTEM_LIBRARY_PATH "${CROSS_ROOTFS}/usr/lib")
  125. set(CMAKE_SYSTEM_INCLUDE_PATH "${CROSS_ROOTFS}/usr/include")
  126. # include official NDK toolchain script
  127. include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake)
  128. elseif(FREEBSD)
  129. # we cross-compile by instructing clang
  130. set(CMAKE_C_COMPILER_TARGET ${triple})
  131. set(CMAKE_CXX_COMPILER_TARGET ${triple})
  132. set(CMAKE_ASM_COMPILER_TARGET ${triple})
  133. set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
  134. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
  135. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld")
  136. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld")
  137. elseif(ILLUMOS)
  138. set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
  139. include_directories(SYSTEM ${CROSS_ROOTFS}/include)
  140. set(TOOLSET_PREFIX ${TOOLCHAIN}-)
  141. function(locate_toolchain_exec exec var)
  142. string(TOUPPER ${exec} EXEC_UPPERCASE)
  143. if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
  144. set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
  145. return()
  146. endif()
  147. find_program(EXEC_LOCATION_${exec}
  148. NAMES
  149. "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
  150. "${TOOLSET_PREFIX}${exec}")
  151. if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
  152. message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
  153. endif()
  154. set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
  155. endfunction()
  156. set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
  157. locate_toolchain_exec(gcc CMAKE_C_COMPILER)
  158. locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
  159. set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
  160. set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
  161. elseif(HAIKU)
  162. set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
  163. set(TOOLSET_PREFIX ${TOOLCHAIN}-)
  164. function(locate_toolchain_exec exec var)
  165. string(TOUPPER ${exec} EXEC_UPPERCASE)
  166. if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
  167. set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
  168. return()
  169. endif()
  170. set(SEARCH_PATH "${CROSS_ROOTFS}/generated/cross-tools-x86_64/bin")
  171. find_program(EXEC_LOCATION_${exec}
  172. PATHS ${SEARCH_PATH}
  173. NAMES
  174. "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
  175. "${TOOLSET_PREFIX}${exec}")
  176. if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
  177. message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
  178. endif()
  179. set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
  180. endfunction()
  181. set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
  182. locate_toolchain_exec(gcc CMAKE_C_COMPILER)
  183. locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
  184. set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
  185. set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
  186. # let CMake set up the correct search paths
  187. include(Platform/Haiku)
  188. else()
  189. set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
  190. set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
  191. set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
  192. set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
  193. endif()
  194. # Specify link flags
  195. function(add_toolchain_linker_flag Flag)
  196. set(Config "${ARGV1}")
  197. set(CONFIG_SUFFIX "")
  198. if (NOT Config STREQUAL "")
  199. set(CONFIG_SUFFIX "_${Config}")
  200. endif()
  201. set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
  202. set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
  203. endfunction()
  204. if(LINUX)
  205. add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib/${TOOLCHAIN}")
  206. add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}")
  207. endif()
  208. if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
  209. if(TIZEN)
  210. add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
  211. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
  212. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
  213. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
  214. endif()
  215. elseif(TARGET_ARCH_NAME STREQUAL "arm64")
  216. if(TIZEN)
  217. add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
  218. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib64")
  219. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64")
  220. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
  221. add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib64")
  222. add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64")
  223. add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
  224. endif()
  225. elseif(TARGET_ARCH_NAME STREQUAL "x86")
  226. add_toolchain_linker_flag(-m32)
  227. if(TIZEN)
  228. add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
  229. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
  230. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
  231. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
  232. endif()
  233. elseif(ILLUMOS)
  234. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib/amd64")
  235. add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/amd64/lib")
  236. endif()
  237. # Specify compile options
  238. if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|ppc64le|riscv64|s390x)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU)
  239. set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
  240. set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
  241. set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})
  242. endif()
  243. if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
  244. add_compile_options(-mthumb)
  245. if (NOT DEFINED CLR_ARM_FPU_TYPE)
  246. set (CLR_ARM_FPU_TYPE vfpv3)
  247. endif (NOT DEFINED CLR_ARM_FPU_TYPE)
  248. add_compile_options (-mfpu=${CLR_ARM_FPU_TYPE})
  249. if (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
  250. set (CLR_ARM_FPU_CAPABILITY 0x7)
  251. endif (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
  252. add_definitions (-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY})
  253. if(TARGET_ARCH_NAME STREQUAL "armel")
  254. add_compile_options(-mfloat-abi=softfp)
  255. endif()
  256. elseif(TARGET_ARCH_NAME STREQUAL "x86")
  257. add_compile_options(-m32)
  258. add_compile_options(-Wno-error=unused-command-line-argument)
  259. endif()
  260. if(TIZEN)
  261. if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64|x86)$")
  262. add_compile_options(-Wno-deprecated-declarations) # compile-time option
  263. add_compile_options(-D__extern_always_inline=inline) # compile-time option
  264. endif()
  265. endif()
  266. # Set LLDB include and library paths for builds that need lldb.
  267. if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$")
  268. if(TARGET_ARCH_NAME STREQUAL "x86")
  269. set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}")
  270. else() # arm/armel case
  271. set(LLVM_CROSS_DIR "$ENV{LLVM_ARM_HOME}")
  272. endif()
  273. if(LLVM_CROSS_DIR)
  274. set(WITH_LLDB_LIBS "${LLVM_CROSS_DIR}/lib/" CACHE STRING "")
  275. set(WITH_LLDB_INCLUDES "${LLVM_CROSS_DIR}/include" CACHE STRING "")
  276. set(LLDB_H "${WITH_LLDB_INCLUDES}" CACHE STRING "")
  277. set(LLDB "${LLVM_CROSS_DIR}/lib/liblldb.so" CACHE STRING "")
  278. else()
  279. if(TARGET_ARCH_NAME STREQUAL "x86")
  280. set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/i386-linux-gnu" CACHE STRING "")
  281. set(CHECK_LLVM_DIR "${CROSS_ROOTFS}/usr/lib/llvm-3.8/include")
  282. if(EXISTS "${CHECK_LLVM_DIR}" AND IS_DIRECTORY "${CHECK_LLVM_DIR}")
  283. set(WITH_LLDB_INCLUDES "${CHECK_LLVM_DIR}")
  284. else()
  285. set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include")
  286. endif()
  287. else() # arm/armel case
  288. set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}" CACHE STRING "")
  289. set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include" CACHE STRING "")
  290. endif()
  291. endif()
  292. endif()
  293. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  294. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  295. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  296. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)