CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. cmake_minimum_required(VERSION 3.2)
  2. project (CHAKRACORE)
  3. # Keep CMake from caching static/shared library
  4. # option. Otherwise, CMake fails to update cached
  5. # references
  6. # todo: create a sub cmake file to take care of _SH uncaching...
  7. if(SHARED_LIBRARY_SH)
  8. unset(SHARED_LIBRARY_SH CACHE)
  9. unset(STATIC_LIBRARY_SH CACHE)
  10. unset(STATIC_LIBRARY CACHE)
  11. set(SHARED_LIBRARY 1)
  12. endif()
  13. if(STATIC_LIBRARY_SH)
  14. unset(SHARED_LIBRARY_SH CACHE)
  15. unset(STATIC_LIBRARY_SH CACHE)
  16. unset(SHARED_LIBRARY CACHE)
  17. set(STATIC_LIBRARY 1)
  18. endif()
  19. if(LIBS_ONLY_BUILD_SH)
  20. unset(LIBS_ONLY_BUILD_SH CACHE)
  21. set(CC_LIBS_ONLY_BUILD 1)
  22. endif()
  23. if(CC_USES_SYSTEM_ARCH_SH)
  24. if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
  25. set(CC_TARGETS_AMD64_SH 1)
  26. elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
  27. set(CC_TARGETS_ARM_SH 1)
  28. endif()
  29. unset(CC_USES_SYSTEM_ARCH_SH CACHE)
  30. endif()
  31. if(CC_TARGETS_AMD64_SH)
  32. set(CC_TARGETS_AMD64 1)
  33. elseif(CC_TARGETS_ARM_SH)
  34. set(CC_TARGETS_ARM 1)
  35. add_definitions(-D_ARM_=1)
  36. set(CMAKE_SYSTEM_PROCESSOR "armv7l")
  37. elseif(CC_TARGETS_X86_SH)
  38. set(CC_TARGETS_X86 1)
  39. set(CMAKE_SYSTEM_PROCESSOR "i386")
  40. else()
  41. message(FATAL_ERROR "Couldn't detect target processor, try `--arch` argument with build.sh")
  42. endif()
  43. unset(CC_TARGETS_ARM_SH CACHE)
  44. unset(CC_TARGETS_X86_SH CACHE)
  45. unset(CC_TARGETS_AMD64_SH CACHE)
  46. if(ENABLE_VALGRIND_SH)
  47. unset(ENABLE_VALGRIND_SH CACHE)
  48. if(NOT CC_TARGETS_X86)
  49. # Enable Valgrind is not needed for x86 builds. Already <= 32Gb address space
  50. set(ENABLE_VALGRIND 1)
  51. add_definitions(-DENABLE_VALGRIND=1)
  52. endif()
  53. endif()
  54. if(ICU_SETTINGS_RESET)
  55. unset(ICU_SETTINGS_RESET CACHE)
  56. unset(ICU_INCLUDE_PATH CACHE)
  57. unset(ICU_INCLUDE_PATH_SH CACHE)
  58. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  59. unset(NO_ICU_PATH_GIVEN CACHE)
  60. unset(CC_EMBED_ICU_SH CACHE)
  61. endif()
  62. if(CC_TARGET_OS_ANDROID_SH)
  63. set(CC_TARGET_OS_ANDROID 1)
  64. set(CMAKE_SYSTEM_NAME Android)
  65. set(ANDROID_NDK "android-toolchain-arm/")
  66. set(ANDROID_ABI armeabi-v7a)
  67. set(CMAKE_SYSTEM_VERSION 21)
  68. set(CMAKE_ANDROID_ARCH_ABI armeabi)
  69. set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-clang3.8)
  70. set(ANDROID_STL "c++_static")
  71. unset(CC_TARGET_OS_ANDROID_SH CACHE)
  72. elseif(CMAKE_SYSTEM_NAME STREQUAL Linux)
  73. set(CC_TARGET_OS_LINUX 1)
  74. elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  75. set(CC_TARGET_OS_OSX 1)
  76. endif()
  77. if (ENABLE_CC_XPLAT_TRACE_SH)
  78. unset(ENABLE_CC_XPLAT_TRACE_SH CACHE)
  79. set(ENABLE_CC_XPLAT_TRACE 1)
  80. if (CC_TARGET_OS_ANDROID)
  81. add_definitions(-DTRACE_OUTPUT_TO_LOGCAT=1)
  82. else()
  83. add_definitions(-DTRACE_OUTPUT_TARGET_FILE=1)
  84. endif()
  85. add_definitions(-DENABLE_CC_XPLAT_TRACE=1)
  86. add_compile_options(-finstrument-functions)
  87. add_compile_options(-g)
  88. add_compile_options(-ggdb)
  89. if(NOT STATIC_LIBRARY)
  90. message(FATAL_ERROR "Trace option is available only for --static builds")
  91. endif()
  92. endif()
  93. if(CC_EMBED_ICU_SH)
  94. unset(CC_EMBED_ICU_SH CACHE)
  95. set(CC_EMBED_ICU 1)
  96. set(ICU_INCLUDE_PATH "deps/icu/source/output/include/")
  97. endif()
  98. if(ICU_INCLUDE_PATH_SH)
  99. set(ICU_INCLUDE_PATH ${ICU_INCLUDE_PATH_SH})
  100. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  101. unset(NO_ICU_PATH_GIVEN CACHE)
  102. unset(ICU_INCLUDE_PATH_SH CACHE)
  103. endif()
  104. if(NO_ICU_PATH_GIVEN_SH)
  105. set(NO_ICU_PATH_GIVEN ${NO_ICU_PATH_GIVEN_SH})
  106. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  107. unset(ICU_INCLUDE_PATH_SH CACHE)
  108. unset(ICU_INCLUDE_PATH CACHE)
  109. endif()
  110. function(clr_unknown_arch)
  111. message(FATAL_ERROR "Only AMD64, ARM and I386 are supported")
  112. endfunction()
  113. if(ICU_INCLUDE_PATH)
  114. add_definitions(-DHAS_REAL_ICU=1)
  115. set(ICU_CC_PATH "${ICU_INCLUDE_PATH}/../lib/")
  116. find_library(ICUUC icuuc PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  117. find_library(ICU18 icui18n PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  118. if(ICUUC)
  119. message("-- found ICU libs: ${ICU_CC_PATH}")
  120. find_library(ICUDATA icudata PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  121. if (NOT ICUDATA)
  122. set(ICUDATA "")
  123. endif()
  124. set(ICULIB
  125. ${ICUUC}
  126. ${ICU18}
  127. ${ICUDATA}
  128. )
  129. endif()
  130. endif()
  131. set(CLR_CMAKE_PLATFORM_XPLAT 1)
  132. if(CC_TARGETS_AMD64)
  133. add_definitions(-D_M_X64_OR_ARM64)
  134. add_compile_options(-msse4.2)
  135. set(CAN_BUILD_WABT 1)
  136. elseif(CC_TARGETS_X86)
  137. add_definitions(-D__i686__)
  138. add_definitions(-D_M_IX86_OR_ARM32)
  139. add_compile_options(-arch i386)
  140. add_compile_options(-msse3)
  141. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} \
  142. -m32"
  143. )
  144. elseif(CC_TARGETS_ARM)
  145. add_definitions(-D__arm__)
  146. add_definitions(-D_M_IX86_OR_ARM32)
  147. add_definitions(-D_M_ARM32_OR_ARM64)
  148. if(CC_TARGET_OS_OSX)
  149. add_compile_options(-arch arm)
  150. endif()
  151. else()
  152. clr_unknown_arch()
  153. endif()
  154. if(CAN_BUILD_WABT)
  155. add_definitions(-DCAN_BUILD_WABT)
  156. endif()
  157. if(CC_TARGET_OS_LINUX OR CC_TARGET_OS_ANDROID)
  158. if(NOT ICULIB)
  159. if(NOT NO_ICU_PATH_GIVEN)
  160. if(NOT CC_EMBED_ICU)
  161. set(ICULIB "icuuc")
  162. endif()
  163. add_definitions(-DHAS_REAL_ICU=1)
  164. endif()
  165. endif()
  166. set(CLR_CMAKE_PLATFORM_LINUX 1)
  167. # OSX 10.12 Clang deprecates libstdc++ [See GH #1599]
  168. # So, -Werror is linux only for now
  169. # + Android ARM ABI shows ld warnings
  170. # xplat-todo: Do we need this ?
  171. if (NOT CC_TARGET_OS_ANDROID)
  172. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  173. -Werror"
  174. )
  175. endif()
  176. elseif(CC_TARGET_OS_OSX)
  177. add_definitions(
  178. -DPLATFORM_UNIX
  179. )
  180. # in case ICU path was given but it doesn't exist, build script will fail.
  181. # so, fallback only if ICU path wasn't given
  182. if(NOT ICU_INCLUDE_PATH)
  183. set(NO_ICU_PATH_GIVEN 1)
  184. message("-- Couldn't find ICU. Falling back to --no-icu build")
  185. endif()
  186. if(NOT CC_XCODE_PROJECT)
  187. set(OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET} CC")
  188. if (${OSX_DEPLOYMENT_TARGET} STREQUAL " CC")
  189. set(OSX_DEPLOYMENT_TARGET "10.9")
  190. add_compile_options(-mmacosx-version-min=10.9)
  191. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  192. -mmacosx-version-min=10.9 -std=gnu99")
  193. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  194. -mmacosx-version-min=10.9 -std=gnu++11")
  195. else()
  196. set(OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET}")
  197. message(WARNING "-- !! macOS Deployment Target was set to $ENV{MACOSX_DEPLOYMENT_TARGET}. Using it as is.")
  198. endif()
  199. endif()
  200. else()
  201. message(FATAL_ERROR "This OS is not supported")
  202. endif()
  203. if (CMAKE_CXX_COMPILER_ID STREQUAL AppleClang
  204. OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
  205. OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
  206. # Color diagnostics for g++ and clang++
  207. add_definitions("-fdiagnostics-color=always")
  208. endif()
  209. if(STATIC_LIBRARY)
  210. add_definitions(-DCHAKRA_STATIC_LIBRARY=1)
  211. endif()
  212. if(CLR_CMAKE_PLATFORM_XPLAT)
  213. add_definitions(-D_CHAKRACOREBUILD)
  214. add_definitions(-DFEATURE_PAL)
  215. add_definitions(-DPLATFORM_UNIX=1)
  216. if(CLR_CMAKE_PLATFORM_LINUX)
  217. add_definitions(-D__LINUX__=1)
  218. if(CC_TARGETS_AMD64)
  219. add_definitions(-DLINUX64)
  220. endif(CC_TARGETS_AMD64)
  221. endif(CLR_CMAKE_PLATFORM_LINUX)
  222. if(CC_TARGETS_AMD64)
  223. set(IS_64BIT_BUILD 1)
  224. add_definitions(-D_M_X64 -D_M_AMD64 -D_AMD64_)
  225. endif(CC_TARGETS_AMD64)
  226. add_definitions(
  227. -DUNICODE
  228. -D_SAFECRT_USE_CPP_OVERLOADS=1
  229. -D__STDC_WANT_LIB_EXT1__=1
  230. )
  231. set(CMAKE_CXX_STANDARD 11)
  232. # CC WARNING FLAGS
  233. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  234. -Wno-implicit-function-declaration"
  235. )
  236. # todo: fix general visibility of the interface
  237. # do not set to `fvisibility=hidden` as it is going to
  238. # prevent the required interface is being exported
  239. # clang by default sets fvisibility=default
  240. # CXX WARNING FLAGS
  241. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  242. -Wno-ignored-attributes\
  243. -Wno-deprecated-declarations\
  244. -Wno-parentheses-equality\
  245. -Wno-missing-braces\
  246. -Wno-reorder\
  247. -Wno-microsoft\
  248. -Wno-unused-value\
  249. -Wno-int-to-void-pointer-cast\
  250. -Wno-invalid-offsetof\
  251. -Wno-undefined-inline\
  252. -Wno-inconsistent-missing-override\
  253. -Wno-c++14-extensions\
  254. -Wno-macro-redefined\
  255. -Wno-pragmas\
  256. -Wno-invalid-token-paste\
  257. -Wno-format\
  258. -Wno-invalid-noreturn\
  259. -Wno-null-arithmetic\
  260. -Wno-tautological-constant-out-of-range-compare\
  261. -Wno-tautological-undefined-compare\
  262. -Wno-address-of-temporary\
  263. -Wno-null-conversion\
  264. -Wno-return-type\
  265. -Wno-switch\
  266. -Wno-implicit-function-declaration\
  267. -Wno-int-to-pointer-cast"
  268. )
  269. # notes..
  270. # -Wno-address-of-temporary # vtinfo.h, VirtualTableInfo<T>::RegisterVirtualTable
  271. # -Wno-null-conversion # Check shmemory.cpp and cs.cpp here...
  272. # -Wno-return-type # switch unreachable code
  273. # -Wno-switch # switch values not handled
  274. include(Build/CMakeFeatureDetect.cmake)
  275. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  276. ${CXX_DO_NOT_OPTIMIZE_SIBLING_CALLS} \
  277. -fno-omit-frame-pointer \
  278. -fdelayed-template-parsing"
  279. )
  280. # CXX / CC COMPILER FLAGS
  281. add_compile_options(
  282. -fasm-blocks
  283. -fms-extensions
  284. -fwrapv # Treat signed integer overflow as two's complement
  285. )
  286. # Clang -fsanitize.
  287. if (CLANG_SANITIZE_SH)
  288. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  289. set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  290. unset(CLANG_SANITIZE_SH CACHE) # don't cache
  291. endif()
  292. endif(CLR_CMAKE_PLATFORM_XPLAT)
  293. if (ENABLE_FULL_LTO_SH OR ENABLE_THIN_LTO_SH)
  294. if (CC_TARGET_OS_LINUX)
  295. set(CC_LTO_ENABLED -use-gold-plugin)
  296. set(CC_LTO_ENABLED_C -c)
  297. endif()
  298. if (ENABLE_FULL_LTO_SH)
  299. unset(DENABLE_FULL_LTO_SH CACHE)
  300. add_compile_options(-flto ${CC_LTO_ENABLED_C})
  301. if (CC_LTO_ENABLED)
  302. set(CC_LTO_ENABLED "${CC_LTO_ENABLED} -flto")
  303. endif()
  304. elseif (ENABLE_THIN_LTO_SH)
  305. unset(ENABLE_THIN_LTO_SH CACHE)
  306. add_compile_options(-flto=thin)
  307. if (CC_LTO_ENABLED)
  308. set(CC_LTO_ENABLED "${CC_LTO_ENABLED} -flto=thin")
  309. endif()
  310. endif()
  311. endif()
  312. if(CMAKE_BUILD_TYPE STREQUAL Debug)
  313. add_definitions(
  314. -DDBG=1
  315. -DDEBUG=1
  316. -D_DEBUG=1 # for PAL
  317. -DDBG_DUMP=1
  318. )
  319. elseif(CMAKE_BUILD_TYPE STREQUAL Test)
  320. add_definitions(
  321. -DENABLE_DEBUG_CONFIG_OPTIONS=1
  322. )
  323. endif(CMAKE_BUILD_TYPE STREQUAL Debug)
  324. if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  325. add_compile_options(-O3)
  326. else()
  327. add_compile_options(-O0)
  328. endif(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  329. if(IS_64BIT_BUILD)
  330. add_definitions(
  331. -DBIT64=1
  332. -DSTACK_ALIGN=16
  333. )
  334. endif(IS_64BIT_BUILD)
  335. if(NO_JIT_SH)
  336. unset(NO_JIT_SH CACHE) # don't cache
  337. unset(BuildJIT CACHE) # also clear it just in case
  338. add_definitions(-DDISABLE_JIT=1)
  339. else()
  340. set(BuildJIT 1)
  341. endif()
  342. if(WITHOUT_FEATURES_SH)
  343. unset(WITHOUT_FEATURES_SH CACHE) # don't cache
  344. add_definitions(${WITHOUT_FEATURES_SH})
  345. endif(WITHOUT_FEATURES_SH)
  346. enable_language(ASM)
  347. if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  348. set(DYN_LIB_EXT "dylib")
  349. else()
  350. set(DYN_LIB_EXT "so")
  351. endif()
  352. ################# Write-barrier check/analyze ##################
  353. if (WB_CHECK_SH OR WB_ANALYZE_SH)
  354. add_definitions(
  355. -Xclang -load
  356. -Xclang ${CMAKE_CURRENT_SOURCE_DIR}/tools/RecyclerChecker/Build/libclangRecyclerChecker.${DYN_LIB_EXT}
  357. )
  358. endif()
  359. if (WB_CHECK_SH)
  360. unset(WB_CHECK_SH CACHE) # don't cache
  361. add_definitions(
  362. -Xclang -add-plugin
  363. -Xclang check-recycler
  364. )
  365. endif()
  366. if (WB_ANALYZE_SH)
  367. unset(WB_ANALYZE_SH CACHE) # don't cache
  368. add_definitions(
  369. -Xclang -analyze
  370. -Xclang -analyzer-checker=chakra.RecyclerChecker
  371. )
  372. endif()
  373. if (WB_ARGS_SH)
  374. foreach(wb_arg IN LISTS WB_ARGS_SH)
  375. add_definitions(
  376. -Xclang -plugin-arg-check-recycler
  377. -Xclang ${wb_arg}
  378. )
  379. endforeach(wb_arg)
  380. unset(WB_ARGS_SH CACHE) # don't cache
  381. endif()
  382. include_directories(
  383. .
  384. lib/Common
  385. lib/Common/PlaceHolder
  386. pal
  387. pal/inc
  388. pal/inc/rt
  389. ${ICU_INCLUDE_PATH}
  390. )
  391. if(ICU_INCLUDE_PATH)
  392. if(NOT HAVE_LIBICU_UCHAR_H)
  393. set(HAVE_LIBICU_UCHAR_H "1")
  394. endif()
  395. endif()
  396. add_subdirectory (pal)
  397. # build the rest with NO_PAL_MINMAX and PAL_STDCPP_COMPAT
  398. add_definitions(
  399. -DNO_PAL_MINMAX
  400. -DPAL_STDCPP_COMPAT
  401. )
  402. add_subdirectory (lib)
  403. add_subdirectory (bin)