summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Configurations/shared-info.pl102
-rw-r--r--Configurations/unix-Makefile.tmpl11
-rw-r--r--Configurations/windows-makefile.tmpl4
-rwxr-xr-xConfigure48
4 files changed, 155 insertions, 10 deletions
diff --git a/Configurations/shared-info.pl b/Configurations/shared-info.pl
new file mode 100644
index 0000000000..c5ebfc6e37
--- /dev/null
+++ b/Configurations/shared-info.pl
@@ -0,0 +1,102 @@
+#! /usr/bin/env perl
+# -*- mode: perl; -*-
+# Copyright 2016-2017 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
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+# This is a collection of extra attributes to be used as input for creating
+# shared libraries, currently on any Unix variant, including Unix like
+# environments on Windows.
+
+sub detect_gnu_ld {
+ my @lines =
+ `$config{cross_compile_prefix}$target{cc} -Wl,-V /dev/null 2>&1`;
+ return grep /^GNU ld/, @lines;
+}
+sub detect_gnu_cc {
+ my @lines =
+ `$config{cross_compile_prefix}$target{cc} -v 2>&1`;
+ return grep /gcc/, @lines;
+}
+
+my %shared_info;
+%shared_info = (
+ 'gnu-shared' => {
+ shared_ldflag => '-shared -Wl,-Bsymbolic',
+ shared_sonameflag => '-Wl,-soname=',
+ },
+ 'linux-shared' => sub {
+ return {
+ %{$shared_info{'gnu-shared'}},
+ shared_defflag => '-Wl,--version-script=',
+ };
+ },
+ 'bsd-gcc-shared' => sub { return $shared_info{'linux-shared'}; },
+ 'bsd-shared' => sub {
+ return $shared_info{'gnu-shared'} if detect_gnu_ld();
+ return {
+ shared_ldflag => '-shared -nostdlib',
+ };
+ },
+ 'darwin-shared' => {
+ dso_lflags => '-bundle',
+ shared_ldflag => '-dynamiclib -current_version $(SHLIB_VERSION_NUMBER) -compatibility_version $(SHLIB_VERSION_NUMBER)',
+ shared_sonameflag => '-install_name $(INSTALLTOP)/$(LIBDIR)/',
+ },
+ 'cygwin-shared' => {
+ shared_ldflag => '-shared -Wl,--enable-auto-image-base',
+ shared_impflag => '-Wl,--out-implib=',
+ },
+ 'mingw-shared' => sub {
+ return {
+ %{$shared_info{'cygwin-shared'}},
+ # def_flag made to empty string so it still generates
+ # something
+ shared_defflag => '',
+ };
+ },
+ 'alpha-osf1-shared' => sub {
+ return $shared_info{'gnu-shared'} if detect_gnu_ld();
+ return {
+ dso_lflags => '-shared -Wl,-Bsymbolic',
+ shared_ldflag => '-shared -Wl,-Bsymbolic -set_version $(SHLIB_VERSION_NUMBER)',
+ };
+ },
+ 'solaris-shared' => {
+ shared_ldflag => '-Wl,-Bsymbolic',
+ shared_defflag => '-Wl,-M,',
+ },
+ 'svr3-shared' => sub {
+ return $shared_info{'gnu-shared'} if detect_gnu_ld();
+ return {
+ shared_ldflag => '-G',
+ shared_sonameflag => '-h ',
+ };
+ },
+ 'svr5-shared' => sub {
+ return $shared_info{'gnu-shared'} if detect_gnu_ld();
+ return {
+ shared_ldflag => detect_gnu_cc() ? '-shared' : '-G',
+ shared_sonameflag => '-h ',
+ };
+ },
+ 'irix-shared' => sub {
+ return $shared_info{'gnu-shared'} if detect_gnu_ld();
+ return {
+ shared_ldflag => '-shared -Wl,-Bsymbolic',
+ shared_sonameflag => '-Wl,-soname=',
+ };
+ },
+ 'hpux-shared' => {
+ bin_lflags => '-Wl,+s,+cdp,../:,+cdp,./:',
+ shared_ldflag => '-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:',
+ shared_sonameflag => '-Wl,+h,',
+ },
+ 'aix-shared' => {
+ bin_lflags => '-Wl,-bsvr4',
+ shared_ldflag => '-Wl,-bexpall,-bnolibpath,-bM:SRE',
+ },
+);
diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl
index d66160f3c0..08ad527c2b 100644
--- a/Configurations/unix-Makefile.tmpl
+++ b/Configurations/unix-Makefile.tmpl
@@ -195,11 +195,12 @@ EX_LIBS= {- $target{ex_libs} -} {- $config{ex_libs} -}
LIB_CFLAGS={- $target{shared_cflag} || "" -}
LIB_CXXFLAGS={- $target{shared_cxxflag} || "" -}
LIB_LDFLAGS={- $target{shared_ldflag}." ".$config{shared_ldflag} -}
-DSO_CFLAGS={- $target{shared_cflag} || "" -}
-DSO_CXXFLAGS={- $target{shared_cxxflag} || "" -}
-DSO_LDFLAGS=$(LIB_LDFLAGS)
-BIN_CFLAGS={- $target{bin_cflags} -}
-BIN_CXXFLAGS={- $target{bin_cxxflag} || "" -}
+DSO_CFLAGS={- $target{dso_cflags} || "" -}
+DSO_CXXFLAGS={- $target{dso_cxxflags} || "" -}
+DSO_LDFLAGS={- $target{dso_lflags} || "" -}
+BIN_CFLAGS={- $target{bin_cflags} || "" -}
+BIN_CXXFLAGS={- $target{bin_cxxflags} || "" -}
+BIN_LDFLAGS={- $target{bin_lflags} || "" -}
PERL={- $config{perl} -}
diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl
index 0ea1bbab95..db79cd3ce1 100644
--- a/Configurations/windows-makefile.tmpl
+++ b/Configurations/windows-makefile.tmpl
@@ -169,8 +169,8 @@ LDOUTFLAG={- $target{loutflag} || "/out:" -}$(OSSL_EMPTY)
EX_LIBS={- $target{ex_libs} -}
LIB_CFLAGS={- join(" ", $target{lib_cflags}, $target{shared_cflag}) || "" -}
LIB_LDFLAGS={- $target{shared_ldflag} || "" -}
-DSO_CFLAGS={- join(" ", $target{dso_cflags}, $target{shared_cflag}) || "" -}
-DSO_LDFLAGS={- join(" ", $target{dso_lflags}, $target{shared_ldflag}) || "" -}
+DSO_CFLAGS={- $target{dso_cflags} || "" -}
+DSO_LDFLAGS={- $target{dso_ldflag} || "" -}
BIN_CFLAGS={- $target{bin_cflags} -}
BIN_LDFLAGS={- $target{bin_lflags} -}
diff --git a/Configure b/Configure
index 2c601ad41a..a5d5c84e02 100755
--- a/Configure
+++ b/Configure
@@ -879,9 +879,48 @@ my %target = resolve_config($target);
&usage if (!%target || $target{template});
+%target = ( %{$table{DEFAULTS}}, %target );
+
+# Make the flags to build DSOs the same as for shared libraries unless they
+# are already defined
+$target{dso_cflags} = $target{shared_cflag} unless defined $target{dso_cflags};
+$target{dso_cxxflags} = $target{shared_cxxflag} unless defined $target{dso_cxxflags};
+$target{dso_lflags} = $target{shared_ldflag} unless defined $target{dso_lflags};
+{
+ my $shared_info_pl =
+ catfile(dirname($0), "Configurations", "shared-info.pl");
+ my %shared_info = read_eval_file($shared_info_pl);
+ push @{$target{_conf_fname_int}}, $shared_info_pl;
+ my $si = $target{shared_target};
+ while (ref $si ne "HASH") {
+ last if ! defined $si;
+ if (ref $si eq "CODE") {
+ $si = $si->();
+ } else {
+ $si = $shared_info{$si};
+ }
+ }
+
+ # Some of the 'shared_target' values don't have any entried in
+ # %shared_info. That's perfectly fine, AS LONG AS the build file
+ # template knows how to handle this. That is currently the case for
+ # Windows and VMS.
+ if (defined $si) {
+ # Just as above, copy certain shared_* attributes to the corresponding
+ # dso_ attribute unless the latter is already defined
+ $si->{dso_cflags} = $si->{shared_cflag} unless defined $si->{dso_cflags};
+ $si->{dso_cxxflags} = $si->{shared_cxxflag} unless defined $si->{dso_cxxflags};
+ $si->{dso_lflags} = $si->{shared_ldflag} unless defined $si->{dso_lflags};
+ foreach (sort keys %$si) {
+ $target{$_} = defined $target{$_}
+ ? add($si->{$_})->($target{$_})
+ : $si->{$_};
+ }
+ }
+}
+
my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}});
$config{conf_files} = [ sort keys %conf_files ];
-%target = ( %{$table{DEFAULTS}}, %target );
foreach my $feature (@{$target{disable}}) {
if (exists $deprecated_disablables{$feature}) {
@@ -1163,8 +1202,11 @@ unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
# This saves the build files from having to check
if ($disabled{pic})
{
- $target{shared_cflag} = $target{shared_ldflag} =
- $target{shared_rcflag} = "";
+ foreach (qw(shared_cflag shared_cxxflag shared_ldflag
+ dso_cflags dso_cxxflags dso_lflags))
+ {
+ $target{$_} = "";
+ }
}
else
{