aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
diff options
context:
space:
mode:
authorDavid Seifert <16636962+SoapGentoo@users.noreply.github.com>2019-09-09 01:48:57 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2019-09-08 19:48:57 -0400
commite19a49b8957cd06d6f121812b7b00ef60a57fc7c (patch)
tree22a6842d0f0c36ade922cc9d3574ef541c8eecf9 /mesonbuild/backend
parentc9042fc3eeb0f4e76f5cc1716677aec39e1821b7 (diff)
downloadmeson-e19a49b8957cd06d6f121812b7b00ef60a57fc7c.zip
meson-e19a49b8957cd06d6f121812b7b00ef60a57fc7c.tar.gz
meson-e19a49b8957cd06d6f121812b7b00ef60a57fc7c.tar.bz2
Fix static archives stripping (#5905)
* Do not strip static archives Stripping static archives without more fine-grained options (e.g. `-g`) leads to failures such as ld: libfoo.a: error adding symbols: archive has no index; run ranlib to add one because GNU strip removes *every* symbol in a static archive by default. Given that static archives are not final build artifacts (unlike executables and shared libraries), stripping them gains little and only causes more edge case failures. * Gentoo's portage only strips debug information: https://github.com/gentoo/portage/blob/86f211e3a552753eb945670a39c1a3b14c3c3bd1/bin/estrip#L322 * Fedora also only strips debug information: https://github.com/rpm-software-management/rpm/blob/e9c13c6565cf4782d1f73255ee9144dd9bd2aca7/scripts/brp-strip-static-archive#L18 * Debian also only does some very light stripping: https://github.com/Debian/debhelper/blob/72ed1d3261730d56da6afde0ec7f52f32976e04d/dh_strip#L374 Fixes #4138 * Add test case for static archive stripping
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r--mesonbuild/backend/backends.py15
1 files changed, 14 insertions, 1 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index c0b2666..773c75e 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -1089,7 +1089,20 @@ class Backend:
install_mode = t.get_custom_install_mode()
# Install the target output(s)
if isinstance(t, build.BuildTarget):
- should_strip = self.get_option_for_target('strip', t)
+ # In general, stripping static archives is tricky and full of pitfalls.
+ # Wholesale stripping of static archives with a command such as
+ #
+ # strip libfoo.a
+ #
+ # is broken, as GNU's strip will remove *every* symbol in a static
+ # archive. One solution to this nonintuitive behaviour would be
+ # to only strip local/debug symbols. Unfortunately, strip arguments
+ # are not specified by POSIX and therefore not portable. GNU's `-g`
+ # option (i.e. remove debug symbols) is equivalent to Apple's `-S`.
+ #
+ # TODO: Create GNUStrip/AppleStrip/etc. hierarchy for more
+ # fine-grained stripping of static archives.
+ should_strip = not isinstance(t, build.StaticLibrary) and self.get_option_for_target('strip', t)
# Install primary build output (library/executable/jar, etc)
# Done separately because of strip/aliases/rpath
if outdirs[0] is not False: