from conan import ConanFile from conan.tools.apple import fix_apple_shared_install_name from conan.tools.env import VirtualBuildEnv from conan.tools.files import ( apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir ) from conan.tools.gnu import PkgConfigDeps from conan.tools.layout import basic_layout from conan.tools.meson import Meson, MesonToolchain import os required_conan_version = ">=1.64.0 <2 || >=2.2.0" class FontconfigConan(ConanFile): name = "fontconfig" license = "MIT" url = "https://github.com/conan-io/conan-center-index" description = "Fontconfig is a library for configuring and customizing font access" homepage = "https://gitlab.freedesktop.org/fontconfig/fontconfig" topics = ("fonts", "freedesktop") settings = "os", "arch", "compiler", "build_type" options = { "shared": [True, False], "fPIC": [True, False], } default_options = { "shared": False, "fPIC": True, } def export_sources(self): export_conandata_patches(self) def config_options(self): if self.settings.os == "Windows": del self.options.fPIC def configure(self): if self.options.shared: self.options.rm_safe("fPIC") self.settings.rm_safe("compiler.libcxx") self.settings.rm_safe("compiler.cppstd") def layout(self): basic_layout(self, src_folder="src") def requirements(self): self.requires("freetype/2.13.2") self.requires("expat/[>=2.6.2 <3]") def build_requirements(self): self.tool_requires("gperf/3.1") # 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.1.0]") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): env = VirtualBuildEnv(self) env.generate() deps = PkgConfigDeps(self) deps.generate() tc = MesonToolchain(self) tc.project_options.update({ "doc": "disabled", "nls": "disabled", "tests": "disabled", "tools": "disabled", "sysconfdir": os.path.join("res", "etc"), "datadir": os.path.join("res", "share"), }) tc.generate() def _patch_files(self): apply_conandata_patches(self) def build(self): self._patch_files() meson = Meson(self) meson.configure() meson.build() def package(self): copy(self, "COPYING", self.source_folder, os.path.join(self.package_folder, "licenses")) meson = Meson(self) meson.install() rm(self, "*.pdb", self.package_folder, recursive=True) rm(self, "*.conf", os.path.join(self.package_folder, "res", "etc", "fonts", "conf.d")) rm(self, "*.def", os.path.join(self.package_folder, "lib")) rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) fix_apple_shared_install_name(self) fix_msvc_libname(self) def package_info(self): self.cpp_info.set_property("cmake_find_mode", "both") self.cpp_info.set_property("cmake_file_name", "Fontconfig") self.cpp_info.set_property("cmake_target_name", "Fontconfig::Fontconfig") self.cpp_info.set_property("pkg_config_name", "fontconfig") self.cpp_info.libs = ["fontconfig"] if self.settings.os in ("Linux", "FreeBSD"): self.cpp_info.system_libs.extend(["m", "pthread"]) fontconfig_path = os.path.join(self.package_folder, "res", "etc", "fonts") self.runenv_info.append_path("FONTCONFIG_PATH", fontconfig_path) # TODO: to remove in conan v2 self.cpp_info.names["cmake_find_package"] = "Fontconfig" self.cpp_info.names["cmake_find_package_multi"] = "Fontconfig" self.env_info.FONTCONFIG_PATH = fontconfig_path def fix_msvc_libname(conanfile, remove_lib_prefix=True): """remove lib prefix & change extension to .lib in case of cl like compiler""" if not conanfile.settings.get_safe("compiler.runtime"): return from conan.tools.files import rename import glob libdirs = getattr(conanfile.cpp.package, "libdirs") for libdir in libdirs: for ext in [".dll.a", ".dll.lib", ".a"]: full_folder = os.path.join(conanfile.package_folder, libdir) for filepath in glob.glob(os.path.join(full_folder, f"*{ext}")): libname = os.path.basename(filepath)[0:-len(ext)] if remove_lib_prefix and libname[0:3] == "lib": libname = libname[3:] rename(conanfile, filepath, os.path.join(os.path.dirname(filepath), f"{libname}.lib"))