From: Aleksa Sarai Date: Fri, 28 Oct 2022 01:38:20 +0000 (+1100) Subject: build: fix handling of dependancies to fix build on openSUSE X-Git-Tag: v6.0.0~86^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1f87c8113a896fc0fd27f3f941bc7f3fa2754e5;p=thirdparty%2Flxc.git build: fix handling of dependancies to fix build on openSUSE Among other things, openSUSE places seccomp.h inside a non-default include directory (/usr/include/seccomp/seccomp.h) which revealed several issues with how dependencies were being handled previously. The most notable issue is that the include cflags of our build dependencies were not being provided to the recipes for static executables (yet they still expected access to the dependency headers). This also involved a minor cleanup of how these dependencies are collected, and added liburing to the set of private pkg-config libs (which I assume was an oversight?). Signed-off-by: Aleksa Sarai --- diff --git a/meson.build b/meson.build index 9e0b1b67f..63a019751 100644 --- a/meson.build +++ b/meson.build @@ -22,6 +22,9 @@ cc = meson.get_compiler('c') pkgconfig = import('pkgconfig') pkgconfig_libs = [] +liblxc_dependencies = [] +oss_fuzz_dependencies = [] + # Version. liblxc_version = '1.7.0' version_data = configuration_data() @@ -260,6 +263,8 @@ if want_io_uring if cc.has_function('io_uring_prep_poll_add', prefix: '#include ', dependencies: liburing) == false error('liburing version does not support IORING_POLL_ADD_MULTI') endif + pkgconfig_libs += liburing + liblxc_dependencies += liburing srcconf.set10('HAVE_LIBURING', true) else @@ -295,7 +300,7 @@ if not want_sd_bus.disabled() has_sd_bus = false endif - if not cc.has_function('sd_bus_call_method_async', prefix: '#include ', dependencies: libsystemd) + if not cc.has_function('sd_bus_call_method_async', prefix: '#include ', dependencies: libsystemd) if not sd_bus_optional error('libsystemd misses required sd_bus_call_method_async function') endif @@ -303,6 +308,13 @@ if not want_sd_bus.disabled() has_sd_bus = false endif + if has_sd_bus + liblxc_dependencies += libsystemd + if want_oss_fuzz + oss_fuzz_dependencies += libsystemd + endif + endif + srcconf.set10('HAVE_LIBSYSTEMD', has_sd_bus) else has_sd_bus = false @@ -356,12 +368,14 @@ endif ## Threads. threads = dependency('threads') +liblxc_dependencies += threads ## Seccomp. if want_seccomp libseccomp = dependency('libseccomp', required: false) srcconf.set10('HAVE_SECCOMP', libseccomp.found()) pkgconfig_libs += libseccomp + liblxc_dependencies += libseccomp if libseccomp.found() if libseccomp.version().version_compare('>=2.5.0') # https://github.com/seccomp/libseccomp/commit/dead12bc788b259b148cc4d93b970ef0bd602b1a @@ -388,7 +402,7 @@ if want_seccomp ] # We get -1 if the size cannot be determined - if cc.sizeof(decl, prefix: seccomp_headers, args: '-D_GNU_SOURCE') > 0 + if cc.sizeof(decl, prefix: seccomp_headers, args: '-D_GNU_SOURCE', dependencies: libseccomp) > 0 srcconf.set10('HAVE_' + decl.underscorify().to_upper(), true) else srcconf.set10('HAVE_' + decl.underscorify().to_upper(), false) @@ -404,6 +418,7 @@ if want_selinux libselinux = dependency('libselinux', required: false) srcconf.set10('HAVE_SELINUX', libselinux.found()) pkgconfig_libs += libselinux + liblxc_dependencies += libselinux else srcconf.set10('HAVE_SELINUX', false) endif @@ -412,6 +427,8 @@ endif if want_apparmor libapparmor = dependency('libapparmor', required: false) srcconf.set10('HAVE_APPARMOR', libapparmor.found()) + # We do not use the AppArmor library at runtime, so it's not in our pkg-config. + liblxc_dependencies += libapparmor else srcconf.set10('HAVE_APPARMOR', false) endif @@ -421,6 +438,7 @@ if want_openssl libopenssl = dependency('openssl', required: false) srcconf.set10('HAVE_OPENSSL', libopenssl.found()) pkgconfig_libs += libopenssl + liblxc_dependencies += libopenssl else srcconf.set10('HAVE_OPENSSL', false) endif @@ -437,6 +455,7 @@ if want_capabilities endif srcconf.set10('HAVE_LIBCAP', libcap.found()) pkgconfig_libs += libcap + liblxc_dependencies += libcap libcap_static = dependency('libcap', required: false, static: true) if not libcap_static.found() @@ -461,7 +480,6 @@ endif libutil = cc.find_library('util', required: false) -oss_fuzz_dependencies = [] if want_oss_fuzz srcconf.set10('FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION', true) srcconf.set10('RUN_ON_OSS_FUZZ', true) @@ -480,8 +498,14 @@ pkgconfig_libs += pam have = cc.has_function('fmemopen', prefix: '#include ', args: '-D_GNU_SOURCE') srcconf.set10('HAVE_FMEMOPEN', have) -have_openpty = cc.has_function('openpty', dependencies: libutil, prefix: '#include ') -srcconf.set10('HAVE_OPENPTY', have_openpty) +have = cc.has_function('openpty', dependencies: libutil, prefix: '#include ') +srcconf.set10('HAVE_OPENPTY', have) +if have + liblxc_dependencies += libutil + if want_oss_fuzz + oss_fuzz_dependencies += libutil + endif +endif have = cc.has_function('pthread_setcancelstate', prefix: '#include ') srcconf.set10('HAVE_PTHREAD_SETCANCELSTATE', have) @@ -860,54 +884,19 @@ liblxc_includes = include_directories( 'src/lxc/cgroups', 'src/lxc/storage') +# Our static sub-project binaries don't (and in fact can't) link to our +# dependencies directly, but need access to the headers when compiling (most +# notably seccomp headers). +liblxc_dependency_headers = [] +foreach dep: liblxc_dependencies + liblxc_dependency_headers += dep.partial_dependency(compile_args: true) +endforeach + # Early sub-directories. subdir('src/include') subdir('src/lxc') subdir('src/lxc/pam') -# Library. -liblxc_dependencies = [ - threads, -] - -if want_seccomp - liblxc_dependencies += libseccomp -endif - -if want_capabilities - liblxc_dependencies += [libcap] -endif - -if want_openssl - liblxc_dependencies += [libopenssl] -endif - -if want_selinux - liblxc_dependencies += [libselinux] -endif - -if want_apparmor - liblxc_dependencies += [libapparmor] -endif - -if want_io_uring - liblxc_dependencies += [liburing] -endif - -if has_sd_bus - liblxc_dependencies += [libsystemd] - if want_oss_fuzz - oss_fuzz_dependencies += [libsystemd] - endif -endif - -if have_openpty - liblxc_dependencies += [libutil] - if want_oss_fuzz - oss_fuzz_dependencies += [libutil] - endif -endif - liblxc_link_whole = [liblxc_static] liblxc = shared_library( diff --git a/src/lxc/cmd/meson.build b/src/lxc/cmd/meson.build index c7df528d3..6934a3809 100644 --- a/src/lxc/cmd/meson.build +++ b/src/lxc/cmd/meson.build @@ -70,7 +70,7 @@ if sanitize == 'none' link_with: [liblxc_static], link_args: ['-static'], c_args: ['-DNO_LXC_CONF'], - dependencies: [libcap_static], + dependencies: [libcap_static] + liblxc_dependency_headers, install_dir: sbindir, install: true) endif diff --git a/src/lxc/meson.build b/src/lxc/meson.build index b4609e203..be61a1a30 100644 --- a/src/lxc/meson.build +++ b/src/lxc/meson.build @@ -153,7 +153,7 @@ liblxc_static = static_library( liblxc_sources + include_sources + netns_ifaddrs_sources, install: true, include_directories: liblxc_includes, - dependencies: [threads], + dependencies: [threads] + liblxc_dependency_headers, c_args: '-fvisibility=default') lxc_functions = configure_file(