xmake.lua 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package("libhv")
  2. set_homepage("https://github.com/ithewei/libhv")
  3. set_description("Like libevent, libev, and libuv, libhv provides event-loop with non-blocking IO and timer, but simpler api and richer protocols.")
  4. set_license("BSD-3-Clause")
  5. add_urls("https://github.com/ithewei/libhv.git")
  6. add_urls("https://github.com/ithewei/libhv/archive/refs/tags/$(version).zip", {excludes = {"*/html/*"}})
  7. add_versions("v1.0.0", "39adb77cc7addaba82b69fa9a433041c8288f3d9c773fa360162e3391dcf6a7b")
  8. add_versions("v1.1.0", "a753c268976d9c4f85dcc10be2377bebc36d4cb822ac30345cf13f2a7285dbe3")
  9. add_versions("v1.1.1", "e012d9752fe8fb3f788cb6360cd9abe61d4ccdc1d2085501d85f1068eba8603e")
  10. add_versions("v1.2.1", "d658a8e7f1a3b2f3b0ddcabe3b13595b70246c94d57f2c27bf9a9946431b2e63")
  11. add_versions("v1.2.2", "a15ec12cd77d1fb745a74465b8bdee5a45247e854371db9d0863573beca08466")
  12. add_versions("v1.2.3", "c30ace04597a0558ce957451d64acc7cd3260d991dc21628e048c8dec3028f34")
  13. add_versions("v1.2.4", "389fa60f0d6697b5267ddc69de00e4844f1d8ac8ee4d2ad3742850589c20d46e")
  14. add_versions("v1.2.6", "dd5ed854f5cdc0bdd3a3310a9f0452ec194e2907006551aebbb603825a989ed1")
  15. add_versions("v1.3.0", "e7a129dcabb541baeb8599e419380df6aa98afc6e04874ac88a6d2bdb5a973a5")
  16. add_versions("v1.3.1", "66fb17738bc51bee424b6ddb1e3b648091fafa80c8da6d75626d12b4188e0bdc")
  17. add_versions("v1.3.2", "61d6d5fadf13d81c111df4514e0e61062fead21c2a8b6c4caf7706f9b002fae1")
  18. add_versions("v1.3.3", "f78d1012ddf82506c28dda573ce303912e6cd5e707a358a249db1cc7e1e82238")
  19. add_versions("v1.3.4", "966866873897ff4a7c526c3f6f1d00d7c13027aa5eef16270a5c5b4094dbdf95")
  20. add_configs("protocol", {description = "compile protocol", default = false, type = "boolean"})
  21. add_configs("http", {description = "compile http", default = true, type = "boolean"})
  22. add_configs("http_server", {description = "compile http/server", default = true, type = "boolean"})
  23. add_configs("http_client", {description = "compile http/client", default = true, type = "boolean"})
  24. add_configs("consul", {description = "compile consul", default = false, type = "boolean"})
  25. add_configs("ipv6", {description = "enable ipv6", default = false, type = "boolean"})
  26. add_configs("uds", {description = "enable Unix Domain Socket", default = false, type = "boolean"})
  27. add_configs("windump", {description = "enable Windows MiniDumpWriteDump", default = false, type = "boolean"})
  28. add_configs("multimap", {description = "use MultiMap", default = false, type = "boolean"})
  29. add_configs("curl", {description = "with curl library", default = false, type = "boolean"})
  30. add_configs("nghttp2", {description = "with nghttp2 library", default = false, type = "boolean"})
  31. add_configs("openssl", {description = "with openssl library", default = false, type = "boolean"})
  32. add_configs("mbedtls", {description = "with mbedtls library", default = false, type = "boolean"})
  33. add_configs("gnutls", {description = "with gnutls library", default = false, type = "boolean"})
  34. if is_plat("linux") then
  35. add_syslinks("pthread")
  36. elseif is_plat("macosx", "iphoneos") then
  37. add_frameworks("CoreFoundation", "Security")
  38. elseif is_plat("windows") then
  39. add_syslinks("crypt32", "advapi32")
  40. elseif is_plat("mingw") then
  41. add_syslinks("crypt32", "ws2_32", "secur32")
  42. add_syslinks("pthread")
  43. end
  44. add_deps("cmake")
  45. add_deps("nlohmann_json", {configs = {cmake = true}})
  46. on_load(function (package)
  47. if package:config("openssl") then
  48. package:add("deps", "openssl")
  49. elseif package:config("mbedtls") then
  50. package:add("deps", "mbedtls")
  51. elseif package:config("curl") then
  52. package:add("deps", "libcurl")
  53. elseif package:config("nghttp2") then
  54. package:add("deps", "nghttp2")
  55. end
  56. if not package:config("shared") then
  57. package:add("defines", "HV_STATICLIB")
  58. end
  59. end)
  60. on_install("windows", "linux", "macosx", "android", "iphoneos", "mingw@windows", function(package)
  61. local configs = {"-DBUILD_EXAMPLES=OFF", "-DBUILD_UNITTEST=OFF"}
  62. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
  63. table.insert(configs, "-DBUILD_SHARED=" .. (package:config("shared") and "ON" or "OFF"))
  64. table.insert(configs, "-DBUILD_STATIC=" .. (package:config("shared") and "OFF" or "ON"))
  65. os.rm("cpputil/json.hpp")
  66. io.replace("cmake/vars.cmake", "cpputil/json.hpp", "", {plain = true})
  67. io.replace("CMakeLists.txt", [[target_link_libraries(hv ${LIBS})]],
  68. [[find_package(nlohmann_json CONFIG REQUIRED)
  69. target_link_libraries(hv ${LIBS} nlohmann_json::nlohmann_json)]], {plain = true})
  70. io.replace("CMakeLists.txt", [[target_link_libraries(hv_static ${LIBS})]],
  71. [[find_package(nlohmann_json CONFIG REQUIRED)
  72. target_link_libraries(hv_static ${LIBS} nlohmann_json::nlohmann_json)]], {plain = true})
  73. -- Fix PDB file installation issue for Windows static library builds
  74. io.replace("CMakeLists.txt",
  75. [[if(WIN32 AND NOT MINGW)
  76. install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
  77. endif()]],
  78. [[if(WIN32 AND NOT MINGW)
  79. if(BUILD_SHARED)
  80. install(FILES $<TARGET_PDB_FILE:hv> DESTINATION bin OPTIONAL)
  81. endif()
  82. endif()]], {plain = true})
  83. for _, suffix in ipairs({"**.h", "**.cpp"}) do
  84. for _, file in ipairs(os.files(suffix)) do
  85. io.replace(file, [[#include "json.hpp"]], [[#include <nlohmann/json.hpp>]], {plain = true})
  86. end
  87. end
  88. for _, name in ipairs({"with_protocol",
  89. "with_http",
  90. "with_http_server",
  91. "with_http_client",
  92. "with_consul",
  93. "with_curl",
  94. "with_nghttp2",
  95. "with_openssl",
  96. "with_mbedtls",
  97. "enable_ipv6",
  98. "enable_uds",
  99. "enable_windump",
  100. "use_multimap",
  101. "with_gnutls"}) do
  102. local config_name = name:gsub("with_", ""):gsub("use_", ""):gsub("enable_", "")
  103. table.insert(configs, "-D" .. name:upper() .. "=" .. (package:config(config_name) and "ON" or "OFF"))
  104. end
  105. local packagedeps = {}
  106. if package:config("openssl") then
  107. table.insert(packagedeps, "openssl")
  108. elseif package:config("mbedtls") then
  109. table.insert(packagedeps, "mbedtls")
  110. end
  111. if package:is_plat("iphoneos") then
  112. io.replace("ssl/appletls.c", "ret = SSLSetProtocolVersionEnabled(appletls->session, kSSLProtocolAll, true);",
  113. "ret = SSLSetProtocolVersionMin(appletls->session, kTLSProtocol12);", {plain = true})
  114. elseif package:is_plat("windows") and package:is_arch("arm.*") then
  115. io.replace("base/hplatform.h", "defined(__arm__)", "defined(__arm__) || defined(_M_ARM)", {plain = true})
  116. io.replace("base/hplatform.h", "defined(__aarch64__) || defined(__ARM64__)", "defined(__aarch64__) || defined(__ARM64__) || defined(_M_ARM64)", {plain = true})
  117. end
  118. import("package.tools.cmake").install(package, configs, {packagedeps = packagedeps})
  119. end)
  120. on_test(function(package)
  121. assert(package:has_cfuncs("hloop_new", {includes = "hv/hloop.h"}))
  122. assert(package:check_cxxsnippets({test = [[
  123. #include "hv/hv.h"
  124. void test() {
  125. const char* version = hv_compile_version();
  126. printf("%s\n", version);
  127. }
  128. ]]}, {configs = {languages = "c++11"}}))
  129. end)