Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pangomm: migrate to Conan v2 #18886

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions recipes/pangomm/all/conandata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@
url: "https://download.gnome.org/sources/pangomm/2.46/pangomm-2.46.2.tar.xz"
sha256: "57442ab4dc043877bfe3839915731ab2d693fc6634a71614422fb530c9eaa6f4"
patches:
"2.50.0":
- patch_file: "patches/enable_static_libs_2_50_0.patch"

Check warning on line 10 in recipes/pangomm/all/conandata.yml

View workflow job for this annotation

GitHub Actions / Lint changed files (YAML files)

conandata.yml schema warning

Schema outlined in https://github.com/conan-io/conan-center-index/blob/master/docs/adding_packages/conandata_yml_format.md#patches-fields is not followed. required key(s) 'patch_description', 'patch_type' not found in - patch_file: patches/enable_s ... ^ (line: 10)
base_path: "source_subfolder"
- patch_file: "patches/fix_exporting_pango_init.patch"

Check warning on line 11 in recipes/pangomm/all/conandata.yml

View workflow job for this annotation

GitHub Actions / Lint changed files (YAML files)

conandata.yml schema warning

Schema outlined in https://github.com/conan-io/conan-center-index/blob/master/docs/adding_packages/conandata_yml_format.md#patches-fields is not followed. required key(s) 'patch_description', 'patch_type' not found in - patch_file: patches/fix_expo ... ^ (line: 11)
base_path: "source_subfolder"
"2.46.2":
- patch_file: "patches/enable_static_libs_2_46_2.patch"

Check warning on line 13 in recipes/pangomm/all/conandata.yml

View workflow job for this annotation

GitHub Actions / Lint changed files (YAML files)

conandata.yml schema warning

Schema outlined in https://github.com/conan-io/conan-center-index/blob/master/docs/adding_packages/conandata_yml_format.md#patches-fields is not followed. required key(s) 'patch_description', 'patch_type' not found in - patch_file: patches/enable_s ... ^ (line: 13)
base_path: "source_subfolder"
- patch_file: "patches/fix_exporting_pango_init.patch"

Check warning on line 14 in recipes/pangomm/all/conandata.yml

View workflow job for this annotation

GitHub Actions / Lint changed files (YAML files)

conandata.yml schema warning

Schema outlined in https://github.com/conan-io/conan-center-index/blob/master/docs/adding_packages/conandata_yml_format.md#patches-fields is not followed. required key(s) 'patch_description', 'patch_type' not found in - patch_file: patches/fix_expo ... ^ (line: 14)
base_path: "source_subfolder"
219 changes: 96 additions & 123 deletions recipes/pangomm/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -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}")

Expand All @@ -105,85 +121,42 @@ 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}"
glibmm_lib = "glibmm::glibmm-2.68" if self._is_2_48_api else "glibmm::glibmm-2.4"
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")
7 changes: 2 additions & 5 deletions recipes/pangomm/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)

Expand Down
19 changes: 14 additions & 5 deletions recipes/pangomm/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
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)
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)
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")
8 changes: 8 additions & 0 deletions recipes/pangomm/all/test_v1_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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/)
17 changes: 17 additions & 0 deletions recipes/pangomm/all/test_v1_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -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)
Loading