linuxboot/populate-lib
Trammell Hudson ef89302095
Quiet build unless V=1 is set (issue #114).
This logs all of the sub-modules into $(build)/log/$(module).log
instead of to stdout, unless the user sets `V=1` on the make
environment.  It produces a much quieter build, which should
allow integration into CI systems.
2017-02-28 18:02:10 -05:00

89 lines
1.4 KiB
Perl
Executable File

#!/usr/bin/perl
# Find all libraries for the executables
#
use warnings;
use strict;
use Data::Dumper;
use File::Copy;
use File::Basename;
my $dest = shift
or die "Usage: $0 dest-dir [programs...]\n";
my %libraries;
my %deps;
for my $file (@ARGV)
{
my @libs = `ldd "$file"`;
for (@libs)
{
if (/ not found/)
{
# check to see if it is already installed
my ($lib) = /^\s*(.*?)\s*=>/;
warn "$file: '$lib' $_"
unless -r "$dest/$lib";
next;
}
if (/ => ([^ ]+)/)
{
# Normal library
$libraries{$1}++;
push @{$deps{$file}}, $1;
}
elsif (/^\s+([^ ]+) \(/)
{
# Dynamic linker
$libraries{$1}++;
}
}
}
#print Dumper(\%libraries);
if(0)
{
print "$_: ", join(" ", @{$deps{$_}}), "\n"
for keys %deps;
print "\n";
}
unless( -d $dest )
{
system("mkdir", "-p", $dest)
and die "$dest: Unable to make directory: $!\n";
}
my $size = 0;
for my $lib (keys %libraries)
{
# skip vdso
next if $lib =~ /vdso/;
warn "$lib\n";
$size += -s $lib;
my $libname = basename $lib;
# my $dirname = dirname "$dest/$lib";
#
# unless( -d $dirname )
# {
# system("mkdir", "-p", $dirname)
# and die "$dirname: Unable to make directory: $!\n";
# }
my $dest_lib = "$dest/$libname";
copy $lib, $dest_lib
or die "$lib: Unable to copy: $!\n";
# make them executable because otherwise chroot barfs
system("chmod", "+x", $dest_lib);
}
print "Total size $size\n";
__END__