use File::Basename;
use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
use File::Path qw/mkpath/;
-use IPC::Cmd qw/can_run/;
+use if $^O ne "VMS", 'File::Glob' => qw/glob/;
# see INSTALL for instructions.
# RMD160_ASM use some extra ripemd160 assembler,
# SHA256_ASM sha256_block is implemented in assembler
# SHA512_ASM sha512_block is implemented in assembler
-# AES_ASM ASE_[en|de]crypt is implemented in assembler
+# AES_ASM AES_[en|de]crypt is implemented in assembler
# Minimum warning options... any contributions to OpenSSL should at least get
# past these.
# DEBUG_UNUSED enables __owur (warn unused result) checks.
my $gcc_devteam_warn = "-DDEBUG_UNUSED"
# -DPEDANTIC complements -pedantic and is meant to mask code that
- # is not strictly standard-compliant and/or implementation-specifc,
+ # is not strictly standard-compliant and/or implementation-specific,
# e.g. inline assembly, disregards to alignment requirements, such
# that -pedantic would complain about. Incidentally -DPEDANTIC has
# to be used even in sanitized builds, because sanitizer too is
our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
#
-# API compability name to version number mapping.
+# API compatibility name to version number mapping.
#
my $maxapi = "1.1.0"; # API for "no-deprecated" builds
my $apitable = {
# Collect target configurations
my $pattern = catfile(dirname($0), "Configurations", "*.conf");
-foreach (sort glob($pattern) ) {
+foreach (sort glob($pattern)) {
&read_config($_);
}
$pattern = catfile($ENV{$local_config_envname}, '*.conf');
}
- foreach (sort glob($pattern) ) {
+ foreach (sort glob($pattern)) {
&read_config($_);
}
}
"engine",
"err",
"filenames",
- "fuzz",
+ "fuzz-libfuzzer",
+ "fuzz-afl",
"gost",
"heartbeats",
"hw(-.+)?",
"rc5",
"rdrand",
"rfc3779",
- "ripemd",
"rmd160",
"scrypt",
"sctp",
push(@disablables, "$proto-method");
}
-my @deprecated_disablables = (
- "ssl2",
- "buf-freelists",
+my %deprecated_disablables = (
+ "ssl2" => undef,
+ "buf-freelists" => undef,
+ "ripemd" => "rmd160"
);
# All of the following is disabled by default (RC5 was enabled before 0.9.8):
"asan" => "default",
"ec_nistp_64_gcc_128" => "default",
"egd" => "default",
- "fuzz" => "default",
+ "fuzz-libfuzzer" => "default",
+ "fuzz-afl" => "default",
"md2" => "default",
"rc5" => "default",
"sctp" => "default",
# To remove something from %disabled, use "enable-foo".
# For symmetry, "disable-foo" is a synonym for "no-foo".
-my @generated_headers = (
- "include/openssl/opensslconf.h",
- "crypto/include/internal/bn_conf.h",
- "crypto/include/internal/dso_conf.h"
- );
-
-my @generated_by_make_headers = (
- "crypto/buildinf.h"
- );
-
-
my $no_sse2=0;
&usage if ($#ARGV < 0);
s /^zlib-dynamic$/enable-zlib-dynamic/;
if (/^(no|disable|enable)-(.+)$/)
- {
- my $word = $2;
- if (grep { $word =~ /^${_}$/ } @deprecated_disablables)
- {
- $deprecated_options{$_} = 1;
- next;
- }
- elsif (!grep { $word =~ /^${_}$/ } @disablables)
- {
- $unsupported_options{$_} = 1;
- next;
- }
- }
- if (/^no-(.+)$/ || /^disable-(.+)$/)
- {
+ {
+ my $word = $2;
+ if (!exists $deprecated_disablables{$word}
+ && !grep { $word =~ /^${_}$/ } @disablables)
+ {
+ $unsupported_options{$_} = 1;
+ next;
+ }
+ }
+ if (/^no-(.+)$/ || /^disable-(.+)$/)
+ {
foreach my $proto ((@tls, @dtls))
{
if ($1 eq "$proto-method")
{
$disabled{"dynamic-engine"} = "option";
}
+ elsif (exists $deprecated_disablables{$1})
+ {
+ $deprecated_options{$_} = 1;
+ if (defined $deprecated_disablables{$1})
+ {
+ $disabled{$deprecated_disablables{$1}} = "option";
+ }
+ }
else
{
$disabled{$1} = "option";
{
$withargs{zlib_include}=$1;
}
+ elsif (/^--with-fuzzer-lib=(.*)$/)
+ {
+ $withargs{fuzzer_lib}=$1;
+ }
+ elsif (/^--with-fuzzer-include=(.*)$/)
+ {
+ $withargs{fuzzer_include}=$1;
+ }
elsif (/^--with-fipslibdir=(.*)$/)
{
$config{fipslibdir}="$1/";
$config{perl} = $ENV{'PERL'} || ($^O ne "VMS" ? $^X : "perl");
$target{cc} = $ENV{'CC'} || $target{cc} || "cc";
$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} ||
- (scalar can_run("$config{cross_compile_prefix}ranlib") ?
+ (which("$config{cross_compile_prefix}ranlib") ?
"\$(CROSS_COMPILE)ranlib" : "true");
$target{ar} = $ENV{'AR'} || $target{ar} || "ar";
$target{nm} = $ENV{'NM'} || $target{nm} || "nm";
$config{dynamic_engines} = 1;
}
-unless ($disabled{fuzz}) {
+unless ($disabled{"fuzz-libfuzzer"}) {
push @{$config{dirs}}, "fuzz";
$config{cflags} .= "-fsanitize-coverage=edge,indirect-calls ";
}
+unless ($disabled{"fuzz-afl"}) {
+ push @{$config{dirs}}, "fuzz";
+}
+
unless ($disabled{asan}) {
$config{cflags} .= "-fsanitize=address ";
}
unless ($disabled{ubsan}) {
- # -DPEDANTIC or -fnosanitize=aligmnent may also be required on some
+ # -DPEDANTIC or -fnosanitize=alignment may also be required on some
# platforms.
$config{cflags} .= "-fsanitize=undefined -fno-sanitize-recover=all ";
}
-unless ($disabled{fuzz} && $disabled{asan} && $disabled{ubsan}) {
+unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
+ && $disabled{asan} && $disabled{ubsan}) {
$config{cflags} .= "-fno-omit-frame-pointer -g ";
}
#
}
close(PIPE);
- $config{makedepprog} = scalar can_run('makedepend') unless $config{makedepprog};
+ $config{makedepprog} = which('makedepend') unless $config{makedepprog};
$disabled{makedepend} = "unavailable" unless $config{makedepprog};
}
$template->fill_in(HASH => { config => \%config,
target => \%target,
disabled => \%disabled,
+ withargs => \%withargs,
builddir => abs2rel($buildd, $blddir),
sourcedir => abs2rel($sourced, $blddir),
buildtop => abs2rel($blddir, $blddir),
qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
=> sub { push @{$includes{$1}}, tokenize($2)
if !@skip || $skip[$#skip] > 0 },
- qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
+ qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/
=> sub { push @{$depends{$1}}, tokenize($2)
if !@skip || $skip[$#skip] > 0 },
qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
foreach (keys %depends) {
my $dest = $_;
- my $ddest = cleanfile($sourced, $_, $blddir);
+ my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir);
# If the destination doesn't exist in source, it can only be
# a generated file in the build tree.
- if (! -f $ddest) {
+ if ($ddest ne "" && ! -f $ddest) {
$ddest = cleanfile($buildd, $_, $blddir);
if ($unified_info{rename}->{$ddest}) {
$ddest = $unified_info{rename}->{$ddest};
if (! -f $d
|| (grep { $d eq $_ }
map { cleanfile($srcdir, $_, $blddir) }
- (@generated_headers, @generated_by_make_headers))) {
+ grep { /\.h$/ } keys %{$unified_info{generate}})) {
$d = cleanfile($buildd, $_, $blddir);
}
# Take note if the file to depend on is being renamed
$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 ($d =~ /\.(h|pm)$/) {
+ if ($dest ne "" && $d =~ /\.(h|pm)$/) {
my $i = dirname($d);
push @{$unified_info{includes}->{$ddest}}, $i
unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
}
}
- ### Add information about files generated by Configure
- foreach (map { abs2rel($_) } @generated_headers) {
- die "Configure gerenerated header file $_ has a GENERATE in a build.info\n"
- if $unified_info{generate}->{$_};
- $unified_info{generate}->{$_} = "Generated by Configure";
- }
-
### Make unified_info a bit more efficient
# One level structures
foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
print "BN_LLONG mode\n" if $config{bn_ll};
print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} ne $def_int;
-for (@generated_headers) {
- mkpath(catdir($blddir, dirname($_)));
- run_dofile(catfile($blddir, $_),
- catfile($srcdir, $_.".in"));
-}
-
-###
-### When the old "unixmake" scheme goes away, so does this function
-###
-sub build_Makefile {
- run_dofile("Makefile","Makefile.in");
-
- # Copy all Makefile.in to Makefile (except top-level)
- use File::Find;
- use IO::File;
- find(
- {
- preprocess => sub {
- grep(!/^\./, @_);
- },
- wanted => sub {
- return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
- my $in = IO::File->new($_, "r") or
- die sprintf "Error reading Makefile.in in %s: !$\n",
- $File::Find::dir;
- my $out = IO::File->new("Makefile", "w") or
- die sprintf "Error writing Makefile in %s: !$\n",
- $File::Find::dir;
- print $out "# Generated from $_, do not edit\n";
- while (my $line = <$in>) { print $out $line }
- $in->close() or
- die sprintf "Error reading Makefile.in in %s: !$\n",
- $File::Find::dir;
- $out->close() or
- die sprintf "Error writing Makefile in %s: !$\n",
- $File::Find::dir;
- },
- },
- ".");
-}
-
my %builders = (
unified => sub {
run_dofile(catfile($blddir, $target{build_file}),
$config{build_file_template},
catfile($srcdir, "Configurations", "common.tmpl"));
},
- unixmake => sub {
- build_Makefile();
-
- run_dofile("util/domd", "util/domd.in");
- chmod 0755, "util/domd";
- },
);
$builders{$builder}->($builder_platform, @builder_opts);
foreach (@templates) {
die "Can't open $_, $!" unless -f $_;
}
- my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" $dofile -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
+ my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
#print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
system($cmd);
exit 1 if $? != 0;
rename("$out.new", $out) || die "Can't rename $out.new, $!";
}
+sub which
+{
+ my ($name)=@_;
+
+ if (eval { require IPC::Cmd; 1; }) {
+ IPC::Cmd->import();
+ return scalar IPC::Cmd::can_run($name);
+ } else {
+ # if there is $directories component in splitpath,
+ # then it's not something to test with $PATH...
+ return $name if (File::Spec->splitpath($name))[1];
+
+ foreach (File::Spec->path()) {
+ my $fullpath = catfile($_, "$name$target{exe_extension}");
+ if (-f $fullpath and -x $fullpath) {
+ return $fullpath;
+ }
+ }
+ }
+}
+
# Configuration printer ##############################################
sub print_table_entry