diff options
author | Aleksey Gurtovoy <agurtovoy@acm.org> | 2019-09-03 16:43:48 -0500 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2019-09-27 00:57:21 +0300 |
commit | 7dbabdc7b696aca4aadc3dfab5045a08662fdfde (patch) | |
tree | 6ece70f048f7f3f97a942283af892c2cc67b7420 | |
parent | 534e94ffc35dae3a0b2cc9f1e60e7e452872c512 (diff) | |
download | meson-7dbabdc7b696aca4aadc3dfab5045a08662fdfde.zip meson-7dbabdc7b696aca4aadc3dfab5045a08662fdfde.tar.gz meson-7dbabdc7b696aca4aadc3dfab5045a08662fdfde.tar.bz2 |
Correctly handle platform-specific LDFLAGS options
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 2 | ||||
-rw-r--r-- | mesonbuild/compilers/compilers.py | 5 | ||||
-rw-r--r-- | mesonbuild/compilers/mixins/visualstudio.py | 12 | ||||
-rw-r--r-- | mesonbuild/linkers.py | 11 | ||||
-rwxr-xr-x | run_unittests.py | 71 |
5 files changed, 71 insertions, 30 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 417f6d9..8315ab1 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -2385,7 +2385,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) build_dir = self.environment.get_build_dir() # the following loop sometimes consumes two items from command in one pass - it = iter(commands) + it = iter(linker.native_args_to_unix(commands)) for item in it: if item in internal and not item.startswith('-'): continue diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index bb698fc..2c9508b 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -900,6 +900,11 @@ class Compiler: "Always returns a copy that can be independently mutated" return args[:] + @classmethod + def native_args_to_unix(cls, args: typing.List[str]) -> typing.List[str]: + "Always returns a copy that can be independently mutated" + return args[:] + def find_library(self, *args, **kwargs): raise EnvironmentException('Language {} does not support library finding.'.format(self.get_display_language())) diff --git a/mesonbuild/compilers/mixins/visualstudio.py b/mesonbuild/compilers/mixins/visualstudio.py index 5fe8599..48a2229 100644 --- a/mesonbuild/compilers/mixins/visualstudio.py +++ b/mesonbuild/compilers/mixins/visualstudio.py @@ -234,6 +234,18 @@ class VisualStudioLikeCompiler(metaclass=abc.ABCMeta): result.append(i) return result + @classmethod + def native_args_to_unix(cls, args: typing.List[str]) -> typing.List[str]: + result = [] + for arg in args: + if arg.startswith('/LIBPATH:'): + result.append('-L' + arg[9:]) + elif arg.endswith(('.a', '.lib')) and not os.path.isabs(arg): + result.append('-l' + arg) + else: + result.append(arg) + return result + def get_werror_args(self) -> typing.List[str]: return ['/WX'] diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py index 8c5bd99..c5c9813 100644 --- a/mesonbuild/linkers.py +++ b/mesonbuild/linkers.py @@ -69,7 +69,11 @@ class StaticLinker: @classmethod def unix_args_to_native(cls, args: typing.List[str]) -> typing.List[str]: - return args + return args[:] + + @classmethod + def native_args_to_unix(cls, args: typing.List[str]) -> typing.List[str]: + return args[:] def get_link_debugfile_args(self, targetfile: str) -> typing.List[str]: # Static libraries do not have PDB files @@ -106,6 +110,11 @@ class VisualStudioLikeLinker: from .compilers import VisualStudioCCompiler return VisualStudioCCompiler.unix_args_to_native(args) + @classmethod + def native_args_to_unix(cls, args: typing.List[str]) -> typing.List[str]: + from .compilers import VisualStudioCCompiler + return VisualStudioCCompiler.native_args_to_unix(args) + class VisualStudioLinker(VisualStudioLikeLinker, StaticLinker): diff --git a/run_unittests.py b/run_unittests.py index 7c79fa3..c85ae50 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -3079,47 +3079,62 @@ recommended as it is not supported on some platforms''') Test that meson adds dependencies for libraries based on the final linker command line. ''' - # build library testdirbase = os.path.join(self.unit_test_dir, '29 guessed linker dependencies') testdirlib = os.path.join(testdirbase, 'lib') + extra_args = None + libdir_flags = ['-L'] env = get_fake_env(testdirlib, self.builddir, self.prefix) - if env.detect_c_compiler(MachineChoice.HOST).get_id() not in {'msvc', 'clang-cl', 'intel-cl'}: + if env.detect_c_compiler(MachineChoice.HOST).get_id() in {'msvc', 'clang-cl', 'intel-cl'}: + # msvc-like compiler, also test it with msvc-specific flags + libdir_flags += ['/LIBPATH:'] + else: # static libraries are not linkable with -l with msvc because meson installs them # as .a files which unix_args_to_native will not know as it expects libraries to use # .lib as extension. For a DLL the import library is installed as .lib. Thus for msvc # this tests needs to use shared libraries to test the path resolving logic in the # dependency generation code path. extra_args = ['--default-library', 'static'] - self.init(testdirlib, extra_args=extra_args) - self.build() - self.install() - libbuilddir = self.builddir - installdir = self.installdir - libdir = os.path.join(self.installdir, self.prefix.lstrip('/').lstrip('\\'), 'lib') - # build user of library - self.new_builddir() - # replace is needed because meson mangles platform pathes passed via LDFLAGS - self.init(os.path.join(testdirbase, 'exe'), - override_envvars={"LDFLAGS": '-L{}'.format(libdir.replace('\\', '/'))}) - self.build() - self.assertBuildIsNoop() + initial_builddir = self.builddir + initial_installdir = self.installdir - # rebuild library - exebuilddir = self.builddir - self.installdir = installdir - self.builddir = libbuilddir - # Microsoft's compiler is quite smart about touching import libs on changes, - # so ensure that there is actually a change in symbols. - self.setconf('-Dmore_exports=true') - self.build() - self.install() - # no ensure_backend_detects_changes needed because self.setconf did that already + for libdir_flag in libdir_flags: + # build library + self.init(testdirlib, extra_args=extra_args) + self.build() + self.install() + libbuilddir = self.builddir + installdir = self.installdir + libdir = os.path.join(self.installdir, self.prefix.lstrip('/').lstrip('\\'), 'lib') + + # build user of library + self.new_builddir() + # replace is needed because meson mangles platform pathes passed via LDFLAGS + self.init(os.path.join(testdirbase, 'exe'), + override_envvars={"LDFLAGS": '{}{}'.format(libdir_flag, libdir.replace('\\', '/'))}) + self.build() + self.assertBuildIsNoop() + + # rebuild library + exebuilddir = self.builddir + self.installdir = installdir + self.builddir = libbuilddir + # Microsoft's compiler is quite smart about touching import libs on changes, + # so ensure that there is actually a change in symbols. + self.setconf('-Dmore_exports=true') + self.build() + self.install() + # no ensure_backend_detects_changes needed because self.setconf did that already + + # assert user of library will be rebuild + self.builddir = exebuilddir + self.assertRebuiltTarget('app') + + # restore dirs for the next test case + self.installdir = initial_builddir + self.builddir = initial_installdir - # assert user of library will be rebuild - self.builddir = exebuilddir - self.assertRebuiltTarget('app') def test_conflicting_d_dash_option(self): testdir = os.path.join(self.unit_test_dir, '37 mixed command line args') |