xmake.lua 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package("scnlib")
  2. set_homepage("https://scnlib.readthedocs.io/")
  3. set_description("scnlib is a modern C++ library for replacing scanf and std::istream")
  4. set_license("Apache-2.0")
  5. add_urls("https://github.com/eliaskosunen/scnlib/archive/refs/tags/$(version).tar.gz",
  6. "https://github.com/eliaskosunen/scnlib.git")
  7. add_versions("v3.0.1", "bc8a668873601d00cce6841c2d0f2c93f836f63f0fbc77997834dea12e951eb1")
  8. add_versions("v2.0.3", "507ed0e988f1d9460a9c921fc21f5a5244185a4015942f235522fbe5c21e6a51")
  9. add_versions("v2.0.2", "a485076b8710576cf05fbc086d39499d16804575c0660b0dfaeeaf7823660a17")
  10. add_versions("v1.1.2", "5ed3ec742302c7304bf188bde9c4012a65dc8124ff4e1a69b598480d664250e6")
  11. add_versions("v0.4", "f23e66b00c9d38671b39b83c082a5b2db1cf05b3e3eff7b4a769487d9ed9d366")
  12. add_configs("header_only", {description = "Use header only version. (deprecated after v2.0.0)", default = false, type = "boolean"})
  13. add_configs("exceptions", {description = "Enable exception handling", default = true, type = "boolean"})
  14. add_configs("rtti", {description = "Enable rtti", default = true, type = "boolean"})
  15. add_configs("regex", {description = "Regex backend to use", type = "string", values = {"std", "boost", "re2"}})
  16. add_deps("fast_float")
  17. on_check("windows", function (package)
  18. import("core.tool.toolchain")
  19. import("core.base.semver")
  20. if package:version():ge("2.0.3") and package:is_arch("arm.*") then
  21. local msvc = toolchain.load("msvc", {plat = package:plat(), arch = package:arch()})
  22. if msvc then
  23. local vs_sdkver = msvc:config("vs_sdkver")
  24. assert(vs_sdkver and semver.match(vs_sdkver):gt("10.0.19041"), "package(scnlib): need vs_sdkver > 10.0.19041.0")
  25. end
  26. end
  27. end)
  28. on_load(function (package)
  29. if package:config("header_only") and package:version():lt("2.0.0") then
  30. package:set("kind", "library", {headeronly = true})
  31. package:add("defines", "SCN_HEADER_ONLY=1")
  32. else
  33. package:add("deps", "cmake")
  34. end
  35. if package:version():ge("2.0.3") then
  36. package:add("links", "scn", "simdutf")
  37. else
  38. package:add("deps", "simdutf")
  39. end
  40. local regex = package:config("regex")
  41. if regex and regex ~= "std" then
  42. package:add("deps", regex)
  43. end
  44. end)
  45. on_install("!android and !iphoneos and !wasm", function (package)
  46. if package:config("header_only") and package:version():lt("2.0.0") then
  47. os.cp("include/scn", package:installdir("include"))
  48. return
  49. end
  50. local configs = {
  51. "-DSCN_DISABLE_TOP_PROJECT=ON",
  52. "-DSCN_INSTALL=ON",
  53. "-DSCN_TESTS=OFF",
  54. "-DSCN_DOCS=OFF",
  55. "-DSCN_EXAMPLES=OFF",
  56. "-DSCN_BENCHMARKS=OFF",
  57. "-DSCN_PENDANTIC=OFF",
  58. "-DSCN_BUILD_FUZZING=OFF",
  59. "-DSCN_USE_EXTERNAL_FAST_FLOAT=ON"
  60. }
  61. if package:version():le("2.0.2") then
  62. io.replace("cmake/dependencies.cmake", "simdutf 4.0.0", "simdutf", {plain = true})
  63. table.insert(configs, "-DSCN_USE_EXTERNAL_SIMDUTF=ON")
  64. end
  65. local regex = package:config("regex")
  66. if regex then
  67. table.insert(configs, "-DSCN_DISABLE_REGEX=OFF")
  68. if regex == "boost" then
  69. regex = "Boost"
  70. end
  71. table.insert(configs, "-DSCN_REGEX_BACKEND=" .. regex)
  72. else
  73. table.insert(configs, "-DSCN_DISABLE_REGEX=ON")
  74. end
  75. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
  76. table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
  77. table.insert(configs, "-DSCN_USE_EXCEPTIONS=" .. (package:config("exceptions") and "ON" or "OFF"))
  78. table.insert(configs, "-DSCN_USE_RTTI=" .. (package:config("rtti") and "ON" or "OFF"))
  79. if package:is_plat("windows") then
  80. table.insert(configs, "-DCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY=''")
  81. if package:config("shared") then
  82. table.insert(configs, "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON")
  83. end
  84. end
  85. import("package.tools.cmake").install(package, configs)
  86. end)
  87. on_test(function (package)
  88. assert(package:check_cxxsnippets({test = [[
  89. void test() {
  90. if (const auto result = scn::prompt<int>("What's your favorite number? ", "{}")) {
  91. std::printf("%d, interesting\n", result->value());
  92. }
  93. }
  94. ]]}, {configs = {languages = "c++17"}, includes = "scn/scan.h"}))
  95. end)