From d532650b0d7fb8bb062d852a8fdecd10be00ce21 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Fri, 16 Mar 2018 23:52:45 +0200 Subject: [PATCH] Add test for pkgconfig generation and usage. This builds a project with pkg-config file, installs it and then builds a second project that uses that dependency and runs the result. --- run_unittests.py | 28 +++++++++++++++++-- .../24 pkgconfig usage/dependee/meson.build | 7 +++++ .../24 pkgconfig usage/dependee/pkguser.c | 6 ++++ .../24 pkgconfig usage/dependency/meson.build | 24 ++++++++++++++++ .../24 pkgconfig usage/dependency/pkgdep.c | 7 +++++ .../24 pkgconfig usage/dependency/pkgdep.h | 3 ++ .../dependency/privatelib.c | 3 ++ 7 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 test cases/unit/24 pkgconfig usage/dependee/meson.build create mode 100644 test cases/unit/24 pkgconfig usage/dependee/pkguser.c create mode 100644 test cases/unit/24 pkgconfig usage/dependency/meson.build create mode 100644 test cases/unit/24 pkgconfig usage/dependency/pkgdep.c create mode 100644 test cases/unit/24 pkgconfig usage/dependency/pkgdep.h create mode 100644 test cases/unit/24 pkgconfig usage/dependency/privatelib.c diff --git a/run_unittests.py b/run_unittests.py index 9c7b16bd5f2a..1e8bec4955f4 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -585,10 +585,11 @@ def clean(self): def run_tests(self): self._run(self.test_command, workdir=self.builddir) - def install(self): + def install(self, *, use_destdir=True): if self.backend is not Backend.ninja: raise unittest.SkipTest('{!r} backend can\'t install files'.format(self.backend.name)) - os.environ['DESTDIR'] = self.installdir + if use_destdir: + os.environ['DESTDIR'] = self.installdir self._run(self.install_command, workdir=self.builddir) def uninstall(self): @@ -2712,6 +2713,29 @@ def test_old_gnome_module_codepaths(self): self.build() mesonbuild.modules.gnome.native_glib_version = None + @unittest.skipIf(shutil.which('pkg-config') is None, 'Pkg-config not found.') + def test_pkgconfig_usage(self): + testdir1 = os.path.join(self.unit_test_dir, '24 pkgconfig usage/dependency') + testdir2 = os.path.join(self.unit_test_dir, '24 pkgconfig usage/dependee') + with tempfile.TemporaryDirectory() as tempdirname: + self.init(testdir1, ['--prefix=' + tempdirname, '--libdir=lib'], default_args=False) + self.install(use_destdir=False) + shutil.rmtree(self.builddir) + os.mkdir(self.builddir) + pkg_dir = os.path.join(tempdirname, 'lib/pkgconfig') + self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'libpkgdep.pc'))) + lib_dir = os.path.join(tempdirname, 'lib') + os.environ['PKG_CONFIG_PATH'] = pkg_dir + self.init(testdir2) + self.build() + myenv = os.environ.copy() + myenv['LD_LIBRARY_PATH'] = lib_dir + self.assertTrue(os.path.isdir(lib_dir)) + self.assertTrue(os.path.isfile(os.path.join(lib_dir, 'libpkgdep.so'))) + test_exe = os.path.join(self.builddir, 'pkguser') + self.assertTrue(os.path.isfile(test_exe)) + subprocess.check_call(test_exe, env=myenv) + class LinuxArmCrossCompileTests(BasePlatformTests): ''' diff --git a/test cases/unit/24 pkgconfig usage/dependee/meson.build b/test cases/unit/24 pkgconfig usage/dependee/meson.build new file mode 100644 index 000000000000..beb446c1835a --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependee/meson.build @@ -0,0 +1,7 @@ +project('pkgconfig user', 'c') + +pkgdep = dependency('libpkgdep') + +executable('pkguser', 'pkguser.c', + dependencies : pkgdep) + diff --git a/test cases/unit/24 pkgconfig usage/dependee/pkguser.c b/test cases/unit/24 pkgconfig usage/dependee/pkguser.c new file mode 100644 index 000000000000..2bff316f11d5 --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependee/pkguser.c @@ -0,0 +1,6 @@ +#include + +int main(int argc, char **argv) { + int res = pkgdep(); + return res != 99; +} diff --git a/test cases/unit/24 pkgconfig usage/dependency/meson.build b/test cases/unit/24 pkgconfig usage/dependency/meson.build new file mode 100644 index 000000000000..89fae8e007c1 --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependency/meson.build @@ -0,0 +1,24 @@ +project('pkgconfig dep', 'c', + version : '1.0.0') + +# This is not used in the code, only to check that it does not +# leak out to --libs. +glib_dep = dependency('glib-2.0') + +pkgconfig = import('pkgconfig') + +intlib = static_library('libpkgdep-int', 'privatelib.c') +intdep = declare_dependency(link_with : intlib) + +lib = shared_library('pkgdep', 'pkgdep.c', + dependencies : [glib_dep, intdep], + install : true) + +install_headers('pkgdep.h') + +pkgconfig.generate( + filebase : 'libpkgdep', + name : 'Libpkgdep', + description : 'Sample pkgconfig dependency library', + version : meson.project_version(), + libraries : lib) diff --git a/test cases/unit/24 pkgconfig usage/dependency/pkgdep.c b/test cases/unit/24 pkgconfig usage/dependency/pkgdep.c new file mode 100644 index 000000000000..bd5c3f4d336d --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependency/pkgdep.c @@ -0,0 +1,7 @@ +#include + +int internal_thingy(); + +int pkgdep() { + return internal_thingy(); +} diff --git a/test cases/unit/24 pkgconfig usage/dependency/pkgdep.h b/test cases/unit/24 pkgconfig usage/dependency/pkgdep.h new file mode 100644 index 000000000000..16d622eb1aaa --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependency/pkgdep.h @@ -0,0 +1,3 @@ +#pragma once + +int pkgdep(); diff --git a/test cases/unit/24 pkgconfig usage/dependency/privatelib.c b/test cases/unit/24 pkgconfig usage/dependency/privatelib.c new file mode 100644 index 000000000000..71d2179c3037 --- /dev/null +++ b/test cases/unit/24 pkgconfig usage/dependency/privatelib.c @@ -0,0 +1,3 @@ +int internal_thingy() { + return 99; +}