From 3fc7ecc316e48e86db93a16c9d4d2713368c4632 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 27 Sep 2024 12:12:26 +0200 Subject: [PATCH] build(conan): packaging improved --- conanfile.py | 82 +++++++++++++++++++++++-------------- test_package/CMakeLists.txt | 9 ---- test_package/conanfile.py | 2 +- 3 files changed, 53 insertions(+), 40 deletions(-) diff --git a/conanfile.py b/conanfile.py index d1170db4b..8edb7da74 100644 --- a/conanfile.py +++ b/conanfile.py @@ -72,7 +72,7 @@ class MPUnitsConan(ConanFile): "contracts": "gsl-lite", "freestanding": False, } - implements = "auto_header_only" + implements = ["auto_header_only"] exports = "LICENSE.md" exports_sources = ( "docs/*", @@ -305,40 +305,62 @@ def package(self): ) cmake = CMake(self) cmake.install() - rmdir(self, os.path.join(self.package_folder, "lib", "cmake")) + if not self.options.cxx_modules: + # We have to preserve those files for C++ modules build as Conan + # can't generate such CMake targets for now + rmdir(self, os.path.join(self.package_folder, "lib", "cmake")) def package_info(self): compiler = self.settings.compiler + if self.options.cxx_modules: + # CMakeDeps does not generate C++ modules definitions for now + # Skip the Conan-generated files and use the mp-unitsConfig.cmake bundled with mp-units + self.cpp_info.set_property("cmake_find_mode", "none") + self.cpp_info.builddirs = ["."] + else: + # handle contracts + if self.options.contracts == "none": + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_CONTRACTS=0" + ) + elif self.options.contracts == "gsl-lite": + self.cpp_info.components["core"].requires.append("gsl-lite::gsl-lite") + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_CONTRACTS=2" + ) + elif self.options.contracts == "ms-gsl": + self.cpp_info.components["core"].requires.append("ms-gsl::ms-gsl") + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_CONTRACTS=3" + ) - # handle contracts - if self.options.contracts == "none": - self.cpp_info.components["core"].defines.append("MP_UNITS_API_CONTRACTS=0") - elif self.options.contracts == "gsl-lite": - self.cpp_info.components["core"].requires.append("gsl-lite::gsl-lite") - self.cpp_info.components["core"].defines.append("MP_UNITS_API_CONTRACTS=2") - elif self.options.contracts == "ms-gsl": - self.cpp_info.components["core"].requires.append("ms-gsl::ms-gsl") - self.cpp_info.components["core"].defines.append("MP_UNITS_API_CONTRACTS=3") + # handle API options + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_STRING_VIEW_RET=" + + str(int(self.options.string_view_ret == True)) + ) + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_NO_CRTP=" + str(int(self.options.no_crtp == True)) + ) + self.cpp_info.components["core"].defines.append( + "MP_UNITS_API_STD_FORMAT=" + str(int(self.options.std_format == True)) + ) + if not self.options.std_format: + self.cpp_info.components["core"].requires.append("fmt::fmt") - # handle API options - self.cpp_info.components["core"].defines.append( - "MP_UNITS_API_STRING_VIEW_RET=" - + str(int(self.options.string_view_ret == True)) - ) - self.cpp_info.components["core"].defines.append( - "MP_UNITS_API_NO_CRTP=" + str(int(self.options.no_crtp == True)) - ) - self.cpp_info.components["core"].defines.append( - "MP_UNITS_API_STD_FORMAT=" + str(int(self.options.std_format == True)) - ) - if not self.options.std_format: - self.cpp_info.components["core"].requires.append("fmt::fmt") + # handle hosted configuration + if not self.options.freestanding: + self.cpp_info.components["core"].defines.append("MP_UNITS_HOSTED=1") - # handle hosted configuration - if not self.options.freestanding: - self.cpp_info.components["core"].defines.append("MP_UNITS_HOSTED=1") + # handle import std + if self.options.import_std: + self.cpp_info.components["core"].defines.append("MP_UNITS_IMPORT_STD") + if compiler == "clang" and Version(compiler.version) < 19: + self.cpp_info.components["core"].cxxflags.append( + "-Wno-deprecated-declarations" + ) - if compiler == "msvc": - self.cpp_info.components["core"].cxxflags = ["/utf-8"] + if compiler == "msvc": + self.cpp_info.components["core"].cxxflags.append("/utf-8") - self.cpp_info.components["systems"].requires = ["core"] + self.cpp_info.components["systems"].requires = ["core"] diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt index 8e11064e6..e57d1d8b3 100644 --- a/test_package/CMakeLists.txt +++ b/test_package/CMakeLists.txt @@ -27,12 +27,3 @@ find_package(mp-units REQUIRED) add_executable(test_package test_package.cpp) target_link_libraries(test_package PRIVATE mp-units::mp-units) -target_compile_definitions(test_package PRIVATE MP_UNITS_API_STD_FORMAT=$) - -if(MP_UNITS_API_CONTRACTS STREQUAL "NONE") - target_compile_definitions(test_package PRIVATE MP_UNITS_API_CONTRACTS=0) -elseif(MP_UNITS_API_CONTRACTS STREQUAL "GSL-LITE") - target_compile_definitions(test_package PRIVATE MP_UNITS_API_CONTRACTS=2) -elseif(MP_UNITS_API_CONTRACTS STREQUAL "MS-GSL") - target_compile_definitions(test_package PRIVATE MP_UNITS_API_CONTRACTS=3) -endif() diff --git a/test_package/conanfile.py b/test_package/conanfile.py index d0ea23692..c66b17414 100644 --- a/test_package/conanfile.py +++ b/test_package/conanfile.py @@ -42,13 +42,13 @@ def generate(self): opt = self.dependencies["mp-units"].options if opt.cxx_modules: tc.cache_variables["CMAKE_CXX_SCAN_FOR_MODULES"] = True - tc.cache_variables["MP_UNITS_BUILD_CXX_MODULES"] = True if opt.import_std: tc.cache_variables["CMAKE_CXX_MODULE_STD"] = True # Current experimental support according to `Help/dev/experimental.rst` tc.cache_variables[ "CMAKE_EXPERIMENTAL_CXX_IMPORT_STD" ] = "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + # TODO remove the below when Conan will learn to handle C++ modules if opt.freestanding: tc.cache_variables["MP_UNITS_API_FREESTANDING"] = True else: