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

2011-09-12 Thread Michał Górny
On Mon, 12 Sep 2011 17:10:49 -0500
Donnie Berkholz  wrote:

> On 23:58 Mon 12 Sep , Michał Górny wrote:
> > On Mon, 12 Sep 2011 16:00:20 -0500
> > Donnie Berkholz  wrote:
> > > > 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?
> > 
> > Er? What are you referring to?
> 
> Two things.
> 
> 1. This is only reached if shouldnotlink is false. That means it's
> only the things that you are already assuming are plugins, right? If
> so, why is this even done?

That simply means that we're never removing .la files for plugins
(right now) because plugin loaders may need them with shared linking.
The other case are regular libraries where .la files are removed as
described above.

> 2. What happens if I call it with `remove_libtool_files all 
> only-not-required`? Nobody ever does any checking of the # of args.

Will add.

> > > > +   # 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.
> > 
> > Because everything's negated here. Boolean magic :D.
> 
> OK, got it. Stop writing confusing logic. =P

It's confusing because of that 'continue', I guess ;P.

-- 
Best regards,
Michał Górny


signature.asc
Description: PGP signature


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

2011-09-12 Thread Samuli Suominen
On 09/13/2011 12:51 AM, Donnie Berkholz wrote:
> On 00:46 Tue 13 Sep , Samuli Suominen wrote:
>>> 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?
>>
>> Yes, seems accurate.
>>
>> I can think of 'export PKG_CONFIG="$($(tc-getPKG_CONFIG) --static)' or 
>> something like 'export FOO_LIBS="$($(tc-getPKG_CONFIG) --libs --static 
>> foo)"' to accomplish getting static flags from an ebuild using 
>> toolchain-funcs.eclass if required.
>>
>> Or they do it like lvm2 and cryptsetup at upstream level and add 
>> support for statically linking the tools in the build-system.
>>
>> The .la files are not helping packages not using libtool in any case, 
>> for example, those using cmake as build-system.
>>
>> And I've yet to see a real, in portage residing, example of where this 
>> would really break anything and when I will, I'll gladly help 
>> migrating it to the example mentioned above... Overall, corner cases 
>> that can be easily worked around, yet punting the *harmful* .la files.
> 
> That's rather shocking. All it would take is trying to statically build 
> a package not using pkg-config that links against anything X11-related 
> (since all of them have .pc files).

Those packages that have pkg-config file, like libX11, are meant to be
used through pkg-config, so the bug would be in the package not using
the .pc, not in the package lacking the .la

> It's probably more that "nobody" cares about static building than that 
> there aren't packages that would break.

I'm looking forward in catching those packages trying to link statically
to a package providing valid pkg-config file, yet not using it...



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

2011-09-12 Thread Donnie Berkholz
On 23:58 Mon 12 Sep , Michał Górny wrote:
> On Mon, 12 Sep 2011 16:00:20 -0500
> Donnie Berkholz  wrote:
> > >   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?
> 
> Er? What are you referring to?

Two things.

1. This is only reached if shouldnotlink is false. That means it's only 
the things that you are already assuming are plugins, right? If so, why 
is this even done?

2. What happens if I call it with `remove_libtool_files all 
only-not-required`? Nobody ever does any checking of the # of args.

> > 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.
> 
> As mentioned earlier, the code needs to be refactored. First things 
> first, then we'll rewrite it to be nice and clean. I don't really want 
> to waste time doing this if we would need to rewrite it for more logic 
> in the future.

I'd rewrite it once as soon as you get all the reviews and before 
committing. Rewrites tend to never happen, since it turns out that 
people have other things to do with their time.

> > > + # 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.
> 
> Because everything's negated here. Boolean magic :D.

OK, got it. Stop writing confusing logic. =P

-- 
Thanks,
Donnie

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


pgprcOSPCGwcn.pgp
Description: PGP signature


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

2011-09-12 Thread Michał Górny
On Mon, 12 Sep 2011 16:00:20 -0500
Donnie Berkholz  wrote:

> >  # @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.

I thinked about 'as-needed' or sth like that. Maybe the new argument
should be (temporarily) not public instead?

> > +   if [[ "$1" == 'only-not-required' ]]; then
> 
> This is way more quoting than you need within double brackets.

It's nice visual quoting, just to match the others.

> > 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?

Er? What are you referring to?

> 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.

As mentioned earlier, the code needs to be refactored. First things
first, then we'll rewrite it to be nice and clean. I don't really want
to waste time doing this if we would need to rewrite it for more logic
in the future.

> > +   # 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.

Because everything's negated here. Boolean magic :D.

-- 
Best regards,
Michał Górny


signature.asc
Description: PGP signature


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

2011-09-12 Thread Donnie Berkholz
On 00:46 Tue 13 Sep , Samuli Suominen wrote:
> > 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?
> 
> Yes, seems accurate.
> 
> I can think of 'export PKG_CONFIG="$($(tc-getPKG_CONFIG) --static)' or 
> something like 'export FOO_LIBS="$($(tc-getPKG_CONFIG) --libs --static 
> foo)"' to accomplish getting static flags from an ebuild using 
> toolchain-funcs.eclass if required.
> 
> Or they do it like lvm2 and cryptsetup at upstream level and add 
> support for statically linking the tools in the build-system.
> 
> The .la files are not helping packages not using libtool in any case, 
> for example, those using cmake as build-system.
> 
> And I've yet to see a real, in portage residing, example of where this 
> would really break anything and when I will, I'll gladly help 
> migrating it to the example mentioned above... Overall, corner cases 
> that can be easily worked around, yet punting the *harmful* .la files.

That's rather shocking. All it would take is trying to statically build 
a package not using pkg-config that links against anything X11-related 
(since all of them have .pc files).

It's probably more that "nobody" cares about static building than that 
there aren't packages that would break.

-- 
Thanks,
Donnie

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


pgphwBqOBZT6Q.pgp
Description: PGP signature


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

2011-09-12 Thread Samuli Suominen
On 09/13/2011 12:00 AM, Donnie Berkholz wrote:
> 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?

Yes, seems accurate.

I can think of 'export PKG_CONFIG="$($(tc-getPKG_CONFIG) --static)' or
something like 'export FOO_LIBS="$($(tc-getPKG_CONFIG) --libs --static
foo)"' to accomplish getting static flags from an ebuild using
toolchain-funcs.eclass if required.

Or they do it like lvm2 and cryptsetup at upstream level and add
support for statically linking the tools in the build-system.

The .la files are not helping packages not using libtool in any case,
for example, those using cmake as build-system.

And I've yet to see a real, in portage residing, example of where this
would really break anything and when I will, I'll gladly help migrating
it to the example mentioned above... Overall, corner cases that can be
easily worked around, yet punting the *harmful* .la files.

- Samuli



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

2011-09-12 Thread Donnie Berkholz
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


pgpMghPH2v6CX.pgp
Description: PGP signature


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

2011-09-12 Thread Michał Górny
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