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.
diff --git a/mesonbuild/compilers/mixins/clike.py b/mesonbuild/compilers/mixins/clike.py
index 0c840a4..25feb5c 100644
--- a/mesonbuild/compilers/mixins/clike.py
+++ b/mesonbuild/compilers/mixins/clike.py
@@ -84,7 +84,8 @@
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 e4db015..2048268 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -978,7 +978,7 @@
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 @@
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 fd843c8..0f2622e 100644
--- a/unittests/internaltests.py
+++ b/unittests/internaltests.py
@@ -241,7 +241,7 @@
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 @@
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