Refactor config - @MK1MF_Builds out, general build scheme in

Time to get rid of @MK1MF_Builds and introduce a more flexible
'build_scheme' configuration key.  Its value may be a string or an
array of strings, meaning we need to teach resolve_config how to
handle ARRAY referenses.

The build scheme is a word that selects a function to create the
appropriate result files for a certain configuration.  Currently valid
build schemes aer "mk1mf" and "unixmake", the plan is however to add
at least one other for a more universal build scheme.

Incidently, this also adds the functions 'add' and 'add_before', which
can be used in a configuration, so instead of having to repeatedly
write a sub like this:

	key1 => sub { join(" ", @_, "myvalues"); },
	key2 => sub { join(" ", "myvalues", @_); },

one could write this:

	key1 => add(" ", "myvalues"),
	key2 => add_before(" ", "myvalues"),

The good point with 'add' and 'add_before' is that they handle
inheritances where the values are a misture of scalars and ARRAYs.  If
there are any ARRAY to be found, the resulting value will be an ARRAY,
otherwise it will be a scalar with all the incoming valued joined
together with the separator given as first argument to add/add_before.

Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
Richard Levitte 2015-05-18 14:31:49 +02:00
parent 9e0724a180
commit 88087414de
4 changed files with 108 additions and 56 deletions

View File

