xmake.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package("acl-dev")
  2. set_homepage("https://acl-dev.cn")
  3. set_description("C/C++ server and network library, including coroutine, redis client, http/https/websocket, mqtt, mysql/postgresql/sqlite client with C/C++ for Linux, Android, iOS, MacOS, Windows.")
  4. set_license("LGPL-3.0")
  5. add_urls("https://github.com/acl-dev/acl/archive/refs/tags/$(version).tar.gz",
  6. "https://github.com/acl-dev/acl.git")
  7. add_versions("v3.6.2", "888fd9b8fb19db4f8e7760a12a28f37f24ba0a2952bb0409b8380413a4b6506b")
  8. add_includedirs("include", "include/acl-lib")
  9. add_deps("cmake")
  10. if not is_plat("windows") then
  11. add_links("protocol", "acl_cpp", "fiber_cpp", "fiber", "acl")
  12. end
  13. if not is_plat("windows") then
  14. add_deps("zlib")
  15. end
  16. if is_plat("iphoneos", "macosx", "bsd") then
  17. add_deps("libiconv")
  18. end
  19. if is_plat("windows") then
  20. add_syslinks("ws2_32", "iphlpapi", "kernel32", "user32", "gdi32")
  21. elseif is_plat("linux", "bsd", "cross") then
  22. add_syslinks("pthread", "dl")
  23. end
  24. on_load(function (package)
  25. if package:is_plat("android") then
  26. package:add("defines", "ANDROID")
  27. elseif package:is_plat("macosx") then
  28. package:add("defines", "MACOSX")
  29. elseif package:is_plat("linux", "cross") then
  30. package:add("defines", "LINUX2")
  31. elseif package:is_plat("bsd") then
  32. package:add("defines", "FREEBSD")
  33. end
  34. end)
  35. on_install("android", "iphoneos", "macosx", "linux", "cross", "bsd", "windows", function (package)
  36. io.replace("lib_acl/include/stdlib/acl_define_unix.h", "# define ACL_API",
  37. "#if defined(__GNUC__)\n#define ACL_API __attribute__((visibility(\"default\")))\n#else\n# define ACL_API\n#endif", {plain = true})
  38. io.replace("lib_acl/include/stdlib/acl_define_win32.h", "# define ACL_API",
  39. "#if defined(__GNUC__)\n#define ACL_API __attribute__((visibility(\"default\")))\n#else\n# define ACL_API\n#endif", {plain = true})
  40. -- Build & install only shared or only static library
  41. if package:config("shared") then
  42. io.replace("lib_fiber/c/CMakeLists.txt", "add_library(fiber_static STATIC ${lib_src})",
  43. "add_library(fiber_static STATIC ${lib_src})\nset_target_properties(fiber_static PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  44. io.replace("lib_fiber/c/CMakeLists.txt", "install%(TARGETS fiber_static.-%)", "")
  45. io.replace("lib_fiber/cpp/CMakeLists.txt", "add_library(fiber_cpp_static STATIC ${lib_src})",
  46. "add_library(fiber_cpp_static STATIC ${lib_src})\nset_target_properties(fiber_cpp_static PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  47. io.replace("lib_fiber/cpp/CMakeLists.txt", "install%(TARGETS fiber_cpp_static.-%)", "")
  48. io.replace("lib_protocol/CMakeLists.txt", "add_library(protocol_static STATIC ${lib_src})",
  49. "add_library(protocol_static STATIC ${lib_src})\nset_target_properties(protocol_static PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  50. io.replace("lib_protocol/CMakeLists.txt", "install%(TARGETS protocol_static.-%)", "")
  51. io.replace("lib_acl_cpp/CMakeLists.txt", "add_library(acl_cpp_static STATIC ${lib_src})",
  52. "add_library(acl_cpp_static STATIC ${lib_src})\nset_target_properties(acl_cpp_static PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  53. io.replace("lib_acl_cpp/CMakeLists.txt", "install%(TARGETS acl_cpp_static.-%)", "")
  54. io.replace("lib_acl/CMakeLists.txt", "add_library(acl_static STATIC ${acl_src})",
  55. "add_library(acl_static STATIC ${acl_src})\nset_target_properties(acl_static PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  56. io.replace("lib_acl/CMakeLists.txt", "install%(TARGETS acl_static.-%)", "")
  57. else
  58. io.replace("lib_fiber/c/CMakeLists.txt", "add_library(fiber_shared SHARED ${lib_src})",
  59. "add_library(fiber_shared SHARED ${lib_src})\nset_target_properties(fiber_shared PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  60. io.replace("lib_fiber/c/CMakeLists.txt", "install%(TARGETS fiber_shared.-%)", "")
  61. io.replace("lib_fiber/cpp/CMakeLists.txt", "add_library(fiber_cpp_shared SHARED ${lib_src})",
  62. "add_library(fiber_cpp_shared SHARED ${lib_src})\nset_target_properties(fiber_cpp_shared PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  63. io.replace("lib_fiber/cpp/CMakeLists.txt", "install%(TARGETS fiber_cpp_shared.-%)", "")
  64. io.replace("lib_protocol/CMakeLists.txt", "add_library(protocol_shared SHARED ${lib_src})",
  65. "add_library(protocol_shared SHARED ${lib_src})\nset_target_properties(protocol_shared PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  66. io.replace("lib_protocol/CMakeLists.txt", "install%(TARGETS protocol_shared.-%)", "")
  67. io.replace("lib_acl_cpp/CMakeLists.txt", "add_library(acl_cpp_shared SHARED ${lib_src})",
  68. "add_library(acl_cpp_shared SHARED ${lib_src})\nset_target_properties(acl_cpp_shared PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  69. io.replace("lib_acl_cpp/CMakeLists.txt", "install%(TARGETS acl_cpp_shared.-%)", "")
  70. io.replace("lib_acl/CMakeLists.txt", "add_library(acl_shared SHARED ${acl_src})",
  71. "add_library(acl_shared SHARED ${acl_src})\nset_target_properties(acl_shared PROPERTIES EXCLUDE_FROM_ALL 1)", {plain = true})
  72. io.replace("lib_acl/CMakeLists.txt", "install%(TARGETS acl_shared.-%)", "")
  73. end
  74. -- Fix install path for android
  75. io.replace("lib_protocol/CMakeLists.txt", [[set(lib_output_path ${CMAKE_CURRENT_SOURCE_DIR}/../android/lib/${ANDROID_ABI})]], [[set(lib_output_path ${PROJECT_BINARY_DIR}/../lib)]], {plain = true})
  76. io.replace("lib_fiber/cpp/CMakeLists.txt", [[set(lib_output_path ${CMAKE_CURRENT_SOURCE_DIR}/../../android/lib/${ANDROID_ABI})]], [[set(lib_output_path ${PROJECT_BINARY_DIR}/../lib)]], {plain = true})
  77. io.replace("lib_fiber/c/CMakeLists.txt", [[set(lib_output_path ${CMAKE_CURRENT_SOURCE_DIR}/../../android/lib/${ANDROID_ABI})]], [[set(lib_output_path ${PROJECT_BINARY_DIR}/../lib)]], {plain = true})
  78. io.replace("lib_acl_cpp/CMakeLists.txt", [[set(lib_output_path ${CMAKE_CURRENT_SOURCE_DIR}/../android/lib/${ANDROID_ABI})]], [[set(lib_output_path ${PROJECT_BINARY_DIR}/../lib)]], {plain = true})
  79. io.replace("lib_acl/CMakeLists.txt", [[set(acl_output_path ${CMAKE_CURRENT_SOURCE_DIR}/../android/lib/${ANDROID_ABI})]], [[set(acl_output_path ${PROJECT_BINARY_DIR}/../lib)]], {plain = true})
  80. -- Fix windows .pch file
  81. io.replace("lib_acl_cpp/CMakeLists.txt", [["-Ycacl_stdafx.hpp"]], [[]], {plain = true})
  82. io.replace("lib_acl_cpp/CMakeLists.txt", [[add_library(acl_cpp_static STATIC ${lib_src})]],
  83. "add_library(acl_cpp_static STATIC ${lib_src})\ntarget_precompile_headers(acl_cpp_static PRIVATE src/acl_stdafx.hpp)", {plain = true})
  84. io.replace("lib_acl_cpp/CMakeLists.txt", [[add_library(acl_cpp_shared SHARED ${lib_src})]],
  85. "add_library(acl_cpp_shared SHARED ${lib_src})\ntarget_precompile_headers(acl_cpp_shared PRIVATE src/acl_stdafx.hpp)", {plain = true})
  86. -- Do not build .gas on windows
  87. if package:is_plat("windows") then
  88. io.replace("lib_fiber/c/CMakeLists.txt", [[list(APPEND lib_src ${src}/fiber/boost/make_gas.S]], [[]], {plain = true})
  89. io.replace("lib_fiber/c/CMakeLists.txt", [[${src}/fiber/boost/jump_gas.S)]], [[]], {plain = true})
  90. end
  91. -- Disable -Wstrict-prototypes -Werror -Qunused-arguments
  92. for _, file in ipairs(os.files("**.txt")) do
  93. io.replace(file, [["-Wstrict-prototypes"]], "", {plain = true})
  94. io.replace(file, [["-Werror"]], "", {plain = true})
  95. io.replace(file, [[-Qunused-arguments]], [[]], {plain = true})
  96. -- Enforce install of lib for Android/FreeBSD
  97. io.replace(file, [[(CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")]],
  98. [[(CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin" OR CMAKE_SYSTEM_NAME MATCHES "Android" OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")]], {plain = true})
  99. -- Do not enforce LTO
  100. io.replace(file, [[add_definitions("-flto")]], [[]], {plain = true})
  101. io.replace(file, [[-flto]], [[]], {plain = true})
  102. end
  103. if not package:is_plat("windows") then
  104. -- Use zlib instead z
  105. io.replace("CMakeLists.txt", "project(acl)", "project(acl)\nfind_package(ZLIB)", {plain = true})
  106. io.replace("lib_acl_cpp/CMakeLists.txt", "-lz", "", {plain = true})
  107. io.replace("lib_acl_cpp/CMakeLists.txt", "target_link_libraries(acl_cpp_shared protocol acl)", "target_link_libraries(acl_cpp_shared protocol acl ZLIB::ZLIB)", {plain = true})
  108. io.replace("lib_acl_cpp/CMakeLists.txt", "add_library(acl_cpp_static STATIC ${lib_src})", "add_library(acl_cpp_static STATIC ${lib_src})\ntarget_link_libraries(acl_cpp_static ZLIB::ZLIB)", {plain = true})
  109. io.replace("lib_protocol/CMakeLists.txt", "-lz", "", {plain = true})
  110. io.replace("lib_protocol/CMakeLists.txt", "target_link_libraries(protocol_shared acl)", "target_link_libraries(protocol_shared acl ZLIB::ZLIB)", {plain = true})
  111. io.replace("lib_protocol/CMakeLists.txt", "add_library(protocol_static STATIC ${lib_src})", "add_library(protocol_static STATIC ${lib_src})\ntarget_link_libraries(protocol_static ZLIB::ZLIB)", {plain = true})
  112. io.replace("lib_fiber/cpp/CMakeLists.txt", "-lz", "", {plain = true})
  113. io.replace("lib_fiber/cpp/CMakeLists.txt", "target_link_libraries(fiber_cpp_shared acl_cpp protocol acl fiber)", "target_link_libraries(fiber_cpp_shared acl_cpp protocol acl fiber ZLIB::ZLIB)", {plain = true})
  114. io.replace("lib_fiber/cpp/CMakeLists.txt", "add_library(fiber_cpp_static STATIC ${lib_src})", "add_library(fiber_cpp_static STATIC ${lib_src})\ntarget_link_libraries(fiber_cpp_static ZLIB::ZLIB)", {plain = true})
  115. -- FreeBSD enforce fallback to system iconv
  116. io.replace("lib_acl_cpp/CMakeLists.txt", [[elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")]],
  117. [[elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  118. add_definitions("-DUSE_SYS_ICONV")]], {plain = true})
  119. if package:is_plat("iphoneos", "macosx", "bsd") then
  120. -- Use libiconv instead iconv
  121. io.replace("lib_acl_cpp/CMakeLists.txt", "-liconv", "", {plain = true})
  122. io.replace("lib_fiber/cpp/CMakeLists.txt", "-liconv", "", {plain = true})
  123. io.replace("CMakeLists.txt", "project(acl)", "project(acl)\nfind_package(Iconv)", {plain = true})
  124. io.replace("lib_acl_cpp/CMakeLists.txt", "ZLIB::ZLIB", "ZLIB::ZLIB Iconv::Iconv", {plain = true})
  125. io.replace("lib_fiber/cpp/CMakeLists.txt", "ZLIB::ZLIB", "ZLIB::ZLIB Iconv::Iconv", {plain = true})
  126. end
  127. end
  128. local configs = {"-DCMAKE_POLICY_DEFAULT_CMP0057=NEW"}
  129. if package:is_plat("iphoneos") then
  130. table.insert(configs, "-DCMAKE_SYSTEM_NAME=Darwin")
  131. end
  132. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "DEBUG" or "RELEASE"))
  133. table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
  134. table.insert(configs, "-DACL_BUILD_SHARED=" .. (package:config("shared") and "YES" or "NO"))
  135. import("package.tools.cmake").install(package, configs)
  136. if package:is_plat("windows") then
  137. if package:config("shared") then
  138. os.vcp(path.join(package:buildir(), "*/shared/**.lib"), package:installdir("lib"))
  139. os.vcp(path.join(package:buildir(), "*/shared/**.dll"), package:installdir("bin"))
  140. else
  141. os.vcp(path.join(package:buildir(), "*/static/**.lib"), package:installdir("lib"))
  142. end
  143. end
  144. end)
  145. on_test(function (package)
  146. assert(package:has_cfuncs("acl_fiber_recv", {includes = "fiber/lib_fiber.h"}))
  147. assert(package:check_cxxsnippets({test = [[
  148. void test() {
  149. const char* redis_addr = "127.0.0.1:7000";
  150. int max_conns = 100;
  151. acl::redis_client_cluster cluster;
  152. cluster.set(redis_addr, max_conns);
  153. }
  154. ]]}, {includes = "acl_cpp/lib_acl.hpp"}))
  155. end)