- $OUT .= obj2lib(lib => $lib,
- objs => [ map { (my $x = $_) =~ s|\.o$||; $x }
- @{$unified_info{sources}->{$lib}} ]);
- foreach (@{$unified_info{sources}->{$lib}}) {
- doobj($_, $lib, intent => "lib");
+ {
+ # When putting static libraries together, we cannot rely on any
+ # symbol resolution, so for all static libraries used as source for
+ # this one, as well as other libraries they depend on, we simply
+ # grab all their object files unconditionally,
+ # Symbol resolution will happen when any program, module or shared
+ # library is linked with this one.
+ my @objs = ();
+ my @sourcedeps = ();
+ my @foreign_objs = ();
+ foreach (@{$unified_info{sources}->{$lib}}) {
+ if ($_ !~ m|\.a$|) {
+ push @objs, $_;
+ } else {
+ push @sourcedeps, $_;
+ }
+ }
+ @sourcedeps = ( grep { $_ ne $lib } resolvedepends(@sourcedeps) );
+ print STDERR "DEBUG[dolib:lib] : \@sourcedeps for $_ : ",
+ join(",", map { "\n $_" } @sourcedeps), "\n"
+ if @sourcedeps && $debug_rules;
+ @foreign_objs = getlibobjs('sources', @sourcedeps);
+ print STDERR "DEBUG[dolib:lib] \%attrs for $lib : ", ,
+ join(",", map { "\n $_ = $attrs{$_}" } sort keys %attrs), "\n"
+ if %attrs && $debug_rules;
+ print STDERR "DEBUG[dolib:lib] \@objs for $lib : ",
+ join(",", map { "\n $_" } @objs), "\n"
+ if @objs && $debug_rules;
+ print STDERR "DEBUG[dolib:lib] \@foreign_objs for $lib : ",
+ join(",", map { "\n $_" } @foreign_objs), "\n"
+ if @foreign_objs && $debug_rules;
+ $OUT .= obj2lib(lib => $lib, attrs => { %attrs },
+ objs => [ @objs, @foreign_objs ]);
+ foreach (@objs) {
+ doobj($_, $lib, intent => "lib", attrs => { %attrs });
+ }