Gentoo Archives: gentoo-dev

From: "Michał Górny" <mgorny@g.o>
To: gentoo-dev@l.g.o
Cc: "Michał Górny" <mgorny@g.o>
Subject: [gentoo-dev] [PATCH] autotools-utils.eclass: punt unnecessary .la files even w/ USE=static-libs.
Date: Mon, 12 Sep 2011 19:56:55
Message-Id: 1315857465-8179-1-git-send-email-mgorny@gentoo.org
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

Replies