From 84d076b25bfc56417075ee00d90218adaa078938 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 20 Jul 2023 23:17:21 +0300 Subject: [PATCH] pangomm: migrate to Conan v2 --- recipes/pangomm/all/conandata.yml | 4 - recipes/pangomm/all/conanfile.py | 219 ++++++++---------- .../pangomm/all/test_package/CMakeLists.txt | 7 +- recipes/pangomm/all/test_package/conanfile.py | 19 +- .../all/test_v1_package/CMakeLists.txt | 8 + .../pangomm/all/test_v1_package/conanfile.py | 17 ++ 6 files changed, 137 insertions(+), 137 deletions(-) create mode 100644 recipes/pangomm/all/test_v1_package/CMakeLists.txt create mode 100644 recipes/pangomm/all/test_v1_package/conanfile.py diff --git a/recipes/pangomm/all/conandata.yml b/recipes/pangomm/all/conandata.yml index 9a20d26f2b3c6..bf21d709c66f8 100644 --- a/recipes/pangomm/all/conandata.yml +++ b/recipes/pangomm/all/conandata.yml @@ -8,11 +8,7 @@ sources: patches: "2.50.0": - patch_file: "patches/enable_static_libs_2_50_0.patch" - base_path: "source_subfolder" - patch_file: "patches/fix_exporting_pango_init.patch" - base_path: "source_subfolder" "2.46.2": - patch_file: "patches/enable_static_libs_2_46_2.patch" - base_path: "source_subfolder" - patch_file: "patches/fix_exporting_pango_init.patch" - base_path: "source_subfolder" diff --git a/recipes/pangomm/all/conanfile.py b/recipes/pangomm/all/conanfile.py index d7541583cf89d..96527e5a010b0 100644 --- a/recipes/pangomm/all/conanfile.py +++ b/recipes/pangomm/all/conanfile.py @@ -1,101 +1,117 @@ -from conans import ConanFile, Meson, tools -from conan.tools.files import rename -from conan.tools.microsoft import is_msvc -from conans.errors import ConanInvalidConfiguration import os -import shutil + +from conan import ConanFile +from conan.errors import ConanInvalidConfiguration +from conan.tools.build import check_min_cppstd, cross_building +from conan.tools.env import VirtualBuildEnv +from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rename, replace_in_file, rm, rmdir +from conan.tools.gnu import PkgConfigDeps +from conan.tools.layout import basic_layout +from conan.tools.meson import MesonToolchain, Meson +from conan.tools.microsoft import is_msvc +from conan.tools.scm import Version + +required_conan_version = ">=1.53.0" class PangommConan(ConanFile): name = "pangomm" - homepage = "https://gitlab.gnome.org/GNOME/pangomm" + description = "pangomm is a C++ API for Pango: a library for layout and rendering of text." license = "LGPL-2.1" url = "https://github.com/conan-io/conan-center-index" - description = "pangomm is a C++ API for Pango: a library for layout and rendering of text." - topics = ["pango", "wrapper", "text rendering", "fonts", "freedesktop"] - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - generators = "pkg_config" - exports_sources = "patches/**" + homepage = "https://gitlab.gnome.org/GNOME/pangomm" + topics = "pango", "wrapper", "text rendering", "fonts", "freedesktop" + + package_type = "library" + settings = "os", "arch", "compiler", "build_type" + options = { + "shared": [True, False], + "fPIC": [True, False], + } + default_options = { + "shared": False, + "fPIC": True, + } @property def _is_2_48_api(self): - return tools.Version(self.version) >= "2.48.0" + return Version(self.version) >= "2.48.0" @property def _is_1_4_api(self): - return tools.Version(self.version) >= "1.4.0" and tools.Version( - self.version) < "2.48.0" + return "1.4.0" <= Version(self.version) < "2.48.0" @property def _api_version(self): return "2.48" if self._is_2_48_api else "1.4" - def validate(self): - if hasattr(self, "settings_build") and tools.cross_building(self): - raise ConanInvalidConfiguration("Cross-building not implemented") - - if self.settings.compiler.get_safe("cppstd"): - if self._is_2_48_api: - tools.check_min_cppstd(self, 17) - elif self._is_1_4_api: - tools.check_min_cppstd(self, 11) - - @property - def _source_subfolder(self): - return "source_subfolder" - - @property - def _build_subfolder(self): - return "build_subfolder" + def export_sources(self): + export_conandata_patches(self) def config_options(self): if self.settings.os == "Windows": del self.options.fPIC - def build_requirements(self): - self.build_requires("meson/0.59.1") - self.build_requires("pkgconf/1.7.4") - - def requirements(self): - self.requires("pango/1.50.7") + def configure(self): + if self.options.shared: + self.options.rm_safe("fPIC") - # FIXME: temporary fix for dependency versions mismatch - # once dependencies versions are bumped remove these requirements - self.requires("expat/2.4.8") - self.requires("zlib/1.2.12") - self.requires("glib/2.72.1") + def layout(self): + basic_layout(self, src_folder="src") + def requirements(self): + self.requires("pango/1.51.0", transitive_headers=True, transitive_libs=True) if self._is_2_48_api: - self.requires("glibmm/2.72.1") - self.requires("cairomm/1.16.1") + self.requires("glibmm/2.75.0", transitive_headers=True, transitive_libs=True) + self.requires("cairomm/1.18.0", transitive_headers=True, transitive_libs=True) elif self._is_1_4_api: - self.requires("glibmm/2.66.4") - self.requires("cairomm/1.14.3") + self.requires("glibmm/2.66.4", transitive_headers=True, transitive_libs=True) + self.requires("cairomm/1.14.3", transitive_headers=True, transitive_libs=True) + + def validate(self): + if cross_building(self): + raise ConanInvalidConfiguration("Cross-building not implemented") + + if self.settings.compiler.get_safe("cppstd"): + if self._is_2_48_api: + check_min_cppstd(self, 17) + elif self._is_1_4_api: + check_min_cppstd(self, 11) + + def build_requirements(self): + self.tool_requires("meson/1.4.0") + if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str): + self.tool_requires("pkgconf/2.2.0") def source(self): - tools.get( - **self.conan_data["sources"][self.version], - strip_root=True, - destination=self._source_subfolder, - ) + get(self, **self.conan_data["sources"][self.version], strip_root=True) + + def generate(self): + env = VirtualBuildEnv(self) + env.generate() + tc = PkgConfigDeps(self) + tc.generate() + tc = MesonToolchain(self) + tc.project_options = { + "build-documentation": "false", + "msvc14x-parallel-installable": "false", + "default_library": "shared" if self.options.shared else "static", + "libdir": "lib", + } + tc.generate() def _patch_sources(self): - for patch in self.conan_data["patches"][self.version]: - tools.patch(**patch) + apply_conandata_patches(self) # glibmm_generate_extra_defs library does not provide any standard way # for discovery, which is why pangomm uses "find_library" method instead # of "dependency". this patch adds a hint to where this library is glibmm_generate_extra_defs_dir = [ - os.path.join(self.deps_cpp_info["glibmm"].rootpath, libdir) for - libdir in self.deps_cpp_info["glibmm"].libdirs] + os.path.join(self.dependencies["glibmm"].package_folder, libdir) + for libdir in self.dependencies["glibmm"].cpp_info.libdirs + ] - tools.replace_in_file( - os.path.join(self._source_subfolder, "tools", - "extra_defs_gen", "meson.build"), + replace_in_file(self, os.path.join(self.source_folder, "tools", "extra_defs_gen", "meson.build"), "required: glibmm_dep.type_name() != 'internal',", f"required: glibmm_dep.type_name() != 'internal', dirs: {glibmm_generate_extra_defs_dir}") @@ -105,66 +121,33 @@ def _patch_sources(self): # the problem is that older versions of Windows SDK is not standard # conformant! see: # https://developercommunity.visualstudio.com/t/error-c2760-in-combaseapih-with-windows-sdk-81-and/185399 - tools.replace_in_file( - os.path.join(self._source_subfolder, "meson.build"), - "cpp_std=c++", "cpp_std=vc++") - - def configure(self): - if self.options.shared: - del self.options.fPIC + replace_in_file(self, os.path.join(self.source_folder, "meson.build"), + "cpp_std=c++", + "cpp_std=vc++") def build(self): self._patch_sources() - with tools.environment_append(tools.RunEnvironment(self).vars): - meson = self._configure_meson() - meson.build() - - def _configure_meson(self): meson = Meson(self) - defs = { - "build-documentation": "false", - "msvc14x-parallel-installable": "false", - "default_library": "shared" if self.options.shared else "static", - } - - meson.configure( - defs=defs, - build_folder=self._build_subfolder, - source_folder=self._source_subfolder, - pkg_config_paths=[self.install_folder], - ) - - return meson + meson.configure() + meson.build() def package(self): - self.copy("COPYING", dst="licenses", src=self._source_subfolder) - meson = self._configure_meson() + copy(self, "COPYING", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder) + meson = Meson(self) meson.install() - shutil.move( - os.path.join(self.package_folder, "lib", - f"pangomm-{self._api_version}", "include", - "pangommconfig.h"), - os.path.join(self.package_folder, "include", - f"pangomm-{self._api_version}", "pangommconfig.h")) + copy(self, "pangommconfig.h", + dst=os.path.join(self.package_folder, "include", f"pangomm-{self._api_version}"), + src=os.path.join(self.build_folder, "pango")) - tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig")) - tools.rmdir( - os.path.join(self.package_folder, "lib", - "pangomm-{self._api_version}", "include")) + rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) + rmdir(self, os.path.join(self.package_folder, "lib", f"pangomm-{self._api_version}", "include")) if is_msvc(self): - tools.remove_files_by_mask( - os.path.join(self.package_folder, "bin"), "*.pdb") + rm(self, "*.pdb", os.path.join(self.package_folder, "bin"), recursive=True) if not self.options.shared: - rename( - self, - os.path.join(self.package_folder, "lib", - f"libpangomm-{self._api_version}.a"), - os.path.join(self.package_folder, "lib", - f"pangomm-{self._api_version}.lib"), - ) - + rename(self, os.path.join(self.package_folder, "lib", f"libpangomm-{self._api_version}.a"), + os.path.join(self.package_folder, "lib", f"pangomm-{self._api_version}.lib")) def package_info(self): pangomm_lib = f"pangomm-{self._api_version}" @@ -172,18 +155,8 @@ def package_info(self): giomm_lib = "glibmm::giomm-2.68" if self._is_2_48_api else "glibmm::giomm-2.4" cairomm_lib = "cairomm::cairomm-1.16" if self._is_2_48_api else "cairomm::cairomm-1.0" - self.cpp_info.components[pangomm_lib].names["pkg_config"] = pangomm_lib + self.cpp_info.components[pangomm_lib].set_property("pkg_config_name", pangomm_lib) self.cpp_info.components[pangomm_lib].libs = [pangomm_lib] - self.cpp_info.components[pangomm_lib].includedirs = [ - os.path.join("include", pangomm_lib) - ] - self.cpp_info.components[pangomm_lib].requires = [ - "pango::pangocairo", glibmm_lib, giomm_lib, cairomm_lib - ] - self.cpp_info.components[pangomm_lib].set_property( - "pkg_config_custom_content", - f"gmmprocm4dir=${{libdir}}/{pangomm_lib}/proc/m4") - - # FIXME: remove once dependency mismatch issues are solved - self.cpp_info.components[pangomm_lib].requires.extend( - ["expat::expat", "zlib::zlib", "glib::glib-2.0"]) + self.cpp_info.components[pangomm_lib].includedirs = [os.path.join("include", pangomm_lib)] + self.cpp_info.components[pangomm_lib].requires = ["pango::pangocairo", glibmm_lib, giomm_lib, cairomm_lib] + self.cpp_info.components[pangomm_lib].set_property("pkg_config_custom_content", f"gmmprocm4dir=${{libdir}}/{pangomm_lib}/proc/m4") diff --git a/recipes/pangomm/all/test_package/CMakeLists.txt b/recipes/pangomm/all/test_package/CMakeLists.txt index 52162944c94e0..054e0c351c595 100644 --- a/recipes/pangomm/all/test_package/CMakeLists.txt +++ b/recipes/pangomm/all/test_package/CMakeLists.txt @@ -1,8 +1,5 @@ -cmake_minimum_required(VERSION 3.6) -project(test_package) - -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(TARGET) +cmake_minimum_required(VERSION 3.15) +project(test_package LANGUAGES CXX) find_package(pangomm REQUIRED CONFIG) diff --git a/recipes/pangomm/all/test_package/conanfile.py b/recipes/pangomm/all/test_package/conanfile.py index 38f4483872d47..ef5d7042163ec 100644 --- a/recipes/pangomm/all/test_package/conanfile.py +++ b/recipes/pangomm/all/test_package/conanfile.py @@ -1,10 +1,19 @@ -from conans import ConanFile, CMake, tools +from conan import ConanFile +from conan.tools.build import can_run +from conan.tools.cmake import cmake_layout, CMake import os class TestPackageConan(ConanFile): settings = "os", "arch", "compiler", "build_type" - generators = "cmake", "cmake_find_package_multi" + generators = "CMakeDeps", "CMakeToolchain", "VirtualRunEnv" + test_type = "explicit" + + def requirements(self): + self.requires(self.tested_reference_str) + + def layout(self): + cmake_layout(self) def build(self): cmake = CMake(self) @@ -12,6 +21,6 @@ def build(self): cmake.build() def test(self): - if not tools.cross_building(self): - bin_path = os.path.join("bin", "test_package") - self.run(bin_path, run_environment=True) + 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/pangomm/all/test_v1_package/CMakeLists.txt b/recipes/pangomm/all/test_v1_package/CMakeLists.txt new file mode 100644 index 0000000000000..91630d79f4abb --- /dev/null +++ b/recipes/pangomm/all/test_v1_package/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) +project(test_package) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup(TARGETS) + +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../test_package/ + ${CMAKE_CURRENT_BINARY_DIR}/test_package/) diff --git a/recipes/pangomm/all/test_v1_package/conanfile.py b/recipes/pangomm/all/test_v1_package/conanfile.py new file mode 100644 index 0000000000000..38f4483872d47 --- /dev/null +++ b/recipes/pangomm/all/test_v1_package/conanfile.py @@ -0,0 +1,17 @@ +from conans import ConanFile, CMake, tools +import os + + +class TestPackageConan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + generators = "cmake", "cmake_find_package_multi" + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if not tools.cross_building(self): + bin_path = os.path.join("bin", "test_package") + self.run(bin_path, run_environment=True)