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

libmount: Add 2.40.2 and use Meson #20507

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from 5 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
2 changes: 2 additions & 0 deletions recipes/libmount/config.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
versions:
"2.40.1":
folder: meson
"2.39.2":
folder: all
"2.39":
Expand Down
4 changes: 4 additions & 0 deletions recipes/libmount/meson/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
sources:
"2.40.1":
url: "https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-2.40.1.tar.xz"
sha256: "59e676aa53ccb44b6c39f0ffe01a8fa274891c91bef1474752fad92461def24f"
103 changes: 103 additions & 0 deletions recipes/libmount/meson/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, replace_in_file, rm, rmdir
from conan.tools.layout import basic_layout
from conan.tools.meson import Meson, MesonToolchain
import os

required_conan_version = ">=1.53.0"


class LibmountConan(ConanFile):
name = "libmount"
description = (
"The libmount library is used to parse /etc/fstab, /etc/mtab and "
"/proc/self/mountinfo files, manage the mtab file, evaluate mount options, etc"
)
topics = ("mount", "linux", "util-linux")
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git"
license = "LGPL-2.1-or-later"
package_type = "library"
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 configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
self.settings.rm_safe("compiler.cppstd")
self.settings.rm_safe("compiler.libcxx")

def layout(self):
basic_layout(self, src_folder="src")

def validate(self):
if self.settings.os != "Linux":
raise ConanInvalidConfiguration(f"{self.ref} only supports Linux")

def build_requirements(self):
self.tool_requires("bison/3.8.2")
self.tool_requires("flex/2.6.4")
self.tool_requires("meson/1.3.2")
if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str):
self.tool_requires("pkgconf/2.1.0")
jwillikers marked this conversation as resolved.
Show resolved Hide resolved

def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
tc = MesonToolchain(self)
tc.project_options["auto_features"] = "disabled"
tc.project_options["build-libblkid"] = "enabled"
tc.project_options["build-libmount"] = "enabled"
# Enable libutil for older versions of glibc which still provide an actual libutil library.
tc.project_options["libutil"] = "enabled"
tc.project_options["program-tests"] = False
tc.generate()
virtual_build_env = VirtualBuildEnv(self)
virtual_build_env.generate()

def _patch_sources(self):
apply_conandata_patches(self)
# Disable tests for libmount.
replace_in_file(self, os.path.join(self.source_folder, "libmount", "meson.build"), "foreach libmount_test: libmount_tests", "foreach libmount_test: []")

def build(self):
self._patch_sources()
meson = Meson(self)
meson.configure()
meson.build()

def package(self):
copy(self, "COPYING", os.path.join(self.source_folder, "libmount"), os.path.join(self.package_folder, "licenses"))
copy(self, "COPYING.LGPL-2.1-or-later", os.path.join(self.source_folder, "Documentation", "licenses"), os.path.join(self.package_folder, "licenses"))
meson = Meson(self)
meson.install()
rmdir(self, os.path.join(self.package_folder, "sbin"))
rmdir(self, os.path.join(self.package_folder, "share"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "usr"))
rm(self, "*.la", os.path.join(self.package_folder, "lib"))
# util-linux always builds both the shared and static libraries of libblkid, so delete the one that isn't needed.
rm(self, "libblkid.a" if self.options.shared else "libblkid.so*", os.path.join(self.package_folder, "lib"))

def package_info(self):
self.cpp_info.components["libblkid"].libs = ["blkid"]
self.cpp_info.components["libblkid"].set_property("pkg_config_name", "blkid")

self.cpp_info.components["libmount"].libs = ["mount"]
self.cpp_info.components["libmount"].system_libs = ["rt"]
self.cpp_info.components["libmount"].includedirs.append(os.path.join("include", "libmount"))
self.cpp_info.components["libmount"].set_property("pkg_config_name", "mount")
self.cpp_info.components["libmount"].requires = ["libblkid"]
jwillikers marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
From f52903f43c091fd4487811ce948fbc67f341bf97 Mon Sep 17 00:00:00 2001
From: Jordan Williams <[email protected]>
Date: Fri, 29 Mar 2024 10:31:27 -0500
Subject: [PATCH] meson: Only require the crypt library when necessary

The `crypt` library is only necessary for two executables.
These are build-newgrp and build-sulogin.
Don't otherwise require this dependency.

Signed-off-by: Jordan Williams <[email protected]>
---
meson.build | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index bc335709d..a80f96460 100644
--- a/meson.build
+++ b/meson.build
@@ -346,7 +346,10 @@ lib_udev = dependency(
required : get_option('systemd'))
conf.set('HAVE_LIBUDEV', lib_udev.found() ? 1 : false)

-lib_crypt = cc.find_library('crypt')
+lib_crypt = cc.find_library('crypt', required : get_option('build-newgrp'))
+if not lib_crypt.found()
+ lib_crypt = cc.find_library('crypt', required : get_option('build-sulogin'))
+endif

lib_pam = cc.find_library('pam', required : get_option('build-login'))
if not lib_pam.found()
--
2.44.0

7 changes: 7 additions & 0 deletions recipes/libmount/meson/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.15)
project(test_package LANGUAGES C)

find_package(libmount REQUIRED CONFIG)

add_executable(${PROJECT_NAME} test_package.c)
target_link_libraries(${PROJECT_NAME} PRIVATE libmount::libmount)
26 changes: 26 additions & 0 deletions recipes/libmount/meson/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, cmake_layout
import os


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv"
test_type = "explicit"

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.bindirs[0], "test_package")
self.run(bin_path, env="conanrun")
16 changes: 16 additions & 0 deletions recipes/libmount/meson/test_package/test_package.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <libmount/libmount.h>

#include <stdio.h>
#include <stdlib.h>

int main()
{
struct libmnt_context *ctx = mnt_new_context();
if (!ctx) {
printf("failed to initialize libmount\n");
return EXIT_FAILURE;
}
printf("path to fstab: %s", mnt_get_fstab_path());
mnt_free_context(ctx);
return EXIT_SUCCESS;
}
Loading