mirror of
https://github.com/openssl/openssl.git
synced 2024-12-17 14:03:36 +08:00
45502bfe19
This takes us away from the idea that we know exactly how our static libraries are going to get used. Instead, we make them available to build shareable things with, be it other shared libraries or DSOs. On the other hand, we also have greater control of when the shared library cflags. They will never be used with object files meant got binaries, such as apps/openssl or test/test*. With unified, we take this a bit further and prepare for having to deal with extra cflags specifically to be used with DSOs (dynamic engines), libraries and binaries (applications). Reviewed-by: Rich Salz <rsalz@openssl.org>
117 lines
4.3 KiB
Perl
117 lines
4.3 KiB
Perl
{- # -*- Mode: perl -*-
|
|
|
|
my $a;
|
|
|
|
# resolvedepends and reducedepends work in tandem to make sure
|
|
# there are no duplicate dependencies and that they are in the
|
|
# right order. This is especially used to sort the list of
|
|
# libraries that a build depends on.
|
|
sub resolvedepends {
|
|
my $thing = shift;
|
|
my @listsofar = @_; # to check if we're looping
|
|
my @list = @{$unified_info{depends}->{$thing}};
|
|
my @newlist = ();
|
|
if (scalar @list) {
|
|
foreach my $item (@list) {
|
|
# It's time to break off when the dependency list starts looping
|
|
next if grep { $_ eq $item } @listsofar;
|
|
push @newlist, $item, resolvedepends($item, @listsofar, $item);
|
|
}
|
|
}
|
|
@newlist;
|
|
}
|
|
sub reducedepends {
|
|
my @list = @_;
|
|
my @newlist = ();
|
|
while (@list) {
|
|
my $item = shift @list;
|
|
push @newlist, $item
|
|
unless grep { $item eq $_ } @list;
|
|
}
|
|
@newlist;
|
|
}
|
|
|
|
# doobj is responsible for producing all the recipes that build
|
|
# object files as well as dependency files.
|
|
sub doobj {
|
|
my $obj = shift;
|
|
(my $obj_no_o = $obj) =~ s|\.o$||;
|
|
my $bin = shift;
|
|
my %opts = @_;
|
|
if (@{$unified_info{sources}->{$obj}}) {
|
|
$OUT .= src2obj(obj => $obj_no_o,
|
|
srcs => $unified_info{sources}->{$obj},
|
|
deps => [ reducedepends(resolvedepends($obj)) ],
|
|
incs => [ @{$unified_info{includes}->{$bin}},
|
|
@{$unified_info{includes}->{$obj}} ],
|
|
%opts);
|
|
}
|
|
}
|
|
|
|
# dolib is responsible for building libraries. It will call
|
|
# libobj2shlib is shared libraries are produced, and obj2lib in all
|
|
# cases. It also makes sure all object files for the library are
|
|
# built.
|
|
sub dolib {
|
|
my $lib = shift;
|
|
if (!$config{no_shared}) {
|
|
my %ordinals =
|
|
$unified_info{ordinals}->{$lib}
|
|
? (ordinals => $unified_info{ordinals}->{$lib}) : ();
|
|
$OUT .= libobj2shlib(shlib => $unified_info{sharednames}->{$lib},
|
|
lib => $lib,
|
|
objs => [ map { (my $x = $_) =~ s|\.o$||; $x }
|
|
@{$unified_info{sources}->{$lib}} ],
|
|
deps => [ reducedepends(resolvedepends($lib)) ],
|
|
%ordinals);
|
|
}
|
|
$OUT .= obj2lib(lib => $lib,
|
|
objs => [ map { (my $x = $_) =~ s|\.o$||; $x }
|
|
@{$unified_info{sources}->{$lib}} ]);
|
|
map { doobj($_, $lib, intent => "lib") } @{$unified_info{sources}->{$lib}};
|
|
}
|
|
|
|
# doengine is responsible for building engines. It will call
|
|
# obj2dso, and also makes sure all object files for the library
|
|
# are built.
|
|
sub doengine {
|
|
my $lib = shift;
|
|
$OUT .= obj2dso(lib => $lib,
|
|
objs => [ map { (my $x = $_) =~ s|\.o$||; $x }
|
|
@{$unified_info{sources}->{$lib}} ],
|
|
deps => [ resolvedepends($lib) ]);
|
|
map { doobj($_, $lib, intent => "dso") } @{$unified_info{sources}->{$lib}};
|
|
}
|
|
|
|
# dobin is responsible for building programs. It will call obj2bin,
|
|
# and also makes sure all object files for the library are built.
|
|
sub dobin {
|
|
my $bin = shift;
|
|
my $deps = [ reducedepends(resolvedepends($bin)) ];
|
|
$OUT .= obj2bin(bin => $bin,
|
|
objs => [ map { (my $x = $_) =~ s|\.o$||; $x }
|
|
@{$unified_info{sources}->{$bin}} ],
|
|
deps => $deps);
|
|
map { doobj($_, $bin, intent => "bin") } @{$unified_info{sources}->{$bin}};
|
|
}
|
|
|
|
# dobin is responsible for building scripts from templates. It will
|
|
# call in2script.
|
|
sub doscript {
|
|
my $script = shift;
|
|
$OUT .= in2script(script => $script,
|
|
sources => $unified_info{sources}->{$script});
|
|
}
|
|
|
|
# Build all known libraries, engines, programs and scripts.
|
|
# Everything else will be handled as a consequence.
|
|
map { dolib($_) } @{$unified_info{libraries}};
|
|
map { doengine($_) } @{$unified_info{engines}};
|
|
map { dobin($_) } @{$unified_info{programs}};
|
|
map { doscript($_) } @{$unified_info{scripts}};
|
|
|
|
# Finally, should there be any applicable BEGINRAW/ENDRAW sections,
|
|
# they are added here.
|
|
$OUT .= $_."\n" foreach(@{$unified_info{rawlines}});
|
|
-}
|