summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz93@gmail.com>2024-02-26 19:55:54 -0500
committerEli Schwartz <eschwartz93@gmail.com>2024-03-03 13:42:58 -0500
commit4d1bfd0939105d244f974974d52e73c46de0ab53 (patch)
treee80a7a6feca0ede221f003c8a2ec63285e958eb8
parent46f3cff5b26230900473efcd743763daa7c90453 (diff)
downloadmeson-4d1bfd0939105d244f974974d52e73c46de0ab53.tar.gz
compilers: only wrap multiple input libraries with start/end group
When only a single input file shows up in an arglist, it makes no sense to inject `-W,--start-group -lone -Wl,--end-group`, since there is nothing being grouped together. It's just longer command lines for nothing.
-rw-r--r--mesonbuild/compilers/mixins/clike.py3
-rw-r--r--mesonbuild/linkers/linkers.py4
-rw-r--r--unittests/internaltests.py6
3 files changed, 7 insertions, 6 deletions
diff --git a/mesonbuild/compilers/mixins/clike.py b/mesonbuild/compilers/mixins/clike.py
index 0c840a4f6..25feb5c38 100644
--- a/mesonbuild/compilers/mixins/clike.py
+++ b/mesonbuild/compilers/mixins/clike.py
@@ -84,7 +84,8 @@ class CLikeCompilerArgs(arglist.CompilerArgs):
if group_start < 0:
# First occurrence of a library
group_start = i
- if group_start >= 0:
+ # Only add groups if there are multiple libraries.
+ if group_end > group_start >= 0:
# Last occurrence of a library
new.insert(group_end + 1, '-Wl,--end-group')
new.insert(group_start, '-Wl,--start-group')
diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py
index e4db0157f..204826819 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -978,7 +978,7 @@ class Xc16DynamicLinker(DynamicLinker):
version=version)
def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
- if not args:
+ if len(args) < 2:
return args
return self._apply_prefix('--start-group') + args + self._apply_prefix('--end-group')
@@ -1064,7 +1064,7 @@ class TIDynamicLinker(DynamicLinker):
version=version)
def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
- if not args:
+ if len(args) < 2:
return args
return self._apply_prefix('--start-group') + args + self._apply_prefix('--end-group')
diff --git a/unittests/internaltests.py b/unittests/internaltests.py
index fd843c88c..0f2622e35 100644
--- a/unittests/internaltests.py
+++ b/unittests/internaltests.py
@@ -241,7 +241,7 @@ class InternalTests(unittest.TestCase):
gcc.get_default_include_dirs = lambda: ['/usr/include', '/usr/share/include', '/usr/local/include']
## Test that 'direct' append and extend works
l = gcc.compiler_args(['-Lfoodir', '-lfoo'])
- self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-Wl,--start-group', '-lfoo', '-Wl,--end-group'])
+ self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-lfoo'])
# Direct-adding a library and a libpath appends both correctly
l.extend_direct(['-Lbardir', '-lbar'])
self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-Wl,--start-group', '-lfoo', '-Lbardir', '-lbar', '-Wl,--end-group'])
@@ -269,10 +269,10 @@ class InternalTests(unittest.TestCase):
gcc.get_default_include_dirs = lambda: ['/usr/include', '/usr/share/include', '/usr/local/include']
## Test that 'direct' append and extend works
l = gcc.compiler_args(['-Lfoodir', '-lfoo'])
- self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-Wl,--start-group', '-lfoo', '-Wl,--end-group'])
+ self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-lfoo'])
## Test that to_native removes all system includes
l += ['-isystem/usr/include', '-isystem=/usr/share/include', '-DSOMETHING_IMPORTANT=1', '-isystem', '/usr/local/include']
- self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-Wl,--start-group', '-lfoo', '-Wl,--end-group', '-DSOMETHING_IMPORTANT=1'])
+ self.assertEqual(l.to_native(copy=True), ['-Lfoodir', '-lfoo', '-DSOMETHING_IMPORTANT=1'])
def test_string_templates_substitution(self):
dictfunc = mesonbuild.mesonlib.get_filenames_templates_dict