CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. cmake_minimum_required(VERSION 3.13)
  2. set(HL_VERSION_MAJOR 1)
  3. set(HL_VERSION_MINOR 16)
  4. set(HL_VERSION_PATCH 0)
  5. set(HL_VERSION ${HL_VERSION_MAJOR}.${HL_VERSION_MINOR}.${HL_VERSION_PATCH})
  6. cmake_policy(SET CMP0042 NEW)
  7. if (${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.24)
  8. cmake_policy(VERSION 3.24)
  9. endif()
  10. if(WIN32)
  11. set(CMAKE_SYSTEM_VERSION 10.0)
  12. endif()
  13. project(hashlink)
  14. include(GNUInstallDirs)
  15. include(FindPkgConfig)
  16. include(CTest)
  17. set(WITH_VM_DEFAULT ON)
  18. if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|aarch64" AND (NOT CMAKE_OSX_ARCHITECTURES MATCHES "x86_64"))
  19. set(WITH_VM_DEFAULT OFF)
  20. endif()
  21. option(WITH_VM "Whether to build the Hashlink virtual machine" ${WITH_VM_DEFAULT})
  22. option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
  23. if(BUILD_SHARED_LIBS)
  24. # ensure third-party static libs are built with PIC
  25. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  26. endif()
  27. if(ANDROID)
  28. set(_DOWNLOAD_DEPENDENCIES ON)
  29. else()
  30. set(_DOWNLOAD_DEPENDENCIES OFF)
  31. endif()
  32. option(DOWNLOAD_DEPENDENCIES "Download & build third-party dependencies" ${_DOWNLOAD_DEPENDENCIES})
  33. if(MSVC)
  34. if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  35. set (CMAKE_INSTALL_PREFIX "C:/HaxeToolkit/hashlink" CACHE PATH "default install path" FORCE)
  36. endif()
  37. endif()
  38. option(FLAT_INSTALL_TREE "Flat install tree" ${MSVC})
  39. if(FLAT_INSTALL_TREE)
  40. set(CMAKE_INSTALL_BINDIR .)
  41. set(CMAKE_INSTALL_LIBDIR .)
  42. endif()
  43. # force Unicode over Multi-byte
  44. if(MSVC)
  45. add_definitions(-DUNICODE -D_UNICODE)
  46. add_compile_options(/permissive-)
  47. endif()
  48. if (MINGW)
  49. add_compile_options(-municode)
  50. add_link_options(-municode)
  51. endif()
  52. list(APPEND CMAKE_MODULE_PATH
  53. ${CMAKE_CURRENT_SOURCE_DIR}/other/cmake
  54. )
  55. set(CMAKE_C_STANDARD 11)
  56. set(CMAKE_C_STANDARD_REQUIRED ON)
  57. # put output in "bin"
  58. set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
  59. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIR})
  60. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIR})
  61. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIR})
  62. # avoid the extra "Debug", "Release" directories
  63. foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
  64. string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
  65. set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIR} )
  66. set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIR} )
  67. set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIR} )
  68. endforeach()
  69. file(GLOB pcre_srcs
  70. include/pcre/pcre2_auto_possess.c
  71. include/pcre/pcre2_chartables.c
  72. include/pcre/pcre2_compile.c
  73. include/pcre/pcre2_config.c
  74. include/pcre/pcre2_context.c
  75. include/pcre/pcre2_convert.c
  76. include/pcre/pcre2_dfa_match.c
  77. include/pcre/pcre2_error.c
  78. include/pcre/pcre2_extuni.c
  79. include/pcre/pcre2_find_bracket.c
  80. include/pcre/pcre2_jit_compile.c
  81. include/pcre/pcre2_maketables.c
  82. include/pcre/pcre2_match_data.c
  83. include/pcre/pcre2_match.c
  84. include/pcre/pcre2_newline.c
  85. include/pcre/pcre2_ord2utf.c
  86. include/pcre/pcre2_pattern_info.c
  87. include/pcre/pcre2_script_run.c
  88. include/pcre/pcre2_serialize.c
  89. include/pcre/pcre2_string_utils.c
  90. include/pcre/pcre2_study.c
  91. include/pcre/pcre2_substitute.c
  92. include/pcre/pcre2_substring.c
  93. include/pcre/pcre2_tables.c
  94. include/pcre/pcre2_ucd.c
  95. include/pcre/pcre2_valid_utf.c
  96. include/pcre/pcre2_xclass.c
  97. )
  98. file(GLOB std_srcs
  99. src/std/array.c
  100. src/std/buffer.c
  101. src/std/bytes.c
  102. src/std/cast.c
  103. src/std/date.c
  104. src/std/debug.c
  105. src/std/error.c
  106. src/std/file.c
  107. src/std/fun.c
  108. src/std/maps.c
  109. src/std/math.c
  110. src/std/obj.c
  111. src/std/random.c
  112. src/std/regexp.c
  113. src/std/socket.c
  114. src/std/string.c
  115. src/std/sys.c
  116. src/std/track.c
  117. src/std/types.c
  118. src/std/ucs2.c
  119. src/std/thread.c
  120. src/std/process.c
  121. )
  122. if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  123. list(APPEND std_srcs
  124. include/mdbg/mdbg.c
  125. include/mdbg/mach_excServer.c
  126. include/mdbg/mach_excUser.c
  127. )
  128. endif()
  129. if(ANDROID)
  130. list(APPEND std_srcs
  131. src/std/sys_android.c
  132. )
  133. endif()
  134. if(IOS_PLATFORM)
  135. list(APPEND std_srcs
  136. src/std/sys_ios.m
  137. )
  138. endif()
  139. add_library(libhl
  140. ${pcre_srcs}
  141. src/gc.c
  142. ${std_srcs}
  143. )
  144. target_include_directories(libhl
  145. PUBLIC src
  146. PRIVATE include include/pcre
  147. )
  148. # C11 / C++11 are required for features such as unicode strings
  149. target_compile_features(libhl PUBLIC cxx_std_11 c_std_11)
  150. set(public_headers
  151. src/hl.h
  152. src/hlc.h
  153. )
  154. set_target_properties(libhl
  155. PROPERTIES
  156. PUBLIC_HEADER "${public_headers}"
  157. )
  158. if(MSVC)
  159. set_target_properties(libhl
  160. PROPERTIES
  161. OUTPUT_NAME libhl
  162. )
  163. else()
  164. set_target_properties(libhl
  165. PROPERTIES
  166. OUTPUT_NAME hl
  167. )
  168. endif()
  169. set_target_properties(libhl
  170. PROPERTIES
  171. VERSION ${HL_VERSION}
  172. SOVERSION ${HL_VERSION_MAJOR}
  173. COMPILE_DEFINITIONS "_USRDLL;LIBHL_EXPORTS;HAVE_CONFIG_H;PCRE2_CODE_UNIT_WIDTH=16"
  174. )
  175. if (WITH_VM)
  176. add_executable(hl
  177. src/code.c
  178. src/jit.c
  179. src/main.c
  180. src/module.c
  181. src/debugger.c
  182. src/profile.c
  183. )
  184. if(APPLE)
  185. set_target_properties(hl PROPERTIES
  186. INSTALL_RPATH "@executable_path;@executable_path/../${CMAKE_INSTALL_LIBDIR}"
  187. )
  188. elseif (UNIX)
  189. set_target_properties(hl PROPERTIES
  190. INSTALL_RPATH "$ORIGIN;$ORIGIN/../${CMAKE_INSTALL_LIBDIR}"
  191. )
  192. endif()
  193. target_link_libraries(hl libhl)
  194. if (WIN32)
  195. target_link_libraries(hl user32)
  196. endif()
  197. endif()
  198. if(WIN32)
  199. target_link_libraries(libhl ws2_32 user32 winmm)
  200. else()
  201. target_link_libraries(libhl m dl)
  202. if(ANDROID)
  203. target_link_libraries(libhl log)
  204. else()
  205. target_link_libraries(libhl pthread)
  206. endif()
  207. endif()
  208. if(BUILD_TESTING)
  209. find_program(
  210. HAXE_COMPILER
  211. haxe
  212. )
  213. if("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "Win32")
  214. SET(HAXE_FLAGS -D hl-legacy32)
  215. else()
  216. SET(HAXE_FLAGS )
  217. endif()
  218. if(MINGW)
  219. set(HLC_LIBRARIES dbghelp)
  220. else()
  221. set(HLC_LIBRARIES)
  222. endif()
  223. #####################
  224. # hello.hl
  225. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello.hl
  226. COMMAND ${HAXE_COMPILER}
  227. ${HAXE_FLAGS}
  228. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello.hl
  229. -cp ${CMAKE_SOURCE_DIR}/other/tests -main HelloWorld
  230. )
  231. add_custom_target(hello.hl ALL
  232. DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello.hl
  233. )
  234. #####################
  235. # threads.hl
  236. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads.hl
  237. COMMAND ${HAXE_COMPILER}
  238. ${HAXE_FLAGS}
  239. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads.hl
  240. -cp ${CMAKE_SOURCE_DIR}/other/tests -main Threads
  241. )
  242. add_custom_target(threads.hl ALL
  243. DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads.hl
  244. )
  245. #####################
  246. # uvsample.hl
  247. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample.hl
  248. COMMAND ${HAXE_COMPILER}
  249. ${HAXE_FLAGS}
  250. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample.hl
  251. -cp ${CMAKE_SOURCE_DIR}/other/uvsample -main UVSample
  252. )
  253. add_custom_target(uvsample.hl ALL
  254. DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample.hl
  255. )
  256. #####################
  257. # hello.c
  258. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello/hello.c
  259. COMMAND ${HAXE_COMPILER}
  260. ${HAXE_FLAGS}
  261. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello/hello.c
  262. -cp ${CMAKE_SOURCE_DIR}/other/tests -main HelloWorld
  263. )
  264. add_executable(hello
  265. ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello/hello.c
  266. )
  267. set_target_properties(hello
  268. PROPERTIES
  269. RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello
  270. )
  271. target_include_directories(hello
  272. PRIVATE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello
  273. )
  274. target_link_libraries(hello
  275. libhl
  276. ${HLC_LIBRARIES}
  277. )
  278. #####################
  279. # threads.c
  280. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads/threads.c
  281. COMMAND ${HAXE_COMPILER}
  282. ${HAXE_FLAGS}
  283. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads/threads.c
  284. -cp ${CMAKE_SOURCE_DIR}/other/tests -main Threads
  285. )
  286. add_executable(threads
  287. ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads/threads.c
  288. )
  289. set_target_properties(threads
  290. PROPERTIES
  291. RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads
  292. )
  293. target_include_directories(threads
  294. PRIVATE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads
  295. )
  296. target_link_libraries(threads
  297. libhl
  298. ${HLC_LIBRARIES}
  299. )
  300. #####################
  301. # uvsample.c
  302. add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample/uvsample.c
  303. COMMAND ${HAXE_COMPILER}
  304. ${HAXE_FLAGS}
  305. -hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample/uvsample.c
  306. -cp ${CMAKE_SOURCE_DIR}/other/uvsample -main UVSample
  307. )
  308. add_executable(uvsample
  309. ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample/uvsample.c
  310. )
  311. set_target_properties(uvsample
  312. PROPERTIES
  313. RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample
  314. )
  315. target_include_directories(uvsample
  316. PRIVATE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample
  317. )
  318. target_link_libraries(uvsample
  319. libhl
  320. uv.hdll
  321. ${HLC_LIBRARIES}
  322. )
  323. #####################
  324. # header_macro_clashes.c
  325. add_executable(header_macro_clashes
  326. ${CMAKE_SOURCE_DIR}/other/tests/header_macro_clashes/header_macro_clashes.c
  327. )
  328. set_target_properties(header_macro_clashes
  329. PROPERTIES
  330. RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/
  331. )
  332. target_link_libraries(header_macro_clashes
  333. libhl
  334. ${HLC_LIBRARIES}
  335. )
  336. #####################
  337. # Tests
  338. if (WITH_VM)
  339. add_test(NAME version
  340. COMMAND hl --version
  341. )
  342. set_tests_properties(version
  343. PROPERTIES
  344. PASS_REGULAR_EXPRESSION "${HL_VERSION}"
  345. )
  346. add_test(NAME hello.hl
  347. COMMAND hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/hello.hl
  348. )
  349. add_test(NAME threads.hl
  350. COMMAND hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/threads.hl
  351. )
  352. add_test(NAME uvsample.hl
  353. COMMAND hl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/uvsample.hl 6001
  354. )
  355. endif()
  356. add_test(NAME hello
  357. COMMAND hello
  358. )
  359. add_test(NAME threads
  360. COMMAND threads
  361. )
  362. add_test(NAME uvsample
  363. COMMAND uvsample 6002
  364. )
  365. endif()
  366. #####################
  367. # Packaging
  368. set(CPACK_OUTPUT_FILE_PREFIX ${OUTPUT_DIR})
  369. set(CPACK_PACKAGE_VENDOR "Haxe Foundation")
  370. set(CPACK_PACKAGE_VERSION_MAJOR ${HL_VERSION_MAJOR})
  371. set(CPACK_PACKAGE_VERSION_MINOR ${HL_VERSION_MINOR})
  372. set(CPACK_PACKAGE_VERSION_PATCH ${HL_VERSION_PATCH})
  373. if(WIN32)
  374. set(CPACK_GENERATOR "ZIP")
  375. else()
  376. set(CPACK_GENERATOR "TGZ")
  377. endif()
  378. set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
  379. set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
  380. set(HDLL_DESTINATION
  381. ${CMAKE_INSTALL_LIBDIR}
  382. )
  383. set(INSTALL_TARGETS libhl)
  384. if (WITH_VM)
  385. list(APPEND INSTALL_TARGETS hl)
  386. endif()
  387. install(
  388. TARGETS
  389. ${INSTALL_TARGETS}
  390. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  391. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  392. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  393. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  394. )
  395. install(
  396. FILES src/hlc_main.c
  397. TYPE INCLUDE
  398. )
  399. # uninstall target
  400. # https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake
  401. if(NOT TARGET uninstall)
  402. configure_file(
  403. "${CMAKE_CURRENT_SOURCE_DIR}/other/cmake/cmake_uninstall.cmake.in"
  404. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  405. IMMEDIATE @ONLY)
  406. add_custom_target(uninstall
  407. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  408. endif()
  409. if(
  410. NOT DEFINED ENV{APPVEYOR_REPO_TAG_NAME}
  411. AND
  412. DEFINED ENV{APPVEYOR_REPO_COMMIT}
  413. )
  414. string(SUBSTRING $ENV{APPVEYOR_REPO_COMMIT} 0 7 short_commit)
  415. endif()
  416. if(NOT DEFINED ENV{TRAVIS_TAG} AND DEFINED ENV{TRAVIS_COMMIT})
  417. string(SUBSTRING $ENV{TRAVIS_COMMIT} 0 7 short_commit)
  418. endif()
  419. if(DEFINED short_commit)
  420. set(CPACK_PACKAGE_VERSION "${HL_VERSION}+${short_commit}")
  421. endif()
  422. include(CPack)
  423. add_subdirectory(libs)