diff options
9 files changed, 96 insertions, 14 deletions
diff --git a/.travis.yml b/.travis.yml index 62385d6..6f31f99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ before_install: - python ./skip_ci.py --base-branch-env=TRAVIS_BRANCH --is-pull-env=TRAVIS_PULL_REQUEST - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew uninstall python mercurial; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python@2 python@3 mercurial qt; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python@2 python@3 mercurial qt pkg-config; fi # Use a Ninja with QuLogic's patch: https://github.com/ninja-build/ninja/issues/1219 - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mkdir -p $HOME/tools; curl -L http://nirbheek.in/files/binaries/ninja/macos/ninja -o $HOME/tools/ninja; chmod +x $HOME/tools/ninja; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull jpakkane/mesonci:bionic; fi diff --git a/run_unittests.py b/run_unittests.py index 7c68904..c4d9547 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -74,6 +74,19 @@ def get_soname(fname): def get_rpath(fname): return get_dynamic_section_entry(fname, r'(?:rpath|runpath)') +def skipIfNoPkgconfig(f): + ''' + Skip this test if no pkg-config is found, unless we're on Travis CI + This allows users to run our test suite without having pkg-config installed + on, f.ex., macOS, while ensuring that our Travis CI does not silently skip + the test because of misconfiguration. + ''' + def wrapped(*args, **kwargs): + if 'TRAVIS' not in os.environ and shutil.which('pkg-config') is None: + raise unittest.SkipTest('pkg-config not found') + return f(*args, **kwargs) + return wrapped + class InternalTests(unittest.TestCase): @@ -484,7 +497,7 @@ class BasePlatformTests(unittest.TestCase): src_root = os.path.join(os.getcwd(), src_root) self.src_root = src_root self.prefix = '/usr' - self.libdir = os.path.join(self.prefix, 'lib') + self.libdir = 'lib' # Get the backend # FIXME: Extract this from argv? self.backend = getattr(Backend, os.environ.get('MESON_UNIT_TEST_BACKEND', 'ninja')) @@ -1656,6 +1669,7 @@ int main(int argc, char **argv) { if os.path.splitext(fname)[1] not in ['.c', '.h']: os.unlink(fname) + @skipIfNoPkgconfig def test_pkgconfig_static(self): ''' Test that the we prefer static libraries when `static: true` is @@ -1666,8 +1680,6 @@ int main(int argc, char **argv) { since system libraries -lm will never be found statically. https://github.com/mesonbuild/meson/issues/2785 ''' - if not shutil.which('pkg-config'): - raise unittest.SkipTest('pkg-config not found') (cc, stlinker, objext, shext) = self.detect_prebuild_env() testdir = os.path.join(self.unit_test_dir, '17 pkgconfig static') source = os.path.join(testdir, 'foo.c') @@ -1699,9 +1711,8 @@ int main(int argc, char **argv) { if os.path.splitext(fname)[1] not in ['.c', '.h', '.in']: os.unlink(fname) + @skipIfNoPkgconfig def test_pkgconfig_gen_escaping(self): - if not shutil.which('pkg-config'): - raise unittest.SkipTest('pkg-config not found') testdir = os.path.join(self.common_test_dir, '51 pkgconfig-gen') prefix = '/usr/with spaces' libdir = 'lib' @@ -2264,9 +2275,8 @@ class FailureTests(BasePlatformTests): out = self.init(self.srcdir, extra_args=extra_args, inprocess=True) self.assertRegex(out, match) + @skipIfNoPkgconfig def test_dependency(self): - if not shutil.which('pkg-config'): - raise unittest.SkipTest('pkg-config not found') if subprocess.call(['pkg-config', '--exists', 'zlib']) != 0: raise unittest.SkipTest('zlib not found with pkg-config') a = (("dependency('zlib', method : 'fail')", "'fail' is invalid"), @@ -2660,13 +2670,12 @@ class LinuxlikeTests(BasePlatformTests): self.assertIn(" -Werror ", vala_command) self.assertIn(" -Werror ", c_command) + @skipIfNoPkgconfig def test_qt5dependency_pkgconfig_detection(self): ''' Test that qt4 and qt5 detection with pkgconfig works. ''' # Verify Qt4 or Qt5 can be found with pkg-config - if not shutil.which('pkg-config'): - raise unittest.SkipTest('pkg-config not found') qt4 = subprocess.call(['pkg-config', '--exists', 'QtCore']) qt5 = subprocess.call(['pkg-config', '--exists', 'Qt5Core']) if qt4 != 0 or qt5 != 0: @@ -3206,7 +3215,7 @@ endian = 'little' self.build() mesonbuild.modules.gnome.native_glib_version = None - @unittest.skipIf(shutil.which('pkg-config') is None, 'Pkg-config not found.') + @skipIfNoPkgconfig 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') @@ -3242,7 +3251,7 @@ endian = 'little' self.assertTrue(os.path.isfile(test_exe)) subprocess.check_call(test_exe, env=myenv) - @unittest.skipIf(shutil.which('pkg-config') is None, 'Pkg-config not found.') + @skipIfNoPkgconfig def test_pkgconfig_internal_libraries(self): ''' ''' @@ -3263,7 +3272,7 @@ endian = 'little' self.init(os.path.join(testdirbase, 'app')) self.build() - @unittest.skipIf(shutil.which('pkg-config') is None, 'Pkg-config not found.') + @skipIfNoPkgconfig def test_pkgconfig_formatting(self): testdir = os.path.join(self.unit_test_dir, '31 pkgconfig format') self.init(testdir) @@ -3271,7 +3280,7 @@ endian = 'little' myenv['PKG_CONFIG_PATH'] = self.privatedir stdo = subprocess.check_output(['pkg-config', '--libs-only-l', 'libsomething'], env=myenv) deps = [b'-lgobject-2.0', b'-lgio-2.0', b'-lglib-2.0', b'-lsomething'] - if is_windows() or is_cygwin(): + if is_windows() or is_cygwin() or is_osx(): # On Windows, libintl is a separate library deps.append(b'-lintl') self.assertEqual(set(deps), set(stdo.split())) @@ -3323,6 +3332,36 @@ endian = 'little' self.build() self.run_tests() + @skipIfNoPkgconfig + def test_uninstalled_usage_external_library(self): + ''' + Test that uninstalled usage of an external library (from the system or + PkgConfigDependency) works. On Linux/BSD/macOS it tests if RPATHs are + set correctly. + + TODO: On Windows, this can test whether PATH is set properly + + The system library is found with cc.find_library() and pkg-config deps. + ''' + oldprefix = self.prefix + # Install external library so we can find it + testdir = os.path.join(self.unit_test_dir, '33 external, internal library rpath', 'external library') + installdir = self.installdir + self.prefix = installdir + self.init(testdir) + self.build() + self.install(use_destdir=False) + self.prefix = oldprefix + # New builddir for the consumer + self.new_builddir() + os.environ['LIBRARY_PATH'] = os.path.join(installdir, self.libdir) + os.environ['PKG_CONFIG_PATH'] = os.path.join(installdir, self.libdir, 'pkgconfig') + testdir = os.path.join(self.unit_test_dir, '33 external, internal library rpath', 'built library') + self.init(testdir) + self.build() + self.run_tests() + + class LinuxArmCrossCompileTests(BasePlatformTests): ''' Tests that verify cross-compilation to Linux/ARM diff --git a/test cases/unit/33 external, internal library rpath/built library/bar.c b/test cases/unit/33 external, internal library rpath/built library/bar.c new file mode 100644 index 0000000..4f5662e --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/built library/bar.c @@ -0,0 +1,7 @@ +int foo_system_value (void); +int faa_system_value (void); + +int bar_built_value (int in) +{ + return faa_system_value() + foo_system_value() + in; +} diff --git a/test cases/unit/33 external, internal library rpath/built library/meson.build b/test cases/unit/33 external, internal library rpath/built library/meson.build new file mode 100644 index 0000000..cb58f09 --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/built library/meson.build @@ -0,0 +1,11 @@ +project('built library', 'c') + +cc = meson.get_compiler('c') +foo_system_dep = cc.find_library('foo_in_system') +faa_pkg_dep = dependency('faa_pkg') + +l = shared_library('bar_built', 'bar.c', + dependencies : [foo_system_dep, faa_pkg_dep]) + +e = executable('prog', 'prog.c', link_with: l) +test('testprog', e) diff --git a/test cases/unit/33 external, internal library rpath/built library/meson_options.txt b/test cases/unit/33 external, internal library rpath/built library/meson_options.txt new file mode 100644 index 0000000..aa1d2ec --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/built library/meson_options.txt @@ -0,0 +1 @@ +option('foo_system_path', type: 'string', value: '') diff --git a/test cases/unit/33 external, internal library rpath/built library/prog.c b/test cases/unit/33 external, internal library rpath/built library/prog.c new file mode 100644 index 0000000..e3d4cf6 --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/built library/prog.c @@ -0,0 +1,7 @@ +int bar_built_value (int in); + +int main (int argc, char *argv[]) +{ + // this will evaluate to 0 + return bar_built_value(10) - (42 + 1969 + 10); +} diff --git a/test cases/unit/33 external, internal library rpath/external library/faa.c b/test cases/unit/33 external, internal library rpath/external library/faa.c new file mode 100644 index 0000000..4733575 --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/external library/faa.c @@ -0,0 +1,4 @@ +int faa_system_value (void) +{ + return 1969; +} diff --git a/test cases/unit/33 external, internal library rpath/external library/foo.c b/test cases/unit/33 external, internal library rpath/external library/foo.c new file mode 100644 index 0000000..a34e4a8 --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/external library/foo.c @@ -0,0 +1,4 @@ +int foo_system_value (void) +{ + return 42; +} diff --git a/test cases/unit/33 external, internal library rpath/external library/meson.build b/test cases/unit/33 external, internal library rpath/external library/meson.build new file mode 100644 index 0000000..0e9f443 --- /dev/null +++ b/test cases/unit/33 external, internal library rpath/external library/meson.build @@ -0,0 +1,9 @@ +project('system library', 'c') + +shared_library('foo_in_system', 'foo.c', install : true) +l = shared_library('faa_pkg', 'faa.c', install: true) + +pkg = import('pkgconfig') +pkg.generate(name: 'faa_pkg', + libraries: l, + description: 'FAA, a pkg-config test library') |