conanfile.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import os
  2. from conan import ConanFile
  3. from conan.errors import ConanInvalidConfiguration
  4. from conan.tools.build import check_min_cppstd
  5. from conan.tools.scm import Version
  6. from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, rmdir, copy, mkdir
  7. from conan.tools.cmake import CMakeToolchain, CMake, CMakeDeps, cmake_layout
  8. required_conan_version = ">=1.52.0"
  9. class RotorConan(ConanFile):
  10. name = "rotor"
  11. license = "MIT"
  12. homepage = "https://github.com/basiliscos/cpp-rotor"
  13. url = "https://github.com/conan-io/conan-center-index"
  14. description = (
  15. "Event loop friendly C++ actor micro-framework, supervisable"
  16. )
  17. topics = ("concurrency", "actor-framework", "actors", "actor-model", "erlang", "supervising", "supervisor")
  18. exports_sources = "CMakeLists.txt", "src/*", "include/*", "test_package/*", "cmake/*", "tests/*", "examples/*"
  19. test_requires = "catch2/3.4.0"
  20. settings = "os", "arch", "compiler", "build_type"
  21. options = {
  22. "fPIC": [True, False],
  23. "shared": [True, False],
  24. "enable_asio": [True, False],
  25. "enable_ev" : [True, False],
  26. "enable_fltk" : [True, False],
  27. "enable_thread": [True, False],
  28. "multithreading": [True, False], # enables multithreading support
  29. }
  30. default_options = {
  31. "fPIC": True,
  32. "shared": False,
  33. "enable_asio": True,
  34. "enable_ev" : False,
  35. "enable_fltk" : False,
  36. "enable_thread": True,
  37. "multithreading": True,
  38. }
  39. def config_options(self):
  40. if self.settings.os == "Windows":
  41. del self.options.fPIC
  42. def configure(self):
  43. if self.options.shared:
  44. try:
  45. del self.options.fPIC
  46. except Exception:
  47. pass
  48. def requirements(self):
  49. self.requires("boost/1.84.0", transitive_headers=True)
  50. if self.options.enable_ev:
  51. self.requires("libev/4.33")
  52. if self.options.enable_fltk:
  53. self.requires("fltk/1.3.9")
  54. # def layout(self):
  55. # cmake_layout(self)
  56. def generate(self):
  57. tc = CMakeToolchain(self)
  58. tc.variables["BUILD_BOOST_ASIO"] = self.options.enable_asio
  59. tc.variables["BUILD_THREAD"] = self.options.enable_thread
  60. tc.variables["BUILD_EV"] = self.options.enable_ev
  61. tc.variables["BUILD_FLTK"] = self.options.enable_fltk
  62. tc.variables["BUILD_EXAMPLES"] = os.environ.get('ROTOR_BUILD_EXAMPLES', 'OFF')
  63. tc.variables["BUILD_THREAD_UNSAFE"] = not self.options.multithreading
  64. tc.variables["BUILD_TESTING"] = not self.conf.get("tools.build:skip_test", default=True, check_type=bool)
  65. tc.generate()
  66. tc = CMakeDeps(self)
  67. tc.generate()
  68. if (self.settings.os == "Windows"):
  69. bin_dir = os.path.join(self.build_folder, "bin")
  70. mkdir(self, bin_dir)
  71. for dep in self.dependencies.values():
  72. copy(self, "*.dll", dep.cpp_info.bindir, bin_dir)
  73. def validate(self):
  74. minimal_cpp_standard = "17"
  75. # if self.settings.compiler.get_safe("cppstd"):
  76. # check_min_cppstd(self, minimal_cpp_standard)
  77. minimal_version = {
  78. "gcc": "7",
  79. "clang": "6",
  80. "apple-clang": "10",
  81. "Visual Studio": "15"
  82. }
  83. compiler = str(self.settings.compiler)
  84. if compiler not in minimal_version:
  85. print(
  86. f"{self.ref} recipe lacks information about the {compiler} compiler standard version support")
  87. print(
  88. f"{self.ref} requires a compiler that supports at least C++{minimal_cpp_standard}")
  89. return
  90. compiler_version = Version(self.settings.compiler.version)
  91. if compiler_version < minimal_version[compiler]:
  92. raise ConanInvalidConfiguration(f"{self.ref} requires a compiler that supports at least C++{minimal_cpp_standard}")
  93. if self.options.shared and Version(self.version) < "0.23":
  94. raise ConanInvalidConfiguration("shared option is available from v0.23")
  95. def build(self):
  96. cmake = CMake(self)
  97. cmake.configure()
  98. cmake.build()
  99. if not self.conf.get("tools.build:skip_test", default=True):
  100. cmake.test()
  101. def package(self):
  102. copy(self, pattern="LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
  103. cmake = CMake(self)
  104. cmake.install()
  105. rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
  106. def package_info(self):
  107. self.cpp_info.components["core"].libs = ["rotor"]
  108. self.cpp_info.components["core"].requires = ["boost::date_time", "boost::system", "boost::regex"]
  109. if not self.options.multithreading:
  110. self.cpp_info.components["core"].defines.append("BUILD_THREAD_UNSAFE")
  111. if self.options.enable_asio:
  112. self.cpp_info.components["asio"].libs = ["rotor_asio"]
  113. self.cpp_info.components["asio"].requires = ["core"]
  114. if self.options.enable_thread:
  115. self.cpp_info.components["thread"].libs = ["rotor_thread"]
  116. self.cpp_info.components["thread"].requires = ["core"]
  117. if self.options.enable_ev:
  118. self.cpp_info.components["ev"].libs = ["rotor_ev"]
  119. self.cpp_info.components["ev"].requires = ["core", "libev::libev"]
  120. if self.options.enable_fltk:
  121. self.cpp_info.components["fltk"].libs = ["rotor_fltk"]
  122. self.cpp_info.components["fltk"].requires = ["core", "fltk::fltk"]