@ -20,6 +20,7 @@
poly1305_obj => "", poly1305_obj => "",
unistd => "<unistd.h>", unistd => "<unistd.h>",
build_scheme => "unixmake",
}, },
x86_asm => { x86_asm => {

View File

@ -125,13 +125,13 @@
}, },
"solaris-sparcv8-gcc" => { "solaris-sparcv8-gcc" => {
inherit_from => [ "solaris-sparcv7-gcc", asm("sparcv8_asm") ], inherit_from => [ "solaris-sparcv7-gcc", asm("sparcv8_asm") ],
cflags => sub { join(" ","-mcpu=v8",@_); }, cflags => add_before(" ", "-mcpu=v8"),
}, },
"solaris-sparcv9-gcc" => { "solaris-sparcv9-gcc" => {
# -m32 should be safe to add as long as driver recognizes # -m32 should be safe to add as long as driver recognizes
# -mcpu=ultrasparc # -mcpu=ultrasparc
inherit_from => [ "solaris-sparcv7-gcc", asm("sparcv9_asm") ], inherit_from => [ "solaris-sparcv7-gcc", asm("sparcv9_asm") ],
cflags => sub { join(" ","-m32 -mcpu=ultrasparc",@_); }, cflags => add_before(" ", "-m32 -mcpu=ultrasparc"),
debug_cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -O -g -pedantic -ansi -Wshadow -Wno-long-long -D__EXTENSIONS__", debug_cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -O -g -pedantic -ansi -Wshadow -Wno-long-long -D__EXTENSIONS__",
}, },
"solaris64-sparcv9-gcc" => { "solaris64-sparcv9-gcc" => {
@ -161,15 +161,15 @@
#### ####
"solaris-sparcv8-cc" => { "solaris-sparcv8-cc" => {
inherit_from => [ "solaris-sparcv7-cc", asm("sparcv8_asm") ], inherit_from => [ "solaris-sparcv7-cc", asm("sparcv8_asm") ],
cflags => sub { join(" ","-xarch=v8",@_); }, cflags => add_before(" ", "-xarch=v8"),
}, },
"solaris-sparcv9-cc" => { "solaris-sparcv9-cc" => {
inherit_from => [ "solaris-sparcv7-cc", asm("sparcv9_asm") ], inherit_from => [ "solaris-sparcv7-cc", asm("sparcv9_asm") ],
cflags => sub { join(" ","-xarch=v8plus -xtarget=ultra",@_); }, cflags => add_before(" ", "-xarch=v8plus -xtarget=ultra"),
}, },
"solaris64-sparcv9-cc" => { "solaris64-sparcv9-cc" => {
inherit_from => [ "solaris-sparcv7-cc", asm("sparcv9_asm") ], inherit_from => [ "solaris-sparcv7-cc", asm("sparcv9_asm") ],
cflags => sub { join(" ","-xarch=v9 -xtarget=ultra",@_); }, cflags => add_before(" ", "-xarch=v9 -xtarget=ultra"),
bn_ops => "BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR", bn_ops => "BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR",
shared_ldflag => "-xarch=v9 -G -dy -z text", shared_ldflag => "-xarch=v9 -G -dy -z text",
multilib => "/64", multilib => "/64",
@ -353,7 +353,7 @@
}, },
"hpux-parisc1_1-cc" => { "hpux-parisc1_1-cc" => {
inherit_from => [ "hpux-parisc-cc", asm("parisc11_asm") ], inherit_from => [ "hpux-parisc-cc", asm("parisc11_asm") ],
cflags => sub { join(" ","+DA1.1",@_); }, cflags => add_before(" ", "+DA1.1"),
multilib => "/pa1.1", multilib => "/pa1.1",
}, },
"hpux64-parisc2-cc" => { "hpux64-parisc2-cc" => {
@ -799,7 +799,7 @@
}, },
"android-armv7" => { "android-armv7" => {
inherit_from => [ "android-armeabi" ], inherit_from => [ "android-armeabi" ],
cflags => sub { join (" ","-march=armv7-a",@_); }, cflags => add_before(" ", "-march=armv7-a"),
}, },
"android-mips" => { "android-mips" => {
inherit_from => [ "android", asm("mips32_asm") ], inherit_from => [ "android", asm("mips32_asm") ],
@ -1119,23 +1119,26 @@
cc => "cl", cc => "cl",
cflags => "-W3 -wd4090 -Gs0 -GF -Gy -nologo -DOPENSSL_SYS_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE", cflags => "-W3 -wd4090 -Gs0 -GF -Gy -nologo -DOPENSSL_SYS_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE",
dso_scheme => "win32", dso_scheme => "win32",
build_scheme => "mk1mf",
}, },
"VC-WIN64I" => { "VC-WIN64I" => {
inherit_from => [ "VC-common", asm("ia64_asm") ], inherit_from => [ "VC-common", asm("ia64_asm") ],
cflags => sub { join(" ",@_,"-DUNICODE -D_UNICODE"); }, cflags => add(" ", "-DUNICODE -D_UNICODE"),
sys_id => "WIN64I", sys_id => "WIN64I",
bn_ops => "SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN", bn_ops => "SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN",
bn_obj => sub { my $r=join(" ",@_); $r=~s/bn\-//; $r; }, bn_obj => sub { my $r=join(" ",@_); $r=~s/bn\-//; $r; },
rc4_obj => "", rc4_obj => "",
perlasm_scheme => "ias", perlasm_scheme => "ias",
build_scheme => [ "mk1mf", "VC-W64" ],
}, },
"VC-WIN64A" => { "VC-WIN64A" => {
inherit_from => [ "VC-common", asm("x86_64_asm") ], inherit_from => [ "VC-common", asm("x86_64_asm") ],
cflags => sub { join(" ",@_,"-DUNICODE -D_UNICODE"); }, cflags => add(" ", "-DUNICODE -D_UNICODE"),
sys_id => "WIN64A", sys_id => "WIN64A",
bn_ops => "SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN", bn_ops => "SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN",
bn_obj => sub { my $r=join(" ",@_); $r=~s/x86_64\-gcc/bn_asm/; $r; }, bn_obj => sub { my $r=join(" ",@_); $r=~s/x86_64\-gcc/bn_asm/; $r; },
perlasm_scheme => "auto", perlasm_scheme => "auto",
build_scheme => [ "mk1mf", "VC-W64" ],
}, },
"VC-WIN32" => { "VC-WIN32" => {
# x86 Win32 target defaults to ANSI API, if you want UNICODE, # x86 Win32 target defaults to ANSI API, if you want UNICODE,
@ -1144,12 +1147,14 @@
sys_id => "WIN32", sys_id => "WIN32",
bn_ops => "BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}", bn_ops => "BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}",
perlasm_scheme => "win32n", perlasm_scheme => "win32n",
build_scheme => [ "mk1mf", "VC-W32" ],
}, },
"VC-CE" => { "VC-CE" => {
cc => "cl", cc => "cl",
sys_id => "WINCE", sys_id => "WINCE",
bn_ops => "BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}", bn_ops => "BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}",
dso_scheme => "win32", dso_scheme => "win32",
build_scheme => [ "mk1mf", "VC-WCE" ],
}, },
#### Borland C++ 4.5 #### Borland C++ 4.5
@ -1158,6 +1163,7 @@
sys_id => "WIN32", sys_id => "WIN32",
bn_ops => "BN_LLONG DES_PTR RC4_INDEX EXPORT_VAR_AS_FN", bn_ops => "BN_LLONG DES_PTR RC4_INDEX EXPORT_VAR_AS_FN",
dso_scheme => "win32", dso_scheme => "win32",
build_scheme => [ "mk1mf", "BC" ],
}, },
#### MinGW #### MinGW
@ -1277,10 +1283,12 @@
"netware-clib" => { "netware-clib" => {
cc => "mwccnlm", cc => "mwccnlm",
bn_ops => "${x86_gcc_opts}", bn_ops => "${x86_gcc_opts}",
build_scheme => [ "mk1mf", "netware" ],
}, },
"netware-clib-bsdsock" => { "netware-clib-bsdsock" => {
cc => "mwccnlm", cc => "mwccnlm",
bn_ops => "${x86_gcc_opts}", bn_ops => "${x86_gcc_opts}",
build_scheme => [ "mk1mf", "netware" ],
}, },
"netware-clib-gcc" => { "netware-clib-gcc" => {
cc => "i586-netware-gcc", cc => "i586-netware-gcc",
@ -1296,10 +1304,12 @@
"netware-libc" => { "netware-libc" => {
cc => "mwccnlm", cc => "mwccnlm",
bn_ops => "BN_LLONG ${x86_gcc_opts}", bn_ops => "BN_LLONG ${x86_gcc_opts}",
build_scheme => [ "mk1mf", "netware" ],
}, },
"netware-libc-bsdsock" => { "netware-libc-bsdsock" => {
cc => "mwccnlm", cc => "mwccnlm",
bn_ops => "BN_LLONG ${x86_gcc_opts}", bn_ops => "BN_LLONG ${x86_gcc_opts}",
build_scheme => [ "mk1mf", "netware" ],
}, },
"netware-libc-gcc" => { "netware-libc-gcc" => {
cc => "i586-netware-gcc", cc => "i586-netware-gcc",

View File

@ -97,8 +97,16 @@ In each table entry, the following keys are significant:
shared_target => The shared library building method used. shared_target => The shared library building method used.
This is a target found in Makefile.shared. This is a target found in Makefile.shared.
build_scheme => The scheme used to build up a Makefile. build_scheme => The scheme used to build up a Makefile.
(NOTE: this is here for future use, it's In its simplest form, the value is a string
not implemented yet) with the name of the build scheme.
The value may also take the form of a list
of strings, if the build_scheme is to have
some options. In this case, the first
string in the list is the name of the build
scheme.
Currently recognised build schemes are
"mk1mf" and "unixmake". Others may appear
in the future.
multilib => On systems that support having multiple multilib => On systems that support having multiple
implementations of a library (typically a implementations of a library (typically a

123
Configure
View File

@ -172,13 +172,6 @@ foreach (sort glob($pattern) ) {
&read_config($_); &read_config($_);
} }
my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
debug-VC-WIN64I debug-VC-WIN64A
VC-NT VC-CE VC-WIN32 debug-VC-WIN32
BC-32
netware-clib netware-clib-bsdsock
netware-libc netware-libc-bsdsock);
my $prefix=""; my $prefix="";
my $libdir=""; my $libdir="";
my $openssldir=""; my $openssldir="";
@ -763,8 +756,6 @@ my %target = ( %{$table{$base_target}}, resolve_config($target) );
&usage if (!%target || $target{template}); &usage if (!%target || $target{template});
my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/); $exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
$exe_ext=".nlm" if ($target =~ /netware/); $exe_ext=".nlm" if ($target =~ /netware/);
$exe_ext=".pm" if ($target =~ /vos/); $exe_ext=".pm" if ($target =~ /vos/);
@ -782,8 +773,6 @@ $openssldir = catdir($prefix, $openssldir)
unless file_name_is_absolute($openssldir); unless file_name_is_absolute($openssldir);
print "IsMK1MF=$IsMK1MF\n";
# Allow environment CC to override compiler... # Allow environment CC to override compiler...
my $cc = $ENV{CC} || $target{cc}; my $cc = $ENV{CC} || $target{cc};
@ -828,6 +817,9 @@ my $ranlib = $ENV{'RANLIB'} || $target{ranlib};
my $ar = $ENV{'AR'} || "ar"; my $ar = $ENV{'AR'} || "ar";
my $arflags = $target{arflags}; my $arflags = $target{arflags};
my $multilib = $target{multilib}; my $multilib = $target{multilib};
my @build_scheme =
ref($target{build_scheme}) eq "ARRAY"
? @{$target{build_scheme}} : ( $target{build_scheme} );
# if $prefix/lib$multilib is not an existing directory, then # if $prefix/lib$multilib is not an existing directory, then
# assume that it's not searched by linker automatically, in # assume that it's not searched by linker automatically, in
@ -976,7 +968,7 @@ if (!$no_shared)
} }
} }
if (!$IsMK1MF) if ($build_scheme[0] ne "mk1mf")
{ {
# add {no-}static-engine to options to allow mkdef.pl to work without extra arguments # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
if ($no_shared) if ($no_shared)
@ -1301,6 +1293,7 @@ close(OUT);
rename($Makefile,"$Makefile.orig") || die "unable to rename $Makefile\n" if -e $Makefile; rename($Makefile,"$Makefile.orig") || die "unable to rename $Makefile\n" if -e $Makefile;
rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n"; rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
print "IsMK1MF =", ($build_scheme[0] eq "mk1mf" ? "yes" : "no"), "\n";
print "CC =$cc\n"; print "CC =$cc\n";
print "CFLAG =$cflags\n"; print "CFLAG =$cflags\n";
print "EX_LIBS =$lflags\n"; print "EX_LIBS =$lflags\n";
@ -1546,17 +1539,25 @@ find(sub {
$File::Find::dir; $File::Find::dir;
}, "."); }, ".");
{ my %builders = (
my $perlguess = $perl =~ m@^/@ ? $perl : '/usr/local/bin/perl'; unixmake => sub {
my $perlguess = $perl =~ m@^/@ ? $perl : '/usr/local/bin/perl';
&dofile("tools/c_rehash",$perlguess, my $make_command = "$make PERL=\'$perlguess\'";
'^#!/' => '#!%s', my $make_targets = "";
'^my \$dir;$' => 'my $dir = "' . $openssldir . '";', $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
'^my \$prefix;$' => 'my $prefix = "' . $prefix . '";'); (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
&dofile("apps/CA.pl",$perl, if $make_targets ne "";
'^#!/' => '#!%s'); &dofile("tools/c_rehash",$perlguess,
} '^#!/' => '#!%s',
if($IsMK1MF) { '^my \$dir;$' => 'my $dir = "' . $openssldir . '";',
'^my \$prefix;$' => 'my $prefix = "' . $prefix . '";');
&dofile("apps/CA.pl",$perlguess,
'^#!/' => '#!%s');
if ($depflags ne $default_depflags && !$make_depend) {
$warn_make_depend++;
}
},
mk1mf => sub {
open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h"; open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
printf OUT <<"EOF"; printf OUT <<"EOF";
#ifndef MK1MF_BUILD #ifndef MK1MF_BUILD
@ -1568,28 +1569,18 @@ if($IsMK1MF) {
#endif #endif
EOF EOF
close(OUT); close(OUT);
} else {
my $make_command = "$make PERL=\'$perl\'";
my $make_targets = "";
$make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
(system $make_command.$make_targets) == 0 or die "make $make_targets failed"
if $make_targets ne "";
if ($depflags ne $default_depflags && !$make_depend) {
$warn_make_depend++;
}
}
# create the ms/version32.rc file if needed # create the ms/version32.rc file if needed
if ($IsMK1MF && ($target !~ /^netware/)) { if (! grep /^netware/, @build_scheme) {
my ($v1, $v2, $v3, $v4); my ($v1, $v2, $v3, $v4);
if ($version_num =~ /^0x([0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{1})L$/i) { if ($version_num =~ /^0x([0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{1})L$/i) {
$v1=hex $1; $v1=hex $1;
$v2=hex $2; $v2=hex $2;
$v3=hex $3; $v3=hex $3;
$v4=hex $4; $v4=hex $4;
} }
open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc"; open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
print OUT <<"EOF"; print OUT <<"EOF";
#include <winver.h> #include <winver.h>
LANGUAGE 0x09,0x01 LANGUAGE 0x09,0x01
@ -1638,8 +1629,13 @@ BEGIN
END END
END END
EOF EOF
close(OUT); close(OUT);
} }
},
);
my ($builder, @builder_opts) = @build_scheme;
$builders{$builder}->(@builder_opts);
print <<"EOF"; print <<"EOF";
@ -1690,6 +1686,43 @@ sub asm {
} }
} }
# Helper function to implement adding values to already existing configuration
# values. It handles elements that are ARRAYs, CODEs and scalars
sub _add {
my $separator = shift;
# If there's any ARRAY in the collection of values, we will return
# an ARRAY of combined values, otherwise a string of joined values
# with $separator as the separator.
my $found_array = 0;
my @values =
map {
if (ref($_) eq "ARRAY") {
$found_array = 1;
@$_;
} else {
$_;
}
} (@_);
if ($found_array) {
[ @values ];
} else {
join($separator, @values);
}
}
sub add_before {
my $separator = shift;
my @x = @_;
sub { _add($separator, @x, @_) };
}
sub add {
my $separator = shift;
my @x = @_;
sub { _add($separator, @_, @x) };
}
# configuration reader, evaluates the input file as a perl script and expects # configuration reader, evaluates the input file as a perl script and expects
# it to fill %targets with target configurations. Those are then added to # it to fill %targets with target configurations. Those are then added to
# %table. # %table.
@ -1783,7 +1816,7 @@ sub resolve_config {
# value. # value.
# - Otherwise, this target's value is assumed to be a string that # - Otherwise, this target's value is assumed to be a string that
# will simply override the inherited list of values. # will simply override the inherited list of values.
my $default_combiner = sub { join(' ',@_) }; my $default_combiner = add(" ");
my %all_keys = my %all_keys =
map { $_ => 1 } (keys %combined_inheritance, map { $_ => 1 } (keys %combined_inheritance,
@ -1803,8 +1836,8 @@ sub resolve_config {
# arguments. # arguments.
$table{$target}->{$_} = $table{$target}->{$_} =
$table{$target}->{$_}->(@{$combined_inheritance{$_}}); $table{$target}->{$_}->(@{$combined_inheritance{$_}});
} elsif ($valuetype eq "") { } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
# Scalar, just leave it as is. # ARRAY or Scalar, just leave it as is.
} else { } else {
# Some other type of reference that we don't handle. # Some other type of reference that we don't handle.
# Better to abort at this point. # Better to abort at this point.