diff --git a/Configurations/00-base-templates.conf b/Configurations/00-base-templates.conf index 3cc078f8e6..713e374f72 100644 --- a/Configurations/00-base-templates.conf +++ b/Configurations/00-base-templates.conf @@ -1,6 +1,17 @@ +# -*- Mode: perl -*- %targets=( BASE => { template => 1, + + cflags => "", + defines => [], + debug_cflags => "", + debug_defines => [], + release_cflags => "", + release_defines => [], + thread_cflags => "", + thread_defines => [], + cpuid_asm_src => "mem_clr.c", bn_asm_src => "bn_asm.c", ec_asm_src => "", diff --git a/Configurations/99-personal-levitte.conf b/Configurations/99-personal-levitte.conf index d28cc6e934..fbfd3da37e 100644 --- a/Configurations/99-personal-levitte.conf +++ b/Configurations/99-personal-levitte.conf @@ -8,13 +8,15 @@ %targets = ( "levitte-linux-elf" => { inherit_from => [ "linux-elf" ], - debug_cflags => add("-DLEVITTE_DEBUG -ggdb -g3"), + debug_cflags => add("-ggdb -g3"), + debug_defines => add(undef, "LEVITTE_DEBUG"), build_scheme => [ "unified", "unix" ], build_file => "Makefile", }, "levitte-linux-x86_64" => { inherit_from => [ "linux-x86_64" ], - debug_cflags => add("-DLEVITTE_DEBUG -ggdb -g3"), + debug_cflags => add("-ggdb -g3"), + debug_defines => add(undef, "LEVITTE_DEBUG"), build_scheme => [ "unified", "unix" ], build_file => "Makefile", }, diff --git a/Configurations/README b/Configurations/README index 75907a6d5c..9f6071e8b9 100644 --- a/Configurations/README +++ b/Configurations/README @@ -23,18 +23,35 @@ In each table entry, the following keys are significant: libraries into the final program. cflags => Flags that are used at all times when compiling. + defines => As an alternative, macro definitions may be + present here instead of in `cflags'. If + given here, they MUST be as an array of the + string such as "MACRO=value", or just + "MACRO" for definitions without value. debug_cflags => Extra compilation flags used when making a debug build (when Configure receives the --debug option). Typically something like "-g -O0". + debug_defines => Similarly to `debug_cflags', this gets + combined with `defines' during a debug + build. The value here MUST also be an + array of the same form as for `defines'. release_cflags => Extra compilation flags used when making a release build (when Configure receives the --release option, or doesn't receive the --debug option). Typically something like "-O" or "-O3". + release_defines => Similarly to `release_cflags', this gets + combined with `defines' during a release + build. The value here MUST also be an + array of the same form as for `defines'. thread_cflags => Extra compilation flags used when compiling with threading enabled. Explained further below. [2] + thread_defines => Similarly to `thread_cflags', this gets + combined with `defines' when threading is + enabled. The value here MUST also be an + array of the same form as for `defines'. shared_cflag => Extra compilation flags used when compiling for shared libraries, typically something like "-fPIC". diff --git a/Configure b/Configure index 560497ff08..a6310366ce 100755 --- a/Configure +++ b/Configure @@ -320,7 +320,6 @@ my %disabled = ( # "what" => "comment" [or special keyword "experimental "ssl-trace" => "default", "unit-test" => "default", "zlib" => "default", - "zlib-dynamic" => "default", "crypto-mdebug" => "default", ); my @experimental = (); @@ -383,13 +382,13 @@ while ((my $first, my $second) = (shift @list, shift @list)) { unshift @list, $second; } -# Construct the string of what $config{depflags} should look like with the defaults -# from %disabled above. (we need this to see if we should advise the user -# to run "make depend"): -my $default_depflags = join(" ", - map { my $x = $_; $x =~ tr{[a-z]-}{[A-Z]_}; "-DOPENSSL_NO_$x"; } - grep { $disabled{$_} !~ /\(no-depflags\)$/ } - sort keys %disabled); +# Construct the string of what $config{depdefines} should look like with +# the defaults from %disabled above. (we need this to see if we should +# advise the user to run "make depend"): +my @default_depdefines = + map { my $x = $_; $x =~ tr{[a-z]-}{[A-Z]_}; "OPENSSL_NO_$x"; } + grep { $disabled{$_} !~ /\(no-depdefines\)$/ } + sort keys %disabled; # Explicit "no-..." options will be collected in %disabled along with the defaults. # To remove something from %disabled, use "enable-foo" (unless it's experimental). @@ -404,8 +403,9 @@ my $no_sse2=0; &usage if ($#ARGV < 0); -my $flags=""; -$config{depflags}=""; +my $user_cflags=""; +my @user_defines=(); +$config{depdefines}=[]; $config{openssl_experimental_defines}=[]; $config{openssl_api_defines}=[]; $config{openssl_algorithm_defines}=[]; @@ -623,10 +623,14 @@ foreach (@argvcopy) { $libs.=$_." "; } + elsif (/^-D(.*)$/) + { + push @user_defines, $1; + } else # common if (/^[-+]/), just pass down... { $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei; - $flags.=$_." "; + $user_cflags.=$_." "; } } elsif ($_ =~ /^([^:]+):(.+)$/) @@ -747,7 +751,7 @@ foreach (sort (keys %disabled)) push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO"; print " OPENSSL_NO_$ALGO"; - if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; } + if (/^err$/) { push @user_defines, "OPENSSL_NO_ERR"; } elsif (/^asm$/) { $no_asm = 1; } } else @@ -755,7 +759,7 @@ foreach (sort (keys %disabled)) ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd"); push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$ALGO"; - $config{depflags} .= " -DOPENSSL_NO_$ALGO"; + push @{$config{depdefines}}, "OPENSSL_NO_$ALGO"; print " OPENSSL_NO_$ALGO"; # fix-up crypto/directory name(s) @@ -770,8 +774,6 @@ foreach (sort (keys %disabled)) print "\n"; } -my $exp_cflags = ""; - foreach (sort @experimental) { my $ALGO; @@ -779,7 +781,6 @@ foreach (sort @experimental) # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined push @{$config{openssl_experimental_defines}}, "OPENSSL_NO_$ALGO"; - $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO"; } print "Configuring for $target\n"; @@ -820,9 +821,11 @@ $config{openssldir} = catdir($config{prefix}, $config{openssldir}) # Allow environment CC to override compiler... $target{cc} = $ENV{CC} || $target{cc}; -# For cflags, lflags, plib_lflags and ex_libs, add the debug_ or release_ -# attributes. +# For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_ +# or release_ attributes. # Do it in such a way that no spurious space is appended (hence the grep). +$config{defines} = [ @{$target{defines}}, + @{$target{$build_prefix."defines"}} ]; $config{cflags} = join(" ", grep { $_ ne "" } ($target{cflags}, $target{$build_prefix."cflags"})); @@ -856,7 +859,9 @@ $target{multilib}="" if !-d "$config{prefix}/lib$target{multilib}"; $config{libdir}="lib$target{multilib}" if $config{libdir} eq ""; $config{enginesdir}=$config{prefix} . "/" . $config{libdir} . "/engines"; -$config{cflags} .= "$exp_cflags"; +push @{$config{defines}}, + map { (my $x = $_) =~ s/^OPENSSL_NO_/OPENSSL_EXPERIMENTAL_/; $x } + @{$config{openssl_experimental_defines}}; if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` !~ m/-mno-cygwin/m) { @@ -864,7 +869,7 @@ if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` !~ m/-mno-cygwin/m) $target{shared_ldflag} =~ s/-mno-cygwin\s*//; } -if ($target =~ /linux.*-mips/ && !$no_asm && $flags !~ /-m(ips|arch=)/) { +if ($target =~ /linux.*-mips/ && !$no_asm && $user_cflags !~ /-m(ips|arch=)/) { # minimally required architecture flags for assembly modules $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/); $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/); @@ -872,9 +877,12 @@ if ($target =~ /linux.*-mips/ && !$no_asm && $flags !~ /-m(ips|arch=)/) { my $no_shared_warn=0; my $no_user_cflags=0; +my $no_user_defines=0; -if ($flags ne "") { $config{cflags}="$flags$config{cflags}"; } +if ($user_cflags ne "") { $config{cflags}="$user_cflags$config{cflags}"; } else { $no_user_cflags=1; } +if (@user_defines) { $config{defines}=[ @user_defines, @{$config{defines}} ]; } +else { $no_user_defines=1; } # The DSO code currently always implements all functions so that no # applications will have to worry about that from a compilation point @@ -882,23 +890,23 @@ else { $no_user_cflags=1; } # has support compiled in for them. Currently each method is enabled # by a define "DSO_" ... we translate the "dso_scheme" config # string entry into using the following logic; -my $dso_cflags; if (!$no_dso && $target{dso_scheme} ne "") { $target{dso_scheme} =~ tr/[a-z]/[A-Z]/; if ($target{dso_scheme} eq "DLFCN") { - $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H"; + $config{defines} = [ "DSO_DLFCN", "HAVE_DLFCN_H", + @{$config{defines}} ] } elsif ($target{dso_scheme} eq "DLFCN_NO_H") { - $dso_cflags = "-DDSO_DLFCN"; + $config{defines} = [ "DSO_DLFCN", @{$config{defines}} ] } else { - $dso_cflags = "-DDSO_$target{dso_scheme}"; + $config{defines} = [ "DSO_$target{dso_scheme}", + @{$config{defines}} ] } - $config{cflags} = "$dso_cflags $config{cflags}"; } my $thread_cflags = ""; @@ -913,37 +921,38 @@ if ($target{thread_cflag} eq "(unknown)" && $threads) # If the user asked for "threads", [s]he is also expected to # provide any system-dependent compiler options that are # necessary. - if ($no_user_cflags) + if ($no_user_cflags && $no_user_defines) { print "You asked for multi-threading support, but didn't\n"; print "provide any system-specific compiler options\n"; exit(1); } - $thread_cflags="-DOPENSSL_THREADS" ; push @thread_defines, "OPENSSL_THREADS"; } else { - $thread_cflags="-DOPENSSL_THREADS $target{thread_cflag}"; - push @thread_defines, "OPENSSL_THREADS"; + $thread_cflags=" $target{thread_cflag}"; + push @thread_defines, @{$target{thread_defines}}, "OPENSSL_THREADS"; } $config{ex_libs}="$libs$config{ex_libs}" if ($libs ne ""); if ($no_asm) { - $config{cflags}=~s/-D[BL]_ENDIAN// if ($config{fips}); + @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}} + if ($config{fips}); } if ($threads) { $config{cflags} = "$thread_cflags $config{cflags}" if $thread_cflags; + push @{$config{defines}}, @thread_defines; push @{$config{openssl_thread_defines}}, @thread_defines; } if ($zlib) { - $config{cflags} = "-DZLIB $config{cflags}"; + push @{$config{defines}}, "ZLIB"; if (defined($disabled{"zlib-dynamic"})) { if (defined($withargs{zlib_lib})) @@ -957,7 +966,7 @@ if ($zlib) } else { - $config{cflags} = "-DZLIB_SHARED $config{cflags}"; + push @{$config{defines}}, "ZLIB_SHARED"; } } @@ -975,7 +984,8 @@ if (!$config{no_shared}) { if ($target{shared_cflag} ne "") { - $config{cflags} = "$target{shared_cflag} -DOPENSSL_PIC $config{cflags}"; + push @{$config{defines}}, "OPENSSL_PIC"; + $config{cflags} = "$target{shared_cflag} $config{cflags}"; } } @@ -1012,7 +1022,6 @@ if ($target =~ /^BSD-/) if ($target{sys_id} ne "") { - #$config{cflags}="-DOPENSSL_SYS_$target{sys_id} $config{cflags}"; push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}"; } @@ -1023,44 +1032,44 @@ if ($target{ranlib} eq "") if (!$no_asm) { $target{cpuid_asm_src}=$table{BASE}->{cpuid_asm_src} if ($config{processor} eq "386"); - $target{cpuid_asm_src}.=" uplink.c uplink-x86.s" if ($config{cflags} =~ /-DOPENSSL_USE_APPLINK/); + $target{cpuid_asm_src}.=" uplink.c uplink-x86.s" if (grep { $_ eq "OPENSSL_USE_APPLINK"} @{$config{defines}}); $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m})); # bn-586 is the only one implementing bn_*_part_words - $config{cflags}.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/); - $config{cflags}.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/); + push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/); + push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/); - $config{cflags}.=" -DOPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/); - $config{cflags}.=" -DOPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/); - $config{cflags}.=" -DOPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/); + push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/); + push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/); + push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/); if ($config{fips}) { push @{$config{openssl_other_defines}}, "OPENSSL_FIPS"; } if ($target{sha1_asm_src}) { - $config{cflags}.=" -DSHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/); - $config{cflags}.=" -DSHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/); - $config{cflags}.=" -DSHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/); + push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/); + push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/); + push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/); } if ($target{md5_asm_src}) { - $config{cflags}.=" -DMD5_ASM"; + push @{$config{defines}}, "MD5_ASM"; } $target{cast_asm_src}=$table{BASE}->{cast_asm_src} if (!$config{no_shared}); # CAST assembler is not PIC if ($target{rmd160_asm_src}) { - $config{cflags}.=" -DRMD160_ASM"; + push @{$config{defines}}, "RMD160_ASM"; } if ($target{aes_asm_src}) { - $config{cflags}.=" -DAES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);; + push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);; # aes-ctr.fake is not a real file, only indication that assembler # module implements AES_ctr32_encrypt... - $config{cflags}.=" -DAES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//); + push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//); # aes-xts.fake indicates presence of AES_xts_[en|de]crypt... - $config{cflags}.=" -DAES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//); + push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//); $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2); - $config{cflags}.=" -DVPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/); - $config{cflags}.=" -DBSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/); + push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/); + push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/); } if ($target{wp_asm_src} =~ /mmx/) { if ($config{processor} eq "386") { @@ -1070,13 +1079,13 @@ if (!$no_asm) { } } if ($target{modes_asm_src} =~ /ghash-/) { - $config{cflags}.=" -DGHASH_ASM"; + push @{$config{defines}}, "GHASH_ASM"; } if ($target{ec_asm_src} =~ /ecp_nistz256/) { - $config{cflags}.=" -DECP_NISTZ256_ASM"; + push @{$config{defines}}, "ECP_NISTZ256_ASM"; } if ($target{poly1305_asm_src} ne "") { - $config{cflags}.=" -DPOLY1305_ASM"; + push @{$config{defines}}, "POLY1305_ASM"; } } @@ -1129,9 +1138,9 @@ $config{cflags} =~ s/([\\\"])/\\\1/g; if (defined($config{api})) { $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ]; - my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$config{api}}); - $default_depflags .= " $apiflag"; - $config{cflags} .= " $apiflag"; + my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}}); + push @default_depdefines, $apiflag; + push @{$config{defines}}, $apiflag; } if ($strict_warnings) @@ -1671,6 +1680,7 @@ EOF print "IsMK1MF =", ($builder eq "mk1mf" ? "yes" : "no"), "\n"; print "CC =$target{cc}\n"; print "CFLAG =$config{cflags}\n"; +print "DEFINES =",join(" ", @{$config{defines}}),"\n"; print "LFLAG =$config{lflags}\n"; print "PLIB_LFLAG =$config{plib_lflags}\n"; print "EX_LIBS =$config{ex_libs}\n"; @@ -1755,12 +1765,16 @@ my %builders = ( my $make_command = "$make PERL=\'$config{perl}\'"; my $make_targets = ""; + my $need_make_depend = + join(" ", @{$config{depdefines}}) ne join(" ", @default_depdefines); $make_targets .= " depend" - if $config{depflags} ne $default_depflags && $make_depend; + if $need_make_depend && $make_depend; + (system $make_command.$make_targets) == 0 or die "make $make_targets failed" if $make_targets ne ""; - if ($config{depflags} ne $default_depflags && !$make_depend) { + + if ($need_make_depend && !$make_depend) { $warn_make_depend++; } }, @@ -1770,15 +1784,18 @@ my %builders = ( run_dofile("util/domd", "util/domd.in"); chmod 0755, "util/domd"; - my $make_command = "$make PERL=\'$config{perl}\'"; - my $make_targets = ""; - $make_targets .= " depend" - if $config{depflags} ne $default_depflags && $make_depend; - (system $make_command.$make_targets) == 0 - or die "make $make_targets failed" - if $make_targets ne ""; + my $make_command = "$make PERL=\'$config{perl}\'"; + my $make_targets = ""; + my $need_make_depend = + join(" ", @{$config{depdefines}}) ne join(" ", @default_depdefines); + $make_targets .= " depend" + if $need_make_depend && $make_depend; - if ($config{depflags} ne $default_depflags && !$make_depend) { + (system $make_command.$make_targets) == 0 + or die "make $make_targets failed" + if $make_targets ne ""; + + if ($need_make_depend && !$make_depend) { $warn_make_depend++; } }, @@ -1919,10 +1936,10 @@ sub asm { 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; + # If there's any ARRAY in the collection of values OR the separator + # is undef, we will return an ARRAY of combined values, otherwise a + # string of joined values with $separator as the separator. + my $found_array = !defined($separator); my @values = map { @@ -2145,8 +2162,11 @@ sub print_table_entry "sys_id", "cc", "cflags", + "defines", "debug_cflags", + "debug_defines", "release_cflags", + "release_defines", "thread_cflag", "unistd", "ld", diff --git a/Makefile.in b/Makefile.in index 06413f3e33..eeea0057ba 100644 --- a/Makefile.in +++ b/Makefile.in @@ -60,8 +60,8 @@ OPENSSLDIR={- $config{openssldir} -} CROSS_COMPILE= {- $config{cross_compile_prefix} -} CC= $(CROSS_COMPILE){- $target{cc} -} -CFLAG= {- $config{cflags} -} -DEPFLAG= {- $config{depflags} -} +CFLAG={- join(" ",map { "-D".$_} @{$config{defines}}) -} {- $config{cflags} -} +DEPFLAG= {- join(" ",map { "-D".$_} @{$config{depdefines}}) -} LDFLAG= {- $config{lflags} -} PLIB_LDFLAG= {- $config{plib_lflags} -} EX_LIBS= {- $config{ex_libs} -}