xmake.lua 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package("fruit")
  2. set_homepage("https://github.com/google/fruit/wiki")
  3. set_description("Fruit, a dependency injection framework for C++")
  4. set_license("Apache-2.0")
  5. add_urls("https://github.com/google/fruit/archive/refs/tags/$(version).tar.gz",
  6. "https://github.com/google/fruit.git")
  7. add_versions("v3.7.0", "134d65c8e6dff204aeb771058c219dcd9a353853e30a3961a5d17a6cff434a09")
  8. add_versions("v3.7.1", "ed4c6b7ebfbf75e14a74e21eb74ce2703b8485bfc9e660b1c36fb7fe363172d0")
  9. add_configs("boost", {description = "Whether to use Boost (specifically, boost::unordered_set and boost::unordered_map).If this is false, Fruit will use std::unordered_set and std::unordered_map instead (however this causes injection to be a bit slower).", default = false, type = "boolean"})
  10. if is_plat("linux") then
  11. add_syslinks("m")
  12. end
  13. add_deps("cmake")
  14. on_load(function (package)
  15. if package:config("boost") then
  16. package:add("deps", "boost")
  17. end
  18. end)
  19. on_install(function (package)
  20. local configs = {"-DFRUIT_ENABLE_COVERAGE=OFF", "-DRUN_TESTS_UNDER_VALGRIND=OFF"}
  21. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
  22. table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
  23. table.insert(configs, "-DFRUIT_USES_BOOST=" .. (package:config("boost") and "ON" or "OFF"))
  24. io.replace("CMakeLists.txt", "add_subdirectory(tests)", "", {plain = true})
  25. import("package.tools.cmake").install(package, configs)
  26. end)
  27. on_test(function (package)
  28. assert(package:check_cxxsnippets({test = [[
  29. #include <fruit/fruit.h>
  30. class Writer {
  31. public:
  32. virtual void write(std::string s) = 0;
  33. };
  34. class StdoutWriter : public Writer {
  35. public:
  36. INJECT(StdoutWriter()) = default;
  37. virtual void write(std::string s) override {}
  38. };
  39. class Greeter {
  40. public:
  41. virtual void greet() = 0;
  42. };
  43. class GreeterImpl : public Greeter {
  44. private:
  45. Writer* writer;
  46. public:
  47. INJECT(GreeterImpl(Writer* writer)) : writer(writer) {}
  48. virtual void greet() override {
  49. writer->write("Hello world!\n");
  50. }
  51. };
  52. fruit::Component<Greeter> test() {
  53. return fruit::createComponent()
  54. .bind<Writer, StdoutWriter>()
  55. .bind<Greeter, GreeterImpl>();
  56. }
  57. ]]}, {configs = {languages = "c++11"}}))
  58. end)