CMakeLists.txt 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. cmake_minimum_required(VERSION 3.2)
  2. project (CHAKRACORE)
  3. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g")
  4. # Disable expected CMake workflow
  5. option(CHAKRACORE_BUILD_SH "Use build.sh")
  6. if(NOT CHAKRACORE_BUILD_SH)
  7. option(INTL_ICU "Enable Intl" ON)
  8. option(EMBED_ICU "Build ICU within ChakraCore build" OFF)
  9. set(ICU_INCLUDE_PATH "" CACHE STRING "libicu iclude path")
  10. else(NOT CHAKRACORE_BUILD_SH)
  11. # Keep CMake from caching static/shared library
  12. # option. Otherwise, CMake fails to update cached
  13. # references
  14. # todo: create a sub cmake file to take care of _SH uncaching...
  15. if(SHARED_LIBRARY_SH)
  16. unset(SHARED_LIBRARY_SH CACHE)
  17. unset(STATIC_LIBRARY_SH CACHE)
  18. unset(STATIC_LIBRARY CACHE)
  19. set(SHARED_LIBRARY 1)
  20. endif()
  21. if(STATIC_LIBRARY_SH)
  22. unset(SHARED_LIBRARY_SH CACHE)
  23. unset(STATIC_LIBRARY_SH CACHE)
  24. unset(SHARED_LIBRARY CACHE)
  25. set(STATIC_LIBRARY 1)
  26. endif()
  27. if(LIBS_ONLY_BUILD_SH)
  28. unset(LIBS_ONLY_BUILD_SH CACHE)
  29. set(CC_LIBS_ONLY_BUILD 1)
  30. endif()
  31. endif(NOT CHAKRACORE_BUILD_SH)
  32. if(CC_USES_SYSTEM_ARCH_SH OR NOT CHAKRACORE_BUILD_SH)
  33. if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
  34. set(CC_TARGETS_AMD64_SH 1)
  35. elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
  36. set(CC_TARGETS_ARM_SH 1)
  37. endif()
  38. unset(CC_USES_SYSTEM_ARCH_SH CACHE)
  39. endif()
  40. if(CC_TARGETS_AMD64_SH)
  41. set(CC_TARGETS_AMD64 1)
  42. elseif(CC_TARGETS_ARM_SH)
  43. set(CC_TARGETS_ARM 1)
  44. add_definitions(-D_ARM_=1)
  45. set(CMAKE_SYSTEM_PROCESSOR "armv7l")
  46. elseif(CC_TARGETS_X86_SH)
  47. set(CC_TARGETS_X86 1)
  48. set(CMAKE_SYSTEM_PROCESSOR "i386")
  49. else()
  50. message(FATAL_ERROR "Unsupported target processor: ${CMAKE_SYSTEM_PROCESSOR}")
  51. endif()
  52. unset(CC_TARGETS_ARM_SH CACHE)
  53. unset(CC_TARGETS_X86_SH CACHE)
  54. unset(CC_TARGETS_AMD64_SH CACHE)
  55. if(CCACHE_PROGRAM_NAME_SH)
  56. find_program(CCACHE_PROGRAM ${CCACHE_PROGRAM_NAME_SH})
  57. if (CCACHE_PROGRAM)
  58. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
  59. set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
  60. endif()
  61. unset(CCACHE_PROGRAM_NAME_SH CACHE)
  62. endif()
  63. if(ENABLE_VALGRIND_SH)
  64. unset(ENABLE_VALGRIND_SH CACHE)
  65. if(NOT CC_TARGETS_X86)
  66. # Enable Valgrind is not needed for x86 builds. Already <= 32Gb address space
  67. set(ENABLE_VALGRIND 1)
  68. add_definitions(-DENABLE_VALGRIND=1)
  69. endif()
  70. endif()
  71. if(ICU_SETTINGS_RESET)
  72. unset(ICU_SETTINGS_RESET CACHE)
  73. unset(ICU_INCLUDE_PATH_SH CACHE)
  74. unset(NO_ICU_SH CACHE)
  75. unset(LOCAL_ICU_SH CACHE)
  76. unset(SYSTEM_ICU_SH CACHE)
  77. unset(EMBED_ICU_SH CACHE)
  78. endif()
  79. if(CC_TARGET_OS_ANDROID_SH)
  80. set(CC_TARGET_OS_ANDROID 1)
  81. set(CMAKE_SYSTEM_NAME Android)
  82. set(ANDROID_NDK "android-toolchain-arm/")
  83. set(ANDROID_ABI armeabi-v7a)
  84. set(CMAKE_SYSTEM_VERSION 21)
  85. set(CMAKE_ANDROID_ARCH_ABI armeabi)
  86. set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-clang3.8)
  87. set(ANDROID_STL "c++_static")
  88. unset(CC_TARGET_OS_ANDROID_SH CACHE)
  89. elseif(CMAKE_SYSTEM_NAME STREQUAL Linux)
  90. set(CC_TARGET_OS_LINUX 1)
  91. elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  92. set(CC_TARGET_OS_OSX 1)
  93. endif()
  94. if (ENABLE_CC_XPLAT_TRACE_SH)
  95. unset(ENABLE_CC_XPLAT_TRACE_SH CACHE)
  96. set(ENABLE_CC_XPLAT_TRACE 1)
  97. if (CC_TARGET_OS_ANDROID)
  98. add_definitions(-DTRACE_OUTPUT_TO_LOGCAT=1)
  99. else()
  100. add_definitions(-DTRACE_OUTPUT_TARGET_FILE=1)
  101. endif()
  102. add_definitions(-DENABLE_CC_XPLAT_TRACE=1)
  103. add_compile_options(-finstrument-functions)
  104. add_compile_options(-g)
  105. add_compile_options(-ggdb)
  106. if(NOT STATIC_LIBRARY)
  107. message(FATAL_ERROR "Trace option is available only for --static builds")
  108. endif()
  109. endif()
  110. if(ICU_INCLUDE_PATH_SH)
  111. set(ICU_INCLUDE_PATH ${ICU_INCLUDE_PATH_SH})
  112. unset(ICU_INCLUDE_PATH_SH CACHE)
  113. endif()
  114. if(NO_ICU_SH)
  115. set(NO_ICU 1)
  116. unset(NO_ICU_SH CACHE)
  117. endif()
  118. if(SYSTEM_ICU_SH)
  119. set(SYSTEM_ICU 1)
  120. unset(SYSTEM_ICU_SH CACHE)
  121. endif()
  122. if(CHAKRACORE_BUILD_SH)
  123. if(INTL_ICU_SH)
  124. unset(INTL_ICU_SH CACHE)
  125. set(INTL_ICU 1)
  126. else()
  127. unset(INTL_ICU_SH CACHE)
  128. set(INTL_ICU 0)
  129. endif()
  130. endif(CHAKRACORE_BUILD_SH)
  131. if(EMBED_ICU_SH)
  132. set(EMBED_ICU 1)
  133. unset(EMBED_ICU_SH CACHE)
  134. endif()
  135. if(EMBED_ICU AND ICU_INCLUDE_PATH)
  136. message(FATAL_ERROR "Embedded ICU and ICU include path cannot be set at the same time")
  137. endif()
  138. if(EMBED_ICU)
  139. # Keep consistent with what ICU download script used to print
  140. message("Note: ICU installation and use is subject to it's publisher's licensing terms")
  141. set(ICU_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/deps/thirdparty/icu)
  142. set(ICU_DOWNLOAD_DIR ${ICU_PREFIX}/download)
  143. set(ICU_SOURCE_DIR ${ICU_PREFIX}/stage)
  144. set(EMBEDDED_ICU_TARGET icu4c)
  145. set(ICU_INCLUDE_PATH ${ICU_PREFIX}/include)
  146. set(ICU_LIBRARY_PATH ${ICU_PREFIX}/lib)
  147. add_definitions(-DHAS_REAL_ICU=1)
  148. add_definitions(-DHAS_ICU)
  149. add_definitions(-DINTL_ICU=1)
  150. set(ICU_LIBRARIES
  151. ${ICU_LIBRARY_PATH}/libicuuc.a
  152. ${ICU_LIBRARY_PATH}/libicui18n.a
  153. ${ICU_LIBRARY_PATH}/libicudata.a
  154. )
  155. include(ExternalProject)
  156. ExternalProject_Add(${EMBEDDED_ICU_TARGET}
  157. PREFIX ${ICU_PREFIX}
  158. DOWNLOAD_DIR ${ICU_DOWNLOAD_DIR}
  159. SOURCE_DIR ${ICU_SOURCE_DIR}
  160. URL https://github.com/unicode-org/icu/releases/download/release-63-2/icu4c-63_2-src.tgz
  161. URL_HASH SHA512=5fa9092efd8d6da6dfc8d498e4026167fda43423eaafc754d1789cf8fd4f6e76377878ebcaa32e14f314836136b764873511a93bfbcc5419b758841cc6df8f32
  162. CONFIGURE_COMMAND ${ICU_SOURCE_DIR}/source/configure --prefix=${ICU_PREFIX} --with-data-packaging=static --enable-static --disable-shared --with-library-bits=64 --disable-icuio --disable-layout --disable-tests --disable-samples
  163. BUILD_COMMAND make STATICCFLAGS="-fPIC" STATICCXXFLAGS="-fPIC" STATICCPPFLAGS="-DPIC"
  164. INSTALL_COMMAND make install
  165. BYPRODUCTS ${ICU_LIBRARIES}
  166. )
  167. elseif(ICU_INCLUDE_PATH)
  168. add_definitions(-DHAS_REAL_ICU=1)
  169. add_definitions(-DHAS_ICU)
  170. set(ICU_LIBRARY_PATH "${ICU_INCLUDE_PATH}/../lib/")
  171. find_library(ICUUC icuuc PATHS ${ICU_LIBRARY_PATH} NO_DEFAULT_PATH)
  172. if(INTL_ICU)
  173. add_definitions(-DINTL_ICU=1)
  174. find_library(ICUIN icui18n PATHS ${ICU_LIBRARY_PATH} NO_DEFAULT_PATH)
  175. # In a default install, ICU header files are all in ICU_ROOT/include
  176. # However, for Node, the include/ folder is never generated, so we have to look
  177. # in NODE/deps/icu/source/{common|i18n} for headers
  178. set(ICU_INCLUDE_PATH
  179. "${ICU_INCLUDE_PATH}"
  180. "${ICU_INCLUDE_PATH}/../i18n/"
  181. )
  182. endif()
  183. if(ICUUC)
  184. message("-- found ICU libs: ${ICU_LIBRARY_PATH}")
  185. find_library(ICUDATA icudata PATHS ${ICU_LIBRARY_PATH} NO_DEFAULT_PATH)
  186. if (NOT ICUDATA)
  187. set(ICUDATA "")
  188. endif()
  189. set(ICU_LIBRARIES
  190. ${ICUUC}
  191. ${ICUIN}
  192. ${ICUDATA}
  193. )
  194. endif()
  195. endif()
  196. if(CC_TARGET_OS_LINUX OR CC_TARGET_OS_ANDROID)
  197. if(SYSTEM_ICU OR (NOT ICU_INCLUDE_PATH AND NOT NO_ICU))
  198. set(ICU_LIBRARIES "icuuc")
  199. if(INTL_ICU)
  200. add_definitions(-DINTL_ICU=1)
  201. set(ICU_LIBRARIES
  202. ${ICU_LIBRARIES}
  203. icui18n
  204. )
  205. endif()
  206. add_definitions(-DHAS_REAL_ICU=1)
  207. add_definitions(-DHAS_ICU)
  208. endif()
  209. elseif(CC_TARGET_OS_OSX)
  210. # in case ICU path was given but it doesn't exist, build script will fail.
  211. # so, fallback only if ICU path wasn't given
  212. if(NOT ICU_INCLUDE_PATH)
  213. set(NO_ICU 1)
  214. message("-- Couldn't find ICU. Falling back to --no-icu build")
  215. endif()
  216. endif()
  217. set(CLR_CMAKE_PLATFORM_XPLAT 1)
  218. if(CC_TARGETS_AMD64)
  219. add_definitions(-DTARGET_64)
  220. add_compile_options(-msse4.2)
  221. if(NOT CMAKE_BUILD_TYPE STREQUAL Release)
  222. set(CAN_BUILD_WABT 1)
  223. endif()
  224. elseif(CC_TARGETS_X86)
  225. add_definitions(-D__i686__)
  226. add_definitions(-DTARGET_32)
  227. add_compile_options(-arch i386)
  228. add_compile_options(-msse3)
  229. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} \
  230. -m32"
  231. )
  232. elseif(CC_TARGETS_ARM)
  233. add_definitions(-D__arm__)
  234. add_definitions(-DTARGET_32)
  235. add_definitions(-D_M_ARM32_OR_ARM64)
  236. if(CC_TARGET_OS_OSX)
  237. add_compile_options(-arch arm)
  238. elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  239. # reduce link time memory usage
  240. set(LINKER_REDUCED_MEMORY "-Xlinker --no-keep-memory")
  241. endif()
  242. else()
  243. message(FATAL_ERROR "Only AMD64, ARM and I386 are supported")
  244. endif()
  245. if(CAN_BUILD_WABT)
  246. add_definitions(-DCAN_BUILD_WABT)
  247. endif()
  248. if(CC_TARGET_OS_LINUX OR CC_TARGET_OS_ANDROID)
  249. set(CLR_CMAKE_PLATFORM_LINUX 1)
  250. # OSX 10.12 Clang deprecates libstdc++ [See GH #1599]
  251. # So, -Werror is linux only for now
  252. # + Android ARM ABI shows ld warnings
  253. # xplat-todo: Do we need this ?
  254. if (NOT CC_TARGET_OS_ANDROID)
  255. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  256. -Werror"
  257. )
  258. endif()
  259. elseif(CC_TARGET_OS_OSX)
  260. add_definitions(
  261. -DPLATFORM_UNIX
  262. )
  263. if(NOT CC_XCODE_PROJECT)
  264. set(OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET} CC")
  265. if (${OSX_DEPLOYMENT_TARGET} STREQUAL " CC")
  266. set(OSX_DEPLOYMENT_TARGET "10.9")
  267. add_compile_options(-mmacosx-version-min=10.9)
  268. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  269. -mmacosx-version-min=10.9 -std=gnu99")
  270. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  271. -mmacosx-version-min=10.9 -std=gnu++11")
  272. else()
  273. set(OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET}")
  274. message(WARNING "-- !! macOS Deployment Target was set to $ENV{MACOSX_DEPLOYMENT_TARGET}. Using it as is.")
  275. endif()
  276. endif()
  277. else()
  278. message(FATAL_ERROR "Unsupported OS: ${CMAKE_SYSTEM_NAME}")
  279. endif()
  280. if (CMAKE_CXX_COMPILER_ID STREQUAL AppleClang
  281. OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
  282. OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
  283. # Color diagnostics for g++ and clang++
  284. add_definitions("-fdiagnostics-color=always")
  285. endif()
  286. if(STATIC_LIBRARY)
  287. add_definitions(-DCHAKRA_STATIC_LIBRARY=1)
  288. endif()
  289. if(CLR_CMAKE_PLATFORM_XPLAT)
  290. add_definitions(-D_CHAKRACOREBUILD)
  291. add_definitions(-DFEATURE_PAL)
  292. add_definitions(-DPLATFORM_UNIX=1)
  293. if(CLR_CMAKE_PLATFORM_LINUX)
  294. add_definitions(-D__LINUX__=1)
  295. if(CC_TARGETS_AMD64)
  296. add_definitions(-DLINUX64)
  297. endif(CC_TARGETS_AMD64)
  298. endif(CLR_CMAKE_PLATFORM_LINUX)
  299. if(CC_TARGETS_AMD64)
  300. set(IS_64BIT_BUILD 1)
  301. add_definitions(-D_M_X64 -D_M_AMD64 -D_AMD64_)
  302. endif(CC_TARGETS_AMD64)
  303. add_definitions(
  304. -DUNICODE
  305. -D_SAFECRT_USE_CPP_OVERLOADS=1
  306. -D__STDC_WANT_LIB_EXT1__=1
  307. )
  308. set(CMAKE_CXX_STANDARD 11)
  309. # todo: fix general visibility of the interface
  310. # do not set to `fvisibility=hidden` as it is going to
  311. # prevent the required interface is being exported
  312. # clang by default sets fvisibility=default
  313. # CXX WARNING FLAGS
  314. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  315. -Wno-ignored-attributes\
  316. -Wno-parentheses-equality\
  317. -Wno-reorder\
  318. -Wno-microsoft\
  319. -Wno-unused-value\
  320. -Wno-int-to-void-pointer-cast\
  321. -Wno-invalid-offsetof\
  322. -Wno-undefined-inline\
  323. -Wno-inconsistent-missing-override\
  324. -Wno-c++14-extensions\
  325. -Wno-macro-redefined\
  326. -Wno-pragmas\
  327. -Wno-invalid-token-paste\
  328. -Wno-format\
  329. -Wno-invalid-noreturn\
  330. -Wno-null-arithmetic\
  331. -Wno-tautological-constant-out-of-range-compare\
  332. -Wno-tautological-undefined-compare\
  333. -Wno-address-of-temporary\
  334. -Wno-null-conversion\
  335. -Wno-return-type\
  336. -Wno-switch\
  337. -Wno-int-to-pointer-cast\
  338. -Wno-tautological-constant-compare\
  339. -Wno-enum-compare-switch\
  340. -Wno-unknown-warning-option"
  341. )
  342. # notes..
  343. # -Wno-address-of-temporary # vtinfo.h, VirtualTableInfo<T>::RegisterVirtualTable
  344. # -Wno-null-conversion # Check shmemory.cpp and cs.cpp here...
  345. # -Wno-return-type # switch unreachable code
  346. # -Wno-switch # switch values not handled
  347. # -W-enum-compare-switch # throws warning on enum1 == enum2 where both
  348. # enums represent same value but do not share the type. ie. we use both AsmJsType
  349. # and AsmJsRetType interchangably and filter things out by `default:` case.
  350. # -W-tautological-constant-compare throws warning for checks known at compile time.
  351. # Some of those checks are optimized out during compile / lto time, and others
  352. # are platform / compiler dependent.
  353. # -Wno-unknown-warning-option ... well, some of the new switches are not
  354. # recognized by older compilers and they fail. So, put this one and not fail
  355. include(Build/CMakeFeatureDetect.cmake)
  356. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  357. ${CXX_DO_NOT_OPTIMIZE_SIBLING_CALLS} \
  358. -fno-omit-frame-pointer \
  359. -fdelayed-template-parsing"
  360. )
  361. # CXX / CC COMPILER FLAGS
  362. add_compile_options(
  363. -fasm-blocks
  364. -fms-extensions
  365. -fwrapv # Treat signed integer overflow as two's complement
  366. )
  367. # Only disable RTTI in release builds so that TrackAlloc works for debug and test builds
  368. # Also disable RTTI when building a shared library
  369. # TODO: why does the shared library break with rtti disabled?
  370. if(CMAKE_BUILD_TYPE STREQUAL Release)
  371. if(STATIC_LIBRARY)
  372. add_compile_options(-fno-rtti)
  373. endif()
  374. endif()
  375. endif(CLR_CMAKE_PLATFORM_XPLAT)
  376. if (ENABLE_FULL_LTO_SH OR ENABLE_THIN_LTO_SH)
  377. if (CC_TARGET_OS_LINUX)
  378. set(CC_LTO_ENABLED -use-gold-plugin)
  379. set(CC_LTO_ENABLED_C -c)
  380. endif()
  381. if (ENABLE_FULL_LTO_SH)
  382. unset(DENABLE_FULL_LTO_SH CACHE)
  383. add_compile_options(-flto ${CC_LTO_ENABLED_C})
  384. if (CC_LTO_ENABLED)
  385. set(CC_LTO_ENABLED "${CC_LTO_ENABLED} -flto")
  386. endif()
  387. elseif (ENABLE_THIN_LTO_SH)
  388. unset(ENABLE_THIN_LTO_SH CACHE)
  389. add_compile_options(-flto=thin)
  390. if (CC_LTO_ENABLED)
  391. set(CC_LTO_ENABLED "${CC_LTO_ENABLED} -flto=thin")
  392. endif()
  393. endif()
  394. endif()
  395. if(CMAKE_BUILD_TYPE STREQUAL Debug)
  396. add_definitions(
  397. -DDBG=1
  398. -DDEBUG=1
  399. -D_DEBUG=1 # for PAL
  400. -DDBG_DUMP=1
  401. )
  402. elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
  403. add_definitions(
  404. -DENABLE_DEBUG_CONFIG_OPTIONS=1
  405. )
  406. endif(CMAKE_BUILD_TYPE STREQUAL Debug)
  407. if(IS_64BIT_BUILD)
  408. add_definitions(
  409. -DBIT64=1
  410. -DSTACK_ALIGN=16
  411. )
  412. endif(IS_64BIT_BUILD)
  413. if(NO_JIT_SH)
  414. unset(NO_JIT_SH CACHE) # don't cache
  415. unset(BuildJIT CACHE) # also clear it just in case
  416. add_definitions(-DDISABLE_JIT=1)
  417. elseif(DISABLE_JIT)
  418. set(BuildJIT 0)
  419. add_definitions(-DDISABLE_JIT=1)
  420. else()
  421. set(BuildJIT 1)
  422. endif()
  423. if(WITHOUT_FEATURES_SH)
  424. add_definitions(${WITHOUT_FEATURES_SH})
  425. unset(WITHOUT_FEATURES_SH CACHE) # don't cache
  426. endif(WITHOUT_FEATURES_SH)
  427. if(EXTRA_DEFINES_SH)
  428. add_definitions(${EXTRA_DEFINES_SH})
  429. unset(EXTRA_DEFINES_SH CACHE) #don't cache
  430. endif(EXTRA_DEFINES_SH)
  431. enable_language(ASM)
  432. if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  433. set(DYN_LIB_EXT "dylib")
  434. else()
  435. set(DYN_LIB_EXT "so")
  436. endif()
  437. ################# Write-barrier check/analyze ##################
  438. if (WB_CHECK_SH OR WB_ANALYZE_SH)
  439. add_definitions(
  440. -Xclang -load
  441. -Xclang ${CMAKE_CURRENT_SOURCE_DIR}/tools/RecyclerChecker/Build/libclangRecyclerChecker.${DYN_LIB_EXT}
  442. )
  443. endif()
  444. if (WB_CHECK_SH)
  445. unset(WB_CHECK_SH CACHE) # don't cache
  446. add_definitions(
  447. -Xclang -add-plugin
  448. -Xclang check-recycler
  449. )
  450. endif()
  451. if (WB_ANALYZE_SH)
  452. unset(WB_ANALYZE_SH CACHE) # don't cache
  453. add_definitions(
  454. -Xclang -analyze
  455. -Xclang -analyzer-checker=chakra.RecyclerChecker
  456. )
  457. endif()
  458. if (WB_ARGS_SH)
  459. foreach(wb_arg IN LISTS WB_ARGS_SH)
  460. add_definitions(
  461. -Xclang -plugin-arg-check-recycler
  462. -Xclang ${wb_arg}
  463. )
  464. endforeach(wb_arg)
  465. unset(WB_ARGS_SH CACHE) # don't cache
  466. endif()
  467. include_directories(
  468. .
  469. lib/Common
  470. lib/Common/PlaceHolder
  471. pal
  472. pal/inc
  473. pal/inc/rt
  474. ${ICU_INCLUDE_PATH}
  475. )
  476. if(ICU_INCLUDE_PATH)
  477. if(NOT HAVE_LIBICU_UCHAR_H)
  478. set(HAVE_LIBICU_UCHAR_H 1)
  479. endif()
  480. endif()
  481. # detect features
  482. include_directories(SYSTEM /usr/local/include)
  483. include(pal/src/configure.cmake)
  484. # this should be after `detect feature` to not to affect feature detection
  485. # Clang -fsanitize.
  486. if (CLANG_SANITIZE_SH)
  487. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  488. set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  489. unset(CLANG_SANITIZE_SH CACHE) # don't cache
  490. endif()
  491. add_subdirectory (pal)
  492. # build the rest with NO_PAL_MINMAX and PAL_STDCPP_COMPAT
  493. add_definitions(
  494. -DNO_PAL_MINMAX
  495. -DPAL_STDCPP_COMPAT
  496. )
  497. if (ENABLE_JS_LTTNG_SH)
  498. unset(ENABLE_JS_LTTNG_SH CACHE)
  499. include_directories (
  500. ${CMAKE_CURRENT_SOURCE_DIR}/out/lttng
  501. )
  502. add_subdirectory ($ENV{TARGET_PATH}/lttng ${CMAKE_CURRENT_BINARY_DIR}/lttng)
  503. add_definitions(
  504. -DENABLE_JS_ETW
  505. -DENABLE_JS_LTTNG
  506. )
  507. set(USE_LTTNG "1")
  508. endif()
  509. add_subdirectory (lib)
  510. add_subdirectory (bin)
  511. add_subdirectory(test)