CMakeLists.txt 11 KB

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