1
0

CMakeLists.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
  2. cmake_policy(PUSH)
  3. cmake_policy(SET CMP0063 NEW) # Honor visibility properties.
  4. include(CheckCXXCompilerFlag)
  5. # Don't create a project if it was already created by another CMakeLists.txt.
  6. # This allows one library to embed another library without making a collision.
  7. if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit")
  8. project(asmjit CXX)
  9. endif()
  10. # =============================================================================
  11. # [AsmJit - Deprecated]
  12. # =============================================================================
  13. if (DEFINED ASMJIT_BUILD_EMBED)
  14. message(DEPRECATION "ASMJIT_BUILD_EMBED is deprecated, use ASMJIT_EMBED")
  15. set(ASMJIT_EMBED "${ASMJIT_BUILD_EMBED}")
  16. endif()
  17. if (DEFINED ASMJIT_BUILD_STATIC)
  18. message(DEPRECATION "ASMJIT_BUILD_STATIC is deprecated, use ASMJIT_STATIC")
  19. set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}")
  20. endif()
  21. # =============================================================================
  22. # [AsmJit - Configuration]
  23. # =============================================================================
  24. if (NOT DEFINED ASMJIT_EMBED)
  25. set(ASMJIT_EMBED FALSE)
  26. endif()
  27. if (NOT DEFINED ASMJIT_STATIC)
  28. set(ASMJIT_STATIC ${ASMJIT_EMBED})
  29. endif()
  30. if (NOT DEFINED ASMJIT_BUILD_ARM)
  31. set(ASMJIT_BUILD_ARM FALSE)
  32. endif()
  33. if (NOT DEFINED ASMJIT_BUILD_X86)
  34. set(ASMJIT_BUILD_X86 FALSE)
  35. endif()
  36. if (NOT DEFINED ASMJIT_TEST)
  37. set(ASMJIT_TEST FALSE)
  38. endif()
  39. # EMBED implies STATIC.
  40. if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
  41. set(ASMJIT_STATIC TRUE)
  42. endif()
  43. set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
  44. set(ASMJIT_TEST ${ASMJIT_TEST} CACHE BOOL "Build 'asmjit' test applications")
  45. set(ASMJIT_EMBED ${ASMJIT_EMBED} CACHE BOOL "Embed 'asmjit' library (no targets)")
  46. set(ASMJIT_STATIC ${ASMJIT_STATIC} CACHE BOOL "Build 'asmjit' library as static")
  47. set(ASMJIT_SANITIZE ${ASMJIT_SANITIZE} CACHE BOOL "Build with C/C++ sanitizers enabled")
  48. set(ASMJIT_BUILD_X86 ${ASMJIT_BUILD_X86} CACHE BOOL "Build X86 backends (X86 and X86_64)")
  49. set(ASMJIT_BUILD_ARM ${ASMJIT_BUILD_ARM} CACHE BOOL "Build ARM backends")
  50. # =============================================================================
  51. # [AsmJit - Project]
  52. # =============================================================================
  53. set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
  54. set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
  55. set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit.
  56. set(ASMJIT_CFLAGS "") # Public compiler flags.
  57. set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
  58. set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
  59. set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
  60. set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
  61. set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
  62. # =============================================================================
  63. # [AsmJit - Utilities]
  64. # =============================================================================
  65. function(asmjit_detect_cflags out)
  66. set(out_array ${${out}})
  67. foreach(flag ${ARGN})
  68. string(REGEX REPLACE "[+]" "x" flag_signature "${flag}")
  69. string(REGEX REPLACE "[-=:;/.\]" "_" flag_signature "${flag_signature}")
  70. check_cxx_compiler_flag(${flag} "__CxxFlag_${flag_signature}")
  71. if (${__CxxFlag_${flag_signature}})
  72. list(APPEND out_array "${flag}")
  73. endif()
  74. endforeach()
  75. set(${out} "${out_array}" PARENT_SCOPE)
  76. endfunction()
  77. # Support for various sanitizers provided by C/C++ compilers.
  78. function(asmjit_detect_sanitizers out)
  79. set(_out_array ${${out}})
  80. set(_flags "")
  81. foreach(_arg ${ARGN})
  82. string(REPLACE "," ";" _arg "${_arg}")
  83. list(APPEND _flags ${_arg})
  84. endforeach()
  85. foreach(_flag ${_flags})
  86. if (NOT "${_flag}" MATCHES "^-fsanitize=")
  87. SET(_flag "-fsanitize=${_flag}")
  88. endif()
  89. # Sanitizers also require link flags, see CMAKE_REQUIRED_FLAGS.
  90. set(CMAKE_REQUIRED_FLAGS "${_flag}")
  91. asmjit_detect_cflags(_out_array ${_flag})
  92. unset(CMAKE_REQUIRED_FLAGS)
  93. endforeach()
  94. set(${out} "${_out_array}" PARENT_SCOPE)
  95. endfunction()
  96. function(asmjit_add_target target target_type src deps cflags cflags_dbg cflags_rel)
  97. if ("${target_type}" STREQUAL "EXECUTABLE")
  98. add_executable(${target} ${src})
  99. else()
  100. add_library(${target} ${target_type} ${src})
  101. endif()
  102. target_link_libraries(${target} PRIVATE ${deps})
  103. # target_link_options was added in cmake 3.13, which doesn't work for us.
  104. # target_link_options(${target} PRIVATE ${flags})
  105. foreach(link_flag ${ASMJIT_SANITIZE_LFLAGS})
  106. set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}")
  107. endforeach()
  108. if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
  109. set_property(TARGET ${target} PROPERTY CXX_STANDARD 11)
  110. else()
  111. target_compile_features(${target} PUBLIC cxx_std_11)
  112. endif()
  113. set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO)
  114. set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden)
  115. target_compile_options(${target} PRIVATE ${cflags} ${ASMJIT_SANITIZE_CFLAGS} $<$<CONFIG:Debug>:${cflags_dbg}> $<$<NOT:$<CONFIG:Debug>>:${cflags_rel}>)
  116. endfunction()
  117. # =============================================================================
  118. # [AsmJit - Compiler Support]
  119. # =============================================================================
  120. set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
  121. set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
  122. set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit.
  123. set(ASMJIT_CFLAGS "") # Public compiler flags.
  124. set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
  125. set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
  126. set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
  127. set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
  128. set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
  129. # TODO: Backward compatibility.
  130. set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}")
  131. if (NOT ASMJIT_NO_CUSTOM_FLAGS)
  132. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
  133. list(APPEND ASMJIT_PRIVATE_CFLAGS
  134. -MP # [+] Multi-Process Compilation.
  135. -GR- # [-] Runtime type information.
  136. -GF # [+] Eliminate duplicate strings.
  137. -Zc:inline # [+] Remove unreferenced COMDAT.
  138. -Zc:strictStrings # [+] Strict const qualification of string literals.
  139. -Zc:threadSafeInit- # [-] Thread-safe statics.
  140. -W4) # [+] Warning level 4.
  141. list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG
  142. -GS) # [+] Buffer security-check.
  143. list(APPEND ASMJIT_PRIVATE_CFLAGS_REL
  144. -GS- # [-] Buffer security-check.
  145. -O2 # [+] Favor speed over size.
  146. -Oi) # [+] Generate intrinsic functions.
  147. elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang)$")
  148. list(APPEND ASMJIT_PRIVATE_CFLAGS -Wall -Wextra)
  149. list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno)
  150. list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2)
  151. asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS
  152. -fno-threadsafe-statics
  153. -fno-semantic-interposition)
  154. asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL
  155. -fmerge-all-constants)
  156. endif()
  157. endif()
  158. # Support for sanitizers.
  159. if (ASMJIT_SANITIZE)
  160. ASMJIT_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE})
  161. if (ASMJIT_SANITIZE_CFLAGS)
  162. message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'")
  163. # Linker must receive the same flags as the compiler when it comes to sanitizers.
  164. set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS})
  165. # Don't omit frame pointer if sanitizers are enabled.
  166. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
  167. list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-)
  168. else()
  169. list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g)
  170. endif()
  171. list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_SANITIZE_CFLAGS})
  172. list(APPEND ASMJIT_PRIVATE_LFLAGS ${ASMJIT_SANITIZE_LFLAGS})
  173. endif()
  174. endif()
  175. if (NOT WIN32)
  176. list(APPEND ASMJIT_DEPS pthread)
  177. endif()
  178. if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
  179. list(APPEND ASMJIT_DEPS rt)
  180. endif()
  181. set(ASMJIT_LIBS ${ASMJIT_DEPS})
  182. if (NOT ASMJIT_EMBED)
  183. list(INSERT ASMJIT_LIBS 0 asmjit)
  184. endif()
  185. if (ASMJIT_EMBED)
  186. set(ASMJIT_TARGET_TYPE "EMBED")
  187. elseif (ASMJIT_STATIC)
  188. set(ASMJIT_TARGET_TYPE "STATIC")
  189. else()
  190. set(ASMJIT_TARGET_TYPE "SHARED")
  191. endif()
  192. foreach(build_option ASMJIT_STATIC
  193. ASMJIT_BUILD_X86
  194. #ASMJIT_BUILD_ARM
  195. ASMJIT_BUILD_A64
  196. ASMJIT_NO_JIT
  197. ASMJIT_NO_LOGGING
  198. ASMJIT_NO_BUILDER
  199. ASMJIT_NO_COMPILER
  200. ASMJIT_NO_TEXT
  201. ASMJIT_NO_VALIDATION
  202. ASMJIT_NO_INTROSPECTION)
  203. if (${build_option})
  204. List(APPEND ASMJIT_CFLAGS "-D${build_option}")
  205. List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}")
  206. endif()
  207. endforeach()
  208. # =============================================================================
  209. # [AsmJit - Source]
  210. # =============================================================================
  211. set(ASMJIT_SRC_LIST
  212. asmjit/asmjit.h
  213. asmjit/core.h
  214. asmjit/core/build.h
  215. asmjit/core/arch.cpp
  216. asmjit/core/arch.h
  217. asmjit/core/assembler.cpp
  218. asmjit/core/assembler.h
  219. asmjit/core/builder.cpp
  220. asmjit/core/builder.h
  221. asmjit/core/callconv.cpp
  222. asmjit/core/callconv.h
  223. asmjit/core/codebufferwriter_p.h
  224. asmjit/core/codeholder.cpp
  225. asmjit/core/codeholder.h
  226. asmjit/core/compiler.cpp
  227. asmjit/core/compiler.h
  228. asmjit/core/constpool.cpp
  229. asmjit/core/constpool.h
  230. asmjit/core/cpuinfo.cpp
  231. asmjit/core/cpuinfo.h
  232. asmjit/core/datatypes.h
  233. asmjit/core/emitter.cpp
  234. asmjit/core/emitter.h
  235. asmjit/core/features.h
  236. asmjit/core/func.cpp
  237. asmjit/core/func.h
  238. asmjit/core/globals.cpp
  239. asmjit/core/globals.h
  240. asmjit/core/inst.cpp
  241. asmjit/core/inst.h
  242. asmjit/core/jitallocator.cpp
  243. asmjit/core/jitallocator.h
  244. asmjit/core/jitruntime.cpp
  245. asmjit/core/jitruntime.h
  246. asmjit/core/logging.cpp
  247. asmjit/core/logging.h
  248. asmjit/core/misc_p.h
  249. asmjit/core/operand.cpp
  250. asmjit/core/operand.h
  251. asmjit/core/osutils.cpp
  252. asmjit/core/osutils.h
  253. asmjit/core/raassignment_p.h
  254. asmjit/core/rabuilders_p.h
  255. asmjit/core/radefs_p.h
  256. asmjit/core/ralocal.cpp
  257. asmjit/core/ralocal_p.h
  258. asmjit/core/rapass.cpp
  259. asmjit/core/rapass_p.h
  260. asmjit/core/rastack.cpp
  261. asmjit/core/rastack_p.h
  262. asmjit/core/string.cpp
  263. asmjit/core/string.h
  264. asmjit/core/support.cpp
  265. asmjit/core/support.h
  266. asmjit/core/target.cpp
  267. asmjit/core/target.h
  268. asmjit/core/type.cpp
  269. asmjit/core/type.h
  270. asmjit/core/virtmem.cpp
  271. asmjit/core/virtmem.h
  272. asmjit/core/zone.cpp
  273. asmjit/core/zone.h
  274. asmjit/core/zonehash.cpp
  275. asmjit/core/zonehash.h
  276. asmjit/core/zonelist.cpp
  277. asmjit/core/zonelist.h
  278. asmjit/core/zonestack.cpp
  279. asmjit/core/zonestack.h
  280. asmjit/core/zonestring.h
  281. asmjit/core/zonetree.cpp
  282. asmjit/core/zonetree.h
  283. asmjit/core/zonevector.cpp
  284. asmjit/core/zonevector.h
  285. asmjit/x86.h
  286. asmjit/x86/x86assembler.cpp
  287. asmjit/x86/x86assembler.h
  288. asmjit/x86/x86builder.cpp
  289. asmjit/x86/x86builder.h
  290. asmjit/x86/x86callconv.cpp
  291. asmjit/x86/x86callconv_p.h
  292. asmjit/x86/x86compiler.cpp
  293. asmjit/x86/x86compiler.h
  294. asmjit/x86/x86emitter.h
  295. asmjit/x86/x86features.cpp
  296. asmjit/x86/x86features.h
  297. asmjit/x86/x86globals.h
  298. asmjit/x86/x86internal.cpp
  299. asmjit/x86/x86internal_p.h
  300. asmjit/x86/x86instdb.cpp
  301. asmjit/x86/x86instdb.h
  302. asmjit/x86/x86instdb_p.h
  303. asmjit/x86/x86instapi.cpp
  304. asmjit/x86/x86instapi_p.h
  305. asmjit/x86/x86logging.cpp
  306. asmjit/x86/x86logging_p.h
  307. asmjit/x86/x86operand.cpp
  308. asmjit/x86/x86operand.h
  309. asmjit/x86/x86rapass.cpp
  310. asmjit/x86/x86rapass_p.h
  311. )
  312. #if (MSVC)
  313. # list(APPEND ASMJIT_SRC_LIST asmjit.natvis)
  314. #endif()
  315. set(ASMJIT_SRC "")
  316. foreach(_src_file ${ASMJIT_SRC_LIST})
  317. list(APPEND ASMJIT_SRC "${ASMJIT_DIR}/src/${_src_file}")
  318. endforeach()
  319. if (NOT ${CMAKE_VERSION} VERSION_LESS "3.8.0")
  320. source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
  321. endif()
  322. # =============================================================================
  323. # [AsmJit - Summary]
  324. # =============================================================================
  325. message("** AsmJit Summary **")
  326. message(" ASMJIT_DIR=${ASMJIT_DIR}")
  327. message(" ASMJIT_TEST=${ASMJIT_TEST}")
  328. message(" ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}")
  329. message(" ASMJIT_DEPS=${ASMJIT_DEPS}")
  330. message(" ASMJIT_LIBS=${ASMJIT_LIBS}")
  331. message(" ASMJIT_CFLAGS=${ASMJIT_CFLAGS}")
  332. message(" ASMJIT_PRIVATE_CFLAGS=${ASMJIT_PRIVATE_CFLAGS}")
  333. message(" ASMJIT_PRIVATE_CFLAGS_DBG=${ASMJIT_PRIVATE_CFLAGS_DBG}")
  334. message(" ASMJIT_PRIVATE_CFLAGS_REL=${ASMJIT_PRIVATE_CFLAGS_REL}")
  335. # =============================================================================
  336. # [AsmJit - Targets]
  337. # =============================================================================
  338. if (NOT ASMJIT_EMBED)
  339. # Add 'asmjit' target.
  340. asmjit_add_target(asmjit "${ASMJIT_TARGET_TYPE}"
  341. "${ASMJIT_SRC}"
  342. "${ASMJIT_DEPS}"
  343. "${ASMJIT_PRIVATE_CFLAGS}"
  344. "${ASMJIT_PRIVATE_CFLAGS_DBG}"
  345. "${ASMJIT_PRIVATE_CFLAGS_REL}")
  346. target_include_directories(asmjit BEFORE INTERFACE ${ASMJIT_INCLUDE_DIRS})
  347. target_compile_options(asmjit INTERFACE ${ASMJIT_CFLAGS})
  348. # Add AsmJit::AsmJit target (alias to asmjit).
  349. add_library(AsmJit::AsmJit ALIAS asmjit)
  350. if (MANDEL_INSTALL_ASMJIT)
  351. # Install 'asmjit' target (shared or static).
  352. install(TARGETS asmjit RUNTIME DESTINATION "bin"
  353. LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  354. ARCHIVE DESTINATION "lib${LIB_SUFFIX}")
  355. # Install 'asmjit' header files (private headers are filtered out).
  356. foreach(_src_file ${ASMJIT_SRC_LIST})
  357. if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$")
  358. get_filename_component(_src_dir ${_src_file} PATH)
  359. install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "include/${_src_dir}")
  360. endif()
  361. endforeach()
  362. endif(MANDEL_INSTALL_ASMJIT)
  363. # Add 'asmjit' tests.
  364. if (ASMJIT_TEST)
  365. set(ASMJIT_TEST_SRC test/asmjit_test_unit.cpp test/broken.cpp test/broken.h)
  366. asmjit_add_target(asmjit_test_unit EXECUTABLE
  367. "${ASMJIT_SRC};${ASMJIT_TEST_SRC}"
  368. "${ASMJIT_DEPS}"
  369. "${ASMJIT_PRIVATE_CFLAGS}"
  370. "${ASMJIT_PRIVATE_CFLAGS_DBG}"
  371. "${ASMJIT_PRIVATE_CFLAGS_REL}")
  372. target_compile_definitions(asmjit_test_unit PRIVATE ASMJIT_TEST ASMJIT_STATIC)
  373. foreach(_target asmjit_bench_x86
  374. asmjit_test_opcode
  375. asmjit_test_x86_asm
  376. asmjit_test_x86_cc
  377. asmjit_test_x86_sections)
  378. asmjit_add_target(${_target} EXECUTABLE
  379. "test/${_target}.cpp"
  380. "${ASMJIT_LIBS}"
  381. "${ASMJIT_PRIVATE_CFLAGS}"
  382. "${ASMJIT_PRIVATE_CFLAGS_DBG}"
  383. "${ASMJIT_PRIVATE_CFLAGS_REL}")
  384. endforeach()
  385. endif()
  386. endif()
  387. cmake_policy(POP)