[gentoo-dev] [PATCH] autotools-utils.eclass: punt unnecessary .la files even w/ USE=static-libs.

September 12th, 2011 - 04:00 pm ET by Michał Górny | Report spam
Right now, autotools-utils.eclass punts .la files only with
USE=-static-libs. We'd like to broaden the range of it and strip .la
files when they are not necessary for static linkage as well.

The following patch introduces an initial support for that. It assumes
that the .la file can be removed if the library is mentioned in any of
pkg-config files installed by the package, or if doesn't specify any
dependency libs nor linker flags.

The code would probably use some refactoring but we will handle that
after more testing (and possibly extensions) to the concept itself.

autotools-utils.eclass | 25 +++++++++++++++++++++++--
1 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/autotools-utils.eclass b/autotools-utils.eclass
index 7905d44..ce6613b 100644
a/autotools-utils.eclass
+++ b/autotools-utils.eclass
@@ -132,7 +132,7 @@ _check_build_dir() {
}

# @FUNCTION: remove_libtool_files
-# @USAGE: [all|none]
+# @USAGE: [all|only-not-required|none]
# @DESCRIPTION:
# Determines unnecessary libtool files (.la) and libtool static archives (.a)
# and removes them from installation image.
@@ -145,11 +145,32 @@ _check_build_dir() {
remove_libtool_files() {
debug-print-function ${FUNCNAME} "$@"

+ if [[ "$1" == 'only-not-required' ]]; then
+ local pc_libs=''
+
+ for arg in $(find "${D}" -name '*.pc' -exec sed -n -e 's;^Libs:;;p' {} +); do
+ if [[ ${arg} == -l* ]]; then
+ pc_libs="${pc_libs} lib${arg#-l}.la"
+ fi
+ done
+ fi
+
local f
for f in $(find "${D}" -type f -name '*.la'); do
# Keep only .la files with shouldnotlink=yes - likely plugins
local shouldnotlink=$(sed -ne '/^shouldnotlink=yes$/p' "${f}")
if [[ "$1" == 'all' || -z ${shouldnotlink} ]]; then
+ if [[ "$1" == 'only-not-required' ]]; then
+ # remove .la files only when .pc files provide the libs
+ # already or they don't give any information
+ ! has $(basename "${f}") ${pc_libs} \
+ && [[ -n "$(sed -n \
+ -e "s/^dependency_libs='\(.*\)'$/\1/p" \
+ -e "s/^inherited_linker_flags='\(.*\)'$/\1/p" \
+ "${f}")" ]] \
+ && continue
+ fi
+
if [[ "$1" != 'none' ]]; then
echo "Removing unnecessary ${f}"
rm -f "${f}"
@@ -246,7 +267,7 @@ autotools-utils_src_install() {

# Remove libtool files and unnecessary static libs
local args
- has static-libs ${IUSE//+} && ! use static-libs || args='none'
+ has static-libs ${IUSE//+} && ! use static-libs || args='only-not-required'
remove_libtool_files ${args}
}

1.7.6.1
email Follow the discussionReplies 20 repliesReplies Make a reply

Replies

#1 Donnie Berkholz
September 12th, 2011 - 05:10 pm ET | Report spam

On 21:57 Mon 12 Sep , Michał Górny wrote:
Right now, autotools-utils.eclass punts .la files only with
USE=-static-libs. We'd like to broaden the range of it and strip .la
files when they are not necessary for static linkage as well.

The following patch introduces an initial support for that. It assumes
that the .la file can be removed if the library is mentioned in any of
pkg-config files installed by the package, or if doesn't specify any
dependency libs nor linker flags.



If I understand correctly, this will break for any packages that don't
use pkg-config to link. The maintainers will manually need to add
pkg-config calls to the ebuilds of anything that could statically link
against a library using only libtool and not pkg-config. Is that
accurate?

It might be worthwhile to add an easy way to force this argument on for
every package for the purposes of testing, e.g. an environment variable.

# @FUNCTION: remove_libtool_files
-# @USAGE: [all|none]
+# @USAGE: [all|only-not-required|none]



Is there a way to document the arguments of eclass functions? You added
the name of the arg but didn't describe its purpose or why anyone would
want to use it.

On a semantic note, that argument name (only-not-required) doesn't make
sense to me. I might do something more helpful like pkgconfig-duplicates
instead.

+ if [[ "$1" == 'only-not-required' ]]; then



This is way more quoting than you need within double brackets.

local f
for f in $(find "${D}" -type f -name '*.la'); do
# Keep only .la files with shouldnotlink=yes - likely plugins
local shouldnotlink=$(sed -ne '/^shouldnotlink=yes$/p' "${f}")
if [[ "$1" == 'all' || -z ${shouldnotlink} ]]; then
+ if [[ "$1" == 'only-not-required' ]]; then



Is there a case where one of those arguments might be $2 but you'd still
want to run this?

I feel like that shouldnotlink thing is really confusing the logic,
because there's multiple nested tests for different values of $1 in here
instead of just testing the args once at the top and setting variables.

+ # remove .la files only when .pc files provide the libs
+ # already or they don't give any information
+ ! has $(basename "${f}") ${pc_libs} \
+ && [[ -n "$(sed -n \



The comment says "or" but I see an "and" here.

+ -e "s/^dependency_libs='\(.*\)'$/\1/p" \
+ -e "s/^inherited_linker_flags='\(.*\)'$/\1/p" \
+ "${f}")" ]] \
+ && continue
+ fi
+



Thanks,
Donnie

Donnie Berkholz
Council Member / Sr. Developer
Gentoo Linux
Blog: http://dberkholz.com



Similar topics