CMakeLists.txt 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. if(SHARED_LIBRARY_SH)
  7. unset(SHARED_LIBRARY_SH CACHE)
  8. unset(STATIC_LIBRARY_SH CACHE)
  9. unset(STATIC_LIBRARY CACHE)
  10. set(SHARED_LIBRARY 1)
  11. endif()
  12. if(STATIC_LIBRARY_SH)
  13. unset(SHARED_LIBRARY_SH CACHE)
  14. unset(STATIC_LIBRARY_SH CACHE)
  15. unset(SHARED_LIBRARY CACHE)
  16. set(STATIC_LIBRARY 1)
  17. endif()
  18. if(CC_TARGETS_AMD64_SH)
  19. set(CC_TARGETS_AMD64 1)
  20. endif()
  21. if(CC_TARGETS_X86_SH)
  22. set(CC_TARGETS_X86 1)
  23. set(CMAKE_SYSTEM_PROCESSOR "i386")
  24. endif()
  25. if(CC_TARGETS_ARM_SH)
  26. set(CC_TARGETS_ARM 1)
  27. add_definitions(-D_ARM_=1)
  28. set(CMAKE_SYSTEM_PROCESSOR "armv7l")
  29. endif()
  30. unset(CC_TARGETS_ARM_SH CACHE)
  31. unset(CC_TARGETS_X86_SH CACHE)
  32. unset(CC_TARGETS_AMD64_SH CACHE)
  33. if(ICU_SETTINGS_RESET)
  34. unset(ICU_SETTINGS_RESET CACHE)
  35. unset(ICU_INCLUDE_PATH CACHE)
  36. unset(ICU_INCLUDE_PATH_SH CACHE)
  37. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  38. unset(NO_ICU_PATH_GIVEN CACHE)
  39. unset(CC_EMBED_ICU_SH CACHE)
  40. endif()
  41. if(CC_TARGET_OS_ANDROID_SH)
  42. set(CC_TARGET_OS_ANDROID 1)
  43. set(CMAKE_SYSTEM_NAME Android)
  44. set(ANDROID_NDK "android-toolchain-arm/")
  45. set(ANDROID_ABI armeabi-v7a)
  46. set(CMAKE_SYSTEM_VERSION 21)
  47. set(CMAKE_ANDROID_ARCH_ABI armeabi)
  48. set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-clang3.8)
  49. set(ANDROID_STL "c++_static")
  50. unset(CC_TARGET_OS_ANDROID_SH CACHE)
  51. elseif(CMAKE_SYSTEM_NAME STREQUAL Linux)
  52. set(CC_TARGET_OS_LINUX 1)
  53. elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
  54. set(CC_TARGET_OS_OSX 1)
  55. endif()
  56. if(CC_EMBED_ICU_SH)
  57. unset(CC_EMBED_ICU_SH CACHE)
  58. set(CC_EMBED_ICU 1)
  59. set(ICU_INCLUDE_PATH "deps/icu/source/output/include/")
  60. add_definitions(-DU_STATIC_IMPLEMENTATION)
  61. endif()
  62. if(ICU_INCLUDE_PATH_SH)
  63. set(ICU_INCLUDE_PATH ${ICU_INCLUDE_PATH_SH})
  64. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  65. unset(NO_ICU_PATH_GIVEN CACHE)
  66. unset(ICU_INCLUDE_PATH_SH CACHE)
  67. endif()
  68. if(NO_ICU_PATH_GIVEN_SH)
  69. set(NO_ICU_PATH_GIVEN ${NO_ICU_PATH_GIVEN_SH})
  70. unset(NO_ICU_PATH_GIVEN_SH CACHE)
  71. unset(ICU_INCLUDE_PATH_SH CACHE)
  72. unset(ICU_INCLUDE_PATH CACHE)
  73. endif()
  74. function(clr_unknown_arch)
  75. message(FATAL_ERROR "Only AMD64, ARM and I386 are supported")
  76. endfunction()
  77. if(ICU_INCLUDE_PATH)
  78. add_definitions(-DHAS_REAL_ICU=1)
  79. set(ICU_CC_PATH "${ICU_INCLUDE_PATH}/../lib/")
  80. find_library(ICUUC icuuc PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  81. find_library(ICU18 icui18n PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  82. find_library(ICUDATA icudata PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  83. if(ICUUC)
  84. message("found libraries on ${ICU_CC_PATH}")
  85. set(ICULIB
  86. ${ICUUC}
  87. ${ICU18}
  88. ${ICUDATA}
  89. )
  90. endif()
  91. elseif(CC_EMBED_ICU)
  92. set(ICU_CC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/icu/source/output/lib/")
  93. find_library(ICUUC icuuc PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  94. find_library(ICU18 icui18n PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  95. find_library(ICUDATA icudata PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH)
  96. set(ICULIB
  97. ${ICUUC}
  98. ${ICU18}
  99. ${ICUDATA}
  100. )
  101. endif()
  102. set(CLR_CMAKE_PLATFORM_XPLAT 1)
  103. if(CC_TARGETS_AMD64)
  104. add_definitions(-D_M_X64_OR_ARM64)
  105. add_compile_options(-msse4.2)
  106. elseif(CC_TARGETS_X86)
  107. add_definitions(-D__i686__)
  108. add_definitions(-D_M_IX86_OR_ARM32)
  109. add_compile_options(-arch i386)
  110. add_compile_options(-msse3)
  111. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} \
  112. -m32"
  113. )
  114. elseif(CC_TARGETS_ARM)
  115. add_definitions(-D__arm__)
  116. add_definitions(-D_M_IX86_OR_ARM32)
  117. add_definitions(-D_M_ARM32_OR_ARM64)
  118. if(CC_TARGET_OS_OSX)
  119. add_compile_options(-arch arm)
  120. endif()
  121. else()
  122. clr_unknown_arch()
  123. endif()
  124. if(CC_TARGET_OS_LINUX OR CC_TARGET_OS_ANDROID)
  125. if(NOT ICULIB)
  126. if(NOT NO_ICU_PATH_GIVEN)
  127. if(NOT CC_EMBED_ICU)
  128. set(ICULIB "icuuc")
  129. endif()
  130. add_definitions(-DHAS_REAL_ICU=1)
  131. endif()
  132. endif()
  133. set(CLR_CMAKE_PLATFORM_LINUX 1)
  134. # OSX 10.12 Clang deprecates libstdc++ [See GH #1599]
  135. # So, -Werror is linux only for now
  136. # + Android ARM ABI shows ld warnings
  137. # xplat-todo: Do we need this ?
  138. if (NOT CC_TARGET_OS_ANDROID)
  139. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  140. -Werror"
  141. )
  142. endif()
  143. elseif(CC_TARGET_OS_OSX)
  144. add_definitions(
  145. -DPLATFORM_UNIX
  146. )
  147. if(NOT ICULIB)
  148. if(NOT NO_ICU_PATH_GIVEN)
  149. add_definitions(-DHAS_REAL_ICU=1)
  150. if(NOT CC_EMBED_ICU)
  151. set(ICULIB "icucore")
  152. add_definitions(
  153. -DU_DISABLE_RENAMING=1 #in case we link against to an older binary of icu
  154. )
  155. endif()
  156. message("using ICU from system default: ${ICULIB}")
  157. endif()
  158. endif()
  159. if(NOT CC_XCODE_PROJECT)
  160. set(CLR_CMAKE_PLATFORM_DARWIN 1)
  161. add_compile_options(-mmacosx-version-min=10.7)
  162. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  163. -mmacosx-version-min=10.7")
  164. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  165. -mmacosx-version-min=10.7")
  166. endif()
  167. else()
  168. message(FATAL_ERROR "This OS is not supported")
  169. endif()
  170. if (CMAKE_CXX_COMPILER_ID STREQUAL AppleClang
  171. OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
  172. OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
  173. # Color diagnostics for g++ and clang++
  174. add_definitions("-fdiagnostics-color=always")
  175. endif()
  176. if(STATIC_LIBRARY)
  177. add_definitions(-DCHAKRA_STATIC_LIBRARY=1)
  178. endif()
  179. if(CLR_CMAKE_PLATFORM_XPLAT)
  180. add_definitions(-DFEATURE_PAL)
  181. add_definitions(-DPLATFORM_UNIX=1)
  182. if(CLR_CMAKE_PLATFORM_LINUX)
  183. add_definitions(-D__LINUX__=1)
  184. if(CC_TARGETS_AMD64)
  185. add_definitions(-DLINUX64)
  186. endif(CC_TARGETS_AMD64)
  187. endif(CLR_CMAKE_PLATFORM_LINUX)
  188. if(CC_TARGETS_AMD64)
  189. set(IS_64BIT_BUILD 1)
  190. add_definitions(-D_M_X64 -D_M_AMD64 -D_AMD64_)
  191. endif(CC_TARGETS_AMD64)
  192. add_definitions(
  193. -DUNICODE
  194. -D_SAFECRT_USE_CPP_OVERLOADS=1
  195. -D__STDC_WANT_LIB_EXT1__=1
  196. )
  197. set(CMAKE_CXX_STANDARD 11)
  198. # CC WARNING FLAGS
  199. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  200. -Wno-implicit-function-declaration"
  201. )
  202. # todo: fix general visibility of the interface
  203. # do not set to `fvisibility=hidden` as it is going to
  204. # prevent the required interface is being exported
  205. # clang by default sets fvisibility=default
  206. # CXX WARNING FLAGS
  207. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  208. -Wno-ignored-attributes\
  209. -Wno-deprecated-declarations\
  210. -Wno-parentheses-equality\
  211. -Wno-missing-braces\
  212. -Wno-reorder\
  213. -Wno-microsoft\
  214. -Wno-unused-value\
  215. -Wno-int-to-void-pointer-cast\
  216. -Wno-invalid-offsetof\
  217. -Wno-undefined-inline\
  218. -Wno-inconsistent-missing-override\
  219. -Wno-c++14-extensions\
  220. -Wno-macro-redefined\
  221. -Wno-pragmas\
  222. -Wno-invalid-token-paste\
  223. -Wno-format\
  224. -Wno-invalid-noreturn\
  225. -Wno-null-arithmetic\
  226. -Wno-tautological-constant-out-of-range-compare\
  227. -Wno-tautological-undefined-compare\
  228. -Wno-address-of-temporary\
  229. -Wno-null-conversion\
  230. -Wno-return-type\
  231. -Wno-switch\
  232. -Wno-int-to-pointer-cast"
  233. )
  234. # notes..
  235. # -Wno-address-of-temporary # vtinfo.h, VirtualTableInfo<T>::RegisterVirtualTable
  236. # -Wno-null-conversion # Check shmemory.cpp and cs.cpp here...
  237. # -Wno-return-type # switch unreachable code
  238. # -Wno-switch # switch values not handled
  239. include(Build/CMakeFeatureDetect.cmake)
  240. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  241. ${CXX_DO_NOT_OPTIMIZE_SIBLING_CALLS} \
  242. -fno-omit-frame-pointer \
  243. -fdelayed-template-parsing"
  244. )
  245. # CXX / CC COMPILER FLAGS
  246. add_compile_options(
  247. -fasm-blocks
  248. -fms-extensions
  249. -fwrapv # Treat signed integer overflow as two's complement
  250. )
  251. # Clang -fsanitize.
  252. if (CLANG_SANITIZE_SH)
  253. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  254. set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}")
  255. unset(CLANG_SANITIZE_SH CACHE) # don't cache
  256. endif()
  257. endif(CLR_CMAKE_PLATFORM_XPLAT)
  258. if(ENABLE_FULL_LTO_SH)
  259. unset(DENABLE_FULL_LTO_SH CACHE)
  260. add_compile_options(-flto)
  261. elseif(ENABLE_THIN_LTO_SH)
  262. unset(ENABLE_THIN_LTO_SH CACHE)
  263. add_compile_options(-flto=thin)
  264. endif()
  265. if(CMAKE_BUILD_TYPE STREQUAL Debug)
  266. add_definitions(
  267. -DDBG=1
  268. -DDEBUG=1
  269. -D_DEBUG=1 # for PAL
  270. -DDBG_DUMP=1
  271. )
  272. elseif(CMAKE_BUILD_TYPE STREQUAL Test)
  273. add_definitions(
  274. -DENABLE_DEBUG_CONFIG_OPTIONS=1
  275. )
  276. endif(CMAKE_BUILD_TYPE STREQUAL Debug)
  277. if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  278. add_compile_options(-O3)
  279. endif(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  280. if(IS_64BIT_BUILD)
  281. add_definitions(
  282. -DBIT64=1
  283. -DSTACK_ALIGN=16
  284. )
  285. endif(IS_64BIT_BUILD)
  286. if(NO_JIT_SH)
  287. unset(NO_JIT_SH CACHE) # don't cache
  288. unset(BuildJIT CACHE) # also clear it just in case
  289. add_definitions(-DDISABLE_JIT=1)
  290. else()
  291. set(BuildJIT 1)
  292. endif()
  293. if(WITHOUT_FEATURES_SH)
  294. unset(WITHOUT_FEATURES_SH CACHE) # don't cache
  295. add_definitions(${WITHOUT_FEATURES_SH})
  296. endif(WITHOUT_FEATURES_SH)
  297. enable_language(ASM)
  298. include_directories(
  299. .
  300. lib/Common
  301. lib/Common/PlaceHolder
  302. pal
  303. pal/inc
  304. pal/inc/rt
  305. ${ICU_INCLUDE_PATH}
  306. )
  307. if(ICU_INCLUDE_PATH)
  308. if(NOT HAVE_LIBICU_UCHAR_H)
  309. set(HAVE_LIBICU_UCHAR_H "1")
  310. endif()
  311. endif()
  312. add_subdirectory (pal)
  313. # build the rest with NO_PAL_MINMAX and PAL_STDCPP_COMPAT
  314. add_definitions(
  315. -DNO_PAL_MINMAX
  316. -DPAL_STDCPP_COMPAT
  317. )
  318. add_subdirectory (lib)
  319. add_subdirectory (bin)