From bbcba2b26cc3ba6e6be51f8a4f88baf2981faae5 Mon Sep 17 00:00:00 2001 From: Jordan Williams Date: Tue, 16 Jan 2024 14:31:20 -0600 Subject: [PATCH] libdecor: Add recipe --- recipes/libdecor/all/conandata.yml | 4 + recipes/libdecor/all/conanfile.py | 125 ++++++++++++++++++ .../libdecor/all/test_package/conanfile.py | 33 +++++ recipes/libdecor/all/test_package/meson.build | 14 ++ .../libdecor/all/test_package/test_package.c | 16 +++ recipes/libdecor/config.yml | 3 + 6 files changed, 195 insertions(+) create mode 100644 recipes/libdecor/all/conandata.yml create mode 100644 recipes/libdecor/all/conanfile.py create mode 100644 recipes/libdecor/all/test_package/conanfile.py create mode 100644 recipes/libdecor/all/test_package/meson.build create mode 100644 recipes/libdecor/all/test_package/test_package.c create mode 100644 recipes/libdecor/config.yml diff --git a/recipes/libdecor/all/conandata.yml b/recipes/libdecor/all/conandata.yml new file mode 100644 index 00000000000000..3de71aa23cea8e --- /dev/null +++ b/recipes/libdecor/all/conandata.yml @@ -0,0 +1,4 @@ +sources: + "0.2.2": + url: "https://gitlab.freedesktop.org/libdecor/libdecor/-/releases/0.2.2/downloads/libdecor-0.2.2.tar.xz" + sha256: "16a288e24354d461b20dda9cf38e68543569134f04e4b7fa2914aa647907dfac" diff --git a/recipes/libdecor/all/conanfile.py b/recipes/libdecor/all/conanfile.py new file mode 100644 index 00000000000000..e5f2666b0fd522 --- /dev/null +++ b/recipes/libdecor/all/conanfile.py @@ -0,0 +1,125 @@ +import os +import shutil + +from conan import ConanFile +from conan.tools.env import VirtualBuildEnv +from conan.tools.files import copy, get, replace_in_file, rmdir +from conan.tools.gnu import PkgConfigDeps +from conan.tools.layout import basic_layout +from conan.tools.meson import Meson, MesonToolchain +from conan.errors import ConanInvalidConfiguration + +required_conan_version = ">=1.53.0" + + +class libdecorConan(ConanFile): + name = "libdecor" + package_type = "shared-library" + description = "libdecor is a library that can help Wayland clients draw window decorations for them." + topics = ("decoration", "wayland", "window") + url = "https://github.com/conan-io/conan-center-index" + homepage = "https://gitlab.freedesktop.org/libdecor/libdecor" + license = "MIT" + settings = "os", "arch", "compiler", "build_type" + options = { + "with_dbus": [True, False], + "with_gtk": [True, False], + } + default_options = { + "with_dbus": True, + "with_gtk": True, + } + + @property + def _settings_build(self): + return getattr(self, "settings_build", self.settings) + + def configure(self): + self.settings.rm_safe("compiler.cppstd") + self.settings.rm_safe("compiler.libcxx") + if self.options.get_safe("with_gtk"): + self.options["gtk"].version = "3" + self.options["pango"].with_cairo = True + + # https://gitlab.freedesktop.org/libdecor/libdecor/-/issues/66 + if self.options.get_safe("wayland"): + self.options["shared"].version = True + + def layout(self): + basic_layout(self, src_folder="src") + + def requirements(self): + self.requires("cairo/1.18.0 ") + if self.options.get_safe("with_dbus"): + self.requires("dbus/1.15.8") + if self.options.get_safe("with_gtk"): + self.requires("gtk/system") + self.requires("pango/1.50.10") + self.requires("wayland/1.22.0") + self.requires("wayland-protocols/1.32") + + def validate(self): + if self.settings.os != "Linux": + raise ConanInvalidConfiguration(f"{self.ref} only supports Linux") + if self.options.get_safe("with_gtk") and not self.dependencies["gtk"].options.version == "3": + raise ConanInvalidConfiguration(f"{self.ref} requires the version option of gtk to be set to 3") + if not self.dependencies["pango"].options.with_cairo: + raise ConanInvalidConfiguration(f"{self.ref} requires the with_cairo option of pango to be enabled") + + # https://gitlab.freedesktop.org/libdecor/libdecor/-/issues/66 + if not self.dependencies["wayland"].options.shared: + raise ConanInvalidConfiguration(f"{self.ref} requires the shared option of wayland to be enabled due to a bug in libdecor") + + def build_requirements(self): + self.tool_requires("meson/1.3.1") + if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str): + self.tool_requires("pkgconf/2.1.0") + self.tool_requires("wayland/") + + def source(self): + get(self, **self.conan_data["sources"][self.version], strip_root=True) + + def _patch_sources(self): + replace_in_file( + self, + os.path.join(self.source_folder, "src", "plugins", "meson.build"), + "gtk_dep = dependency('gtk+-3.0', required: get_option('gtk'))", + "gtk_dep = dependency('gtk', required: get_option('gtk'))", + ) + + def generate(self): + feature = ( + lambda option: "enabled" if self.options.get_safe(option) else "disabled" + ) + + tc = MesonToolchain(self) + tc.project_options["dbus"] = feature("with_dbus") + tc.project_options["demo"] = False + tc.project_options["gtk"] = feature("with_gtk") + tc.generate() + pkg_config_deps = PkgConfigDeps(self) + pkg_config_deps.generate() + # Work around a bug in the pango package for which fixes have not been merged in yet. + shutil.copy2(os.path.join(self.generators_folder, "pango-pangocairo.pc"), os.path.join(self.generators_folder, "pangocairo.pc")) + virtual_build_env = VirtualBuildEnv(self) + virtual_build_env.generate() + + def build(self): + self._patch_sources() + meson = Meson(self) + meson.configure() + meson.build() + + def package(self): + copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses")) + meson = Meson(self) + meson.install() + rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) + + def package_info(self): + libdecor_soversion = "0" + self.cpp_info.libs = [f"decor-{libdecor_soversion}"] + self.cpp_info.set_property("pkg_config_name", f"libdecor-{libdecor_soversion}") + + plugins_soversion = "1" + self.runenv_info.define("LIBDECOR_PLUGIN_DIR", os.path.join(self.package_folder, "lib", "libdecor", f"plugins-{plugins_soversion}")) diff --git a/recipes/libdecor/all/test_package/conanfile.py b/recipes/libdecor/all/test_package/conanfile.py new file mode 100644 index 00000000000000..e1a9c382a9e387 --- /dev/null +++ b/recipes/libdecor/all/test_package/conanfile.py @@ -0,0 +1,33 @@ +from conan import ConanFile +from conan.tools.build import can_run +from conan.tools.layout import basic_layout +from conan.tools.meson import Meson +import os + + +class TestPackageConan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + generators = "PkgConfigDeps", "MesonToolchain", "VirtualRunEnv", "VirtualBuildEnv" + test_type = "explicit" + + def layout(self): + basic_layout(self) + + def requirements(self): + self.requires(self.tested_reference_str) + self.requires("wayland/1.22.0") + + def build_requirements(self): + self.tool_requires("meson/1.3.1") + if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str): + self.tool_requires("pkgconf/2.1.0") + + def build(self): + meson = Meson(self) + meson.configure() + meson.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/libdecor/all/test_package/meson.build b/recipes/libdecor/all/test_package/meson.build new file mode 100644 index 00000000000000..3394ee3aec372f --- /dev/null +++ b/recipes/libdecor/all/test_package/meson.build @@ -0,0 +1,14 @@ +project('test_package', 'c') + +libdecor_dep = dependency('libdecor-0') + +executable('test_package', + sources: [ + 'test_package.c', + ], + dependencies: [ + libdecor_dep, + ], +) + + diff --git a/recipes/libdecor/all/test_package/test_package.c b/recipes/libdecor/all/test_package/test_package.c new file mode 100644 index 00000000000000..7403be2dad4a7b --- /dev/null +++ b/recipes/libdecor/all/test_package/test_package.c @@ -0,0 +1,16 @@ +#include +#include + +int libdecor_state_get_content_width(struct libdecor_state *state); + +int main(int argc, char **argv) { + struct libdecor_state *state = libdecor_state_new(0, 0); + int width = libdecor_state_get_content_width(state); + free(state); + if (width == 0) { + return EXIT_SUCCESS; + } + + return EXIT_FAILURE ; + +} diff --git a/recipes/libdecor/config.yml b/recipes/libdecor/config.yml new file mode 100644 index 00000000000000..cd4b8da537c38c --- /dev/null +++ b/recipes/libdecor/config.yml @@ -0,0 +1,3 @@ +versions: + "0.2.2": + folder: all