diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2018-12-20 22:03:55 +0100 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2018-12-20 23:03:55 +0200 |
commit | 6864ed60dddf68e1e035194e50088649599a8d04 (patch) | |
tree | df088857512d9ae763a345093e67b1d184ce8dee | |
parent | 9b13fb367250444377200911bf50918b7abf2676 (diff) | |
download | meson-6864ed60dddf68e1e035194e50088649599a8d04.zip meson-6864ed60dddf68e1e035194e50088649599a8d04.tar.gz meson-6864ed60dddf68e1e035194e50088649599a8d04.tar.bz2 |
mintro: Bug fix for determine_installed_path for multiple target outputs
-rw-r--r-- | mesonbuild/mintro.py | 20 | ||||
-rwxr-xr-x | run_unittests.py | 27 |
2 files changed, 37 insertions, 10 deletions
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index 48ec20f..3bcacfb 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -51,17 +51,21 @@ def add_arguments(parser): parser.add_argument('builddir', nargs='?', default='.', help='The build directory') def determine_installed_path(target, installdata): - install_target = None - for i in installdata.targets: - if os.path.basename(i.fname) == target.get_filename(): # FIXME, might clash due to subprojects. - install_target = i - break - if install_target is None: + install_targets = [] + for i in target.outputs: + for j in installdata.targets: + if os.path.basename(j.fname) == i: # FIXME, might clash due to subprojects. + install_targets += [j] + break + if len(install_targets) == 0: raise RuntimeError('Something weird happened. File a bug.') - outname = os.path.join(installdata.prefix, i.outdir, os.path.basename(i.fname)) + # Normalize the path by using os.path.sep consistently, etc. # Does not change the effective path. - return str(pathlib.PurePath(outname)) + install_targets = list(map(lambda x: os.path.join(installdata.prefix, x.outdir, os.path.basename(x.fname)), install_targets)) + install_targets = list(map(lambda x: str(pathlib.PurePath(x)), install_targets)) + + return install_targets def list_installed(installdata): diff --git a/run_unittests.py b/run_unittests.py index 6a1f5df..663a3ca 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -1195,6 +1195,12 @@ class BasePlatformTests(unittest.TestCase): ''' self.assertEqual(PurePath(path1), PurePath(path2)) + def assertPathListEqual(self, pathlist1, pathlist2): + self.assertEquals(len(pathlist1), len(pathlist2)) + worklist = list(zip(pathlist1, pathlist2)) + for i in worklist: + self.assertPathEqual(i[0], i[1]) + def assertPathBasenameEqual(self, path, basename): msg = '{!r} does not end with {!r}'.format(path, basename) # We cannot use os.path.basename because it returns '' when the path @@ -1462,8 +1468,25 @@ class AllPlatformTests(BasePlatformTests): intro = self.introspect('--targets') if intro[0]['type'] == 'executable': intro = intro[::-1] - self.assertPathEqual(intro[0]['install_filename'], '/usr/lib/libstat.a') - self.assertPathEqual(intro[1]['install_filename'], '/usr/bin/prog' + exe_suffix) + self.assertPathListEqual(intro[0]['install_filename'], ['/usr/lib/libstat.a']) + self.assertPathListEqual(intro[1]['install_filename'], ['/usr/bin/prog' + exe_suffix]) + + def test_install_introspection_multiple_outputs(self): + ''' + Tests that the Meson introspection API exposes multiple install filenames correctly without crashing + https://github.com/mesonbuild/meson/pull/4555 + ''' + if self.backend is not Backend.ninja: + raise unittest.SkipTest('{!r} backend can\'t install files'.format(self.backend.name)) + testdir = os.path.join(self.common_test_dir, '145 custom target multiple outputs') + self.init(testdir) + intro = self.introspect('--targets') + if intro[0]['type'] == 'executable': + intro = intro[::-1] + self.assertPathListEqual(intro[0]['install_filename'], ['/usr/include/diff.h', '/usr/bin/diff.sh']) + self.assertPathListEqual(intro[1]['install_filename'], ['/opt/same.h', '/opt/same.sh']) + self.assertPathListEqual(intro[2]['install_filename'], ['/usr/include/first.h']) + self.assertPathListEqual(intro[3]['install_filename'], ['/usr/bin/second.sh']) def test_uninstall(self): exename = os.path.join(self.installdir, 'usr/bin/prog' + exe_suffix) |