#! /usr/bin/env perl
# -*- mode: perl; -*-
-# Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
$config{openssl_thread_defines}=[];
$config{openssl_sys_defines}=[];
$config{openssl_other_defines}=[];
+my $ldflags="";
my $libs="";
my $target="";
$config{options}="";
{
read_config $1;
}
- elsif (/^-[lL](.*)$/ or /^-Wl,/)
+ elsif (/^-L(.*)$/)
+ {
+ $ldflags.=$_." ";
+ }
+ elsif (/^-l(.*)$/ or /^-Wl,/)
{
$libs.=$_." ";
}
$config{defines} = [];
$config{cflags} = "";
$config{cxxflags} = "";
+$config{lflags} = "";
$config{ex_libs} = "";
$config{shared_ldflag} = "";
}
$config{ex_libs}="$libs$config{ex_libs}" if ($libs ne "");
+$config{lflags}="$config{lflags}$ldflags" if ($ldflags ne "");
# If threads aren't disabled, check how possible they are
unless ($disabled{threads}) {
}
$d .= $e;
$unified_info{depends}->{$ddest}->{$d} = 1;
- # If we depend on a header file or a perl module, let's make
- # sure it can get included
- if ($dest ne "" && $d =~ /\.(h|pm)$/) {
- my $i = dirname($d);
- push @{$unified_info{includes}->{$ddest}->{source}}, $i
- unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}->{source}};
- }
}
}
DEPEND and SHARED_SOURCE.
EOF
+ # Massage the result
+
+ # If we depend on a header file or a perl module, add an inclusion of
+ # its directory to allow smoothe inclusion
+ foreach my $dest (keys %{$unified_info{depends}}) {
+ next if $dest eq "";
+ foreach my $d (keys %{$unified_info{depends}->{$dest}}) {
+ next unless $d =~ /\.(h|pm)$/;
+ if ($d eq "configdata.pm"
+ || defined($unified_info{generate}->{$d})) {
+ my $i = cleandir($blddir, dirname($d));
+ push @{$unified_info{includes}->{$dest}->{build}}, $i
+ unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{build}};
+ } else {
+ my $i = cleandir($srcdir, dirname($d));
+ push @{$unified_info{includes}->{$dest}->{source}}, $i
+ unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{source}};
+ }
+ }
+ }
+
+ # Trickle down includes placed on libraries, engines and programs to
+ # their sources (i.e. object files)
+ foreach my $dest (keys %{$unified_info{engines}},
+ keys %{$unified_info{libraries}},
+ keys %{$unified_info{programs}}) {
+ foreach my $k (("source", "build")) {
+ next unless defined($unified_info{includes}->{$dest}->{$k});
+ my @incs = reverse @{$unified_info{includes}->{$dest}->{$k}};
+ foreach my $obj (grep /\.o$/,
+ (keys %{$unified_info{sources}->{$dest}},
+ keys %{$unified_info{shared_sources}->{$dest}})) {
+ foreach my $inc (@incs) {
+ unshift @{$unified_info{includes}->{$obj}->{$k}}, $inc
+ unless grep { $_ eq $inc } @{$unified_info{includes}->{$obj}->{$k}};
+ }
+ }
+ }
+ delete $unified_info{includes}->{$dest};
+ }
+
### Make unified_info a bit more efficient
# One level structures
foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
# Includes
foreach my $dest (sort keys %{$unified_info{includes}}) {
if (defined($unified_info{includes}->{$dest}->{build})) {
- my @source_includes =
- ( @{$unified_info{includes}->{$dest}->{source}} );
+ my @source_includes = ();
+ @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} )
+ if defined($unified_info{includes}->{$dest}->{source});
$unified_info{includes}->{$dest} =
[ @{$unified_info{includes}->{$dest}->{build}} ];
foreach my $inc (@source_includes) {
#print "RANLIB =", $target{ranlib} eq '$(CROSS_COMPILE)ranlib' ?
# "$config{cross_compile_prefix}ranlib" :
# "$target{ranlib}", "\n";
+print "LDFLAGS =$config{lflags} $target{lflags}\n";
print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n";
my %builders = (
%targets = read_eval_file($fname);
}
+ my %preexisting = ();
+ foreach (sort keys %targets) {
+ $preexisting{$_} = 1 if $table{$_};
+ }
+ die <<"EOF",
+The following config targets from $fname
+shadow pre-existing config targets with the same name:
+EOF
+ map { " $_\n" } sort keys %preexisting
+ if %preexisting;
+
# For each target, check that it's configured with a hash table.
foreach (keys %targets) {