diff --git a/recipes/qtils/all/conandata.yml b/recipes/qtils/all/conandata.yml new file mode 100644 index 0000000000000..50f734725d452 --- /dev/null +++ b/recipes/qtils/all/conandata.yml @@ -0,0 +1,4 @@ +sources: + "0.0.4": + url: "https://github.com/qdrvm/qtils/archive/refs/tags/v0.0.4.tar.gz" + sha256: "8b1ab41da75ed76729e53a728d9f97520bc2987757a1f701a20638479b451027" \ No newline at end of file diff --git a/recipes/qtils/all/conanfile.py b/recipes/qtils/all/conanfile.py new file mode 100644 index 0000000000000..15b8e245381c8 --- /dev/null +++ b/recipes/qtils/all/conanfile.py @@ -0,0 +1,113 @@ +from conan import ConanFile +from conan.errors import ConanInvalidConfiguration +from conan.tools.build import check_min_cppstd +from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get +from conan.tools.layout import basic_layout +from conan.tools.scm import Version +import os + + +required_conan_version = ">=1.53.0" + +class PackageConan(ConanFile): + name = "qtils" + version = "0.0.4" + description = "Utils for KAGOME C++ projects" + license = "MIT" + url = "https://github.com/conan-io/conan-center-index" + homepage = "https://github.com/qdrvm/qtils" + topics = ("KAGOME", "header-only") + package_type = "header-library" + settings = "os", "compiler", "build_type", "arch" + options = {} + default_options = {} + no_copy_source = True + + @property + def _min_cppstd(self): + return 20 + + @property + def _compilers_minimum_version(self): + return { + "apple-clang": "11", + "clang": "10", + "gcc": "10", + "msvc": "192", + "Visual Studio": "16", + } + + def export_sources(self): + export_conandata_patches(self) + + def layout(self): + basic_layout(self, src_folder="src") + + def requirements(self): + self.requires("boost/1.84.0", transitive_headers=True) + self.requires("fmt/10.1.1", transitive_headers=True) + + def package_id(self): + self.info.clear() + + def validate(self): + if self.settings.compiler.get_safe("cppstd"): + check_min_cppstd(self, self._min_cppstd) + minimum_version = self._compilers_minimum_version.get(str(self.settings.compiler), False) + if minimum_version and Version(self.settings.compiler.version) < minimum_version: + raise ConanInvalidConfiguration( + f"{self.ref} requires C++{self._min_cppstd}, which your compiler does not support." + ) + if self.settings.os == "Windows": + raise ConanInvalidConfiguration( + f"{self.ref} can not be used on Windows due to platform-specific dependencies." + ) + + if self.dependencies["boost"].ref.version < "1.74.0": + raise ConanInvalidConfiguration( + f"{self.ref} requires Boost >= 1.74.0" + ) + + if self.dependencies["fmt"].ref.version < "8.0.0": + raise ConanInvalidConfiguration( + f"{self.ref} requires fmt >= 8.0.0" + ) + + if self.settings.compiler.get_safe("cppstd") and \ + Version(str(self.settings.compiler.cppstd)) < "20": + raise ConanInvalidConfiguration( + f"{self.ref} requires C++20 or higher for std::span and concepts support" + ) + + def source(self): + get(self, **self.conan_data["sources"][self.version], strip_root=True) + + def build(self): + apply_conandata_patches(self) + + def package(self): + copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses")) + copy( + self, + "*.hpp", + os.path.join(self.source_folder, "src"), + os.path.join(self.package_folder, "include"), + ) + + def package_info(self): + self.cpp_info.bindirs = [] + self.cpp_info.libdirs = [] + + self.cpp_info.set_property("cmake_file_name", "qtils") + self.cpp_info.set_property("cmake_target_name", "qtils::qtils") + self.cpp_info.set_property("pkg_config_name", "qtils") + + self.cpp_info.defines = [] + + if self.settings.os in ["Linux", "FreeBSD"]: + self.cpp_info.system_libs.extend(["dl", "m", "pthread"]) + + self.cpp_info.filenames["cmake_find_package"] = "qtils" + self.cpp_info.filenames["cmake_find_package_multi"] = "qtils" + self.cpp_info.names["cmake_find_package"] = "qtils" + self.cpp_info.names["cmake_find_package_multi"] = "qtils" diff --git a/recipes/qtils/all/test_package/CMakeLists.txt b/recipes/qtils/all/test_package/CMakeLists.txt new file mode 100644 index 0000000000000..02a9e2c4915bc --- /dev/null +++ b/recipes/qtils/all/test_package/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.15) +project(test_package CXX) + +find_package(qtils REQUIRED CONFIG) +find_package(Boost REQUIRED) +find_package(fmt REQUIRED CONFIG) + +add_executable(${PROJECT_NAME} test_package.cpp) +target_link_libraries(${PROJECT_NAME} PRIVATE qtils::qtils fmt::fmt Boost::boost) +set_target_properties(${PROJECT_NAME} PROPERTIES + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED ON +) diff --git a/recipes/qtils/all/test_package/conanfile.py b/recipes/qtils/all/test_package/conanfile.py new file mode 100644 index 0000000000000..875cb4e0da4d7 --- /dev/null +++ b/recipes/qtils/all/test_package/conanfile.py @@ -0,0 +1,47 @@ +from conan import ConanFile +from conan.errors import ConanInvalidConfiguration +from conan.tools.build import can_run, check_min_cppstd +from conan.tools.cmake import cmake_layout, CMake +from conan.tools.scm import Version +import os + + +class TestPackageConan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + generators = "CMakeDeps", "CMakeToolchain", "VirtualRunEnv" + test_type = "explicit" + + def validate(self): + if self.settings.compiler.get_safe("cppstd"): + check_min_cppstd(self, 20) # 与主包保持一致 + + # 验证编译器版本 + minimum_version = { + "apple-clang": "11", + "clang": "10", + "gcc": "10", + "msvc": "192", + "Visual Studio": "16", + } + compiler = str(self.settings.compiler) + version = str(self.settings.compiler.version) + if compiler in minimum_version and Version(version) < minimum_version[compiler]: + raise ConanInvalidConfiguration( + f"{self.ref} requires {compiler} >= {minimum_version[compiler]}" + ) + + def layout(self): + cmake_layout(self) + + def requirements(self): + self.requires(self.tested_reference_str) + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if can_run(self): + bin_path = os.path.join(self.cpp.build.bindir, "test_package") + self.run(bin_path, env="conanrun") diff --git a/recipes/qtils/all/test_package/test_package.cpp b/recipes/qtils/all/test_package/test_package.cpp new file mode 100644 index 0000000000000..cc9b11f7686b1 --- /dev/null +++ b/recipes/qtils/all/test_package/test_package.cpp @@ -0,0 +1,18 @@ +#include +#include +#include +#include +#include +#include + +int main() { + std::string test_str = "Hello Qtils!"; + std::vector data(test_str.begin(), test_str.end()); + + // Test hex formatting using span + std::span input_span(data); + qtils::Hex hex{input_span}; + std::cout << fmt::format("{}", hex) << std::endl; + + return 0; +} diff --git a/recipes/qtils/config.yml b/recipes/qtils/config.yml new file mode 100644 index 0000000000000..0bc8caaa47adc --- /dev/null +++ b/recipes/qtils/config.yml @@ -0,0 +1,4 @@ +versions: + "0.0.4": + folder: all +