Ignore Makefile.save
[openssl.git] / Configure
index 3085fa0f1aba76797763bfa626b2f44bd6ced2d6..b4f12225b14595ca7d6902bb4e511a80aca2e0d2 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -9,24 +9,20 @@ require 5.000;
 use strict;
 
 # see INSTALL for instructions.
-#
-# Usage: Configure [-Dxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-asm] [rsaref]
-#         [386] platform[:flags]
-#
+
+my $usage="Usage: Configure [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [rsaref] [no-asm] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] os/compiler[:flags]\n";
+
 # Options:
+# --openssldir  install OpenSSL in OPENSSLDIR (Default: DIR/ssl if the
+#               --prefix option is given; /usr/local/ssl otherwise)
+# --prefix      prefix for the OpenSSL include, lib and bin directories
+#               (Default: the OPENSSLDIR directory)
 # rsaref        use RSAref
 # no-asm        do not use assembler
 # 386           generate 80386 code
+# no-<cipher>   build without specified algorithm (rsa, idea, rc5, ...)
 # -D, -L, -l, -f, -K: compiler options are passed through 
 # 
-# -DRSAref     build to use RSAref
-# -DNO_IDEA    build with no IDEA algorithm
-# -DNO_RC4     build with no RC4 algorithm
-# -DNO_RC2     build with no RC2 algorithm
-# -DNO_BF      build with no Blowfish algorithm
-# -DNO_DES     build with no DES/3DES algorithm
-# -DNO_MD2     build with no MD2 algorithm
-#
 # DES_PTR      use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
 # DES_RISC1    use different DES_ENCRYPT macro that helps reduce register
 #              dependancies but needs to more registers, good for RISC CPU's
@@ -110,11 +106,11 @@ my %table=(
 # -fast slows things like DES down quite a lot
 "solaris-sparc-sc4","cc:-xO5 -Xa -DB_ENDIAN:-lsocket -lnsl:\
        BN_LLONG RC4_CHAR DES_PTR DES_RISC1 DES_UNROLL BF_PTR:::",
-"solaris-usparc-sc4","cc:-xtarget=ultra -xarch=v8plus -Xa -xO5 -DB_ENDIAN:\
+"solaris-usparc-sc4","cc:-xtarget=ultra -xarch=v8plus -Xa -xO2 -DB_ENDIAN:\
        -lsocket -lnsl:\
        BN_LLONG RC4_CHAR DES_PTR DES_RISC1 DES_UNROLL BF_PTR:asm/sparcv8.o::",
-"solaris-sparc-sc4-pic","cc:-xO5 -Xa -DB_ENDIAN -KPIC:-lsocket -lnsl:\
-       BN_LLONG RC4_CHAR DES_PTR DES_RISC1 DES_UNROLL BF_PTR:::",
+#"solaris-sparc-sc4-pic","cc:-xO5 -Xa -DB_ENDIAN -KPIC:-lsocket -lnsl:\
+#      BN_LLONG RC4_CHAR DES_PTR DES_RISC1 DES_UNROLL BF_PTR:::",
 
 # Sunos configs, assuming sparc for the gcc one.
 ##"sunos-cc", "cc:-O4 -DNOPROTO -DNOCONST::DES_UNROLL:::",
@@ -233,8 +229,8 @@ my %table=(
 "CygWin32", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:",
 
 # Ultrix from Bernhard Simon <simon@zid.tuwien.ac.at>
-"ultrix","cc:-std1 -O -Olimit 1000 -DL_ENDIAN::::::",
-"ultrix-gcc","cc:-O3 -DL_ENDIAN::::::",
+"ultrix-cc","cc:-std1 -O -Olimit 1000 -DL_ENDIAN::::::",
+"ultrix-gcc","gcc:-O3 -DL_ENDIAN::::::",
 # K&R C is no longer supported; you need gcc on old Ultrix installations
 ##"ultrix","cc:-O2 -DNOPROTO -DNOCONST -DL_ENDIAN::::::",
 
@@ -249,7 +245,10 @@ my %table=(
 my @WinTargets=qw(VC-NT VC-WIN32 VC-WIN16 VC-W31-16 VC-W31-32 VC-MSDOS BC-32
        BC-16 CygWin32);
 
+my $installprefix="";
+my $openssldir="";
 my $no_asm=0;
+my @skip=();
 my $Makefile="Makefile.ssl";
 my $des_locl="crypto/des/des_locl.h";
 my $des        ="crypto/des/des.h";
@@ -276,43 +275,53 @@ my $perl;
 $ranlib=&which("ranlib") or $ranlib="true";
 $perl=&which("perl5") or $perl=&which("perl");
 
-if ($#ARGV < 0)
-       {
-       &bad_target;
-       exit(1);
-       }
+&usage if ($#ARGV < 0);
 
 my $flags="";
+my $depflags="";
 my $libs="";
 my $target="";
 foreach (@ARGV)
        {
-       if ($_ =~ /^no-asm$/)
+       if (/^no-asm$/)
                { $no_asm=1; }
-       elsif ($_ =~ /^386$/)
+       elsif (/^no-(.+)$/)
+               {
+               my $algo=$1;
+               push @skip,$algo;
+               $algo =~ tr/[a-z]/[A-Z]/;
+               $flags .= "-DNO_$algo ";
+               $depflags .= "-DNO_$algo ";
+               }
+       elsif (/^386$/)
                { $processor=386; }
-       elsif ($_ =~ /^rsaref$/)
+       elsif (/^rsaref$/)
                {
                $libs.= "-lRSAglue -lrsaref ";
                $flags.= "-DRSAref ";
                }
-       elsif ($_ =~ /^-/)
+       elsif (/^-/)
                {
-               if ($_ =~ /^-[lL](.*)$/)
+               if (/^-[lL](.*)$/)
                        {
                        $libs.=$_." ";
                        }
-               elsif ($_ =~ /^-D(.*)$/)
+               elsif (/^-[DfK](.*)$/)
                        {
                        $flags.=$_." ";
                        }
-               elsif ($_ =~ /^-[fK](.*)$/)
+               elsif (/^--prefix=(.*)$/)
                        {
-                       $flags.=$_." ";
+                       $installprefix=$1;
+                       }
+               elsif (/^--openssldir=(.*)$/)
+                       {
+                       $openssldir=$1;
                        }
                else
                        {
-                       die "unknown options, only -Dxxx, -Lxxx, -lxxx, -fxxx and -Kxxx are supported\n";
+                       print STDERR $usage;
+                       exit(1);
                        }
                }
        elsif ($_ =~ /^([^:]+):(.+)$/) {
@@ -323,22 +332,23 @@ foreach (@ARGV)
                {
                die "target already defined - $target\n" if ($target ne "");
                $target=$_;
-               if (!defined($table{$target}))
-                       {
-                       &bad_target;
-                       exit(1);
-                       }
                }
-       }
+}
 
-if (!defined($table{$target}))
-       {
-       &bad_target;
-       exit(1);
-       }
+&usage if (!defined($table{$target}));
 
 my $IsWindows=scalar grep /^$target$/,@WinTargets;
 
+$openssldir="/usr/local/ssl" if ($openssldir eq "" and $installprefix eq "");
+$installprefix=$openssldir if $installprefix eq "";
+
+chop $openssldir if $openssldir =~ /\/$/;
+chop $installprefix if $installprefix =~ /\/$/;
+
+$openssldir=$installprefix . "/ssl" if $openssldir eq "";
+$openssldir=$installprefix . "/" . $openssldir if $openssldir !~ /^\//;
+
+
 print "IsWindows=$IsWindows\n";
 
 (my $cc,my $cflags,my $lflags,my $bn_ops,my $bn_obj,my $des_obj,my $bf_obj,
@@ -381,14 +391,46 @@ if ($rmd160_obj =~ /\.o$/)
        $cflags.=" -DRMD160_ASM";
        }
 
+my $version = "unknown";
+my $major = "unknown";
+my $minor = "unknown";
+
+open(IN,'<crypto/opensslv.h') || die "unable to read opensslv.h:$!\n";
+while (<IN>)
+       {
+       $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
+       }
+close(IN);
+
+if ($version =~ /(^[0-9]*)\.([\0-9\.]*)/)
+       {
+       $major=$1;
+       $minor=$2;
+       }
+
 open(IN,'<Makefile.org') || die "unable to read Makefile.org:$!\n";
 open(OUT,">$Makefile") || die "unable to create $Makefile:$!\n";
+my $sdirs=0;
 while (<IN>)
        {
        chop;
+       $sdirs = 1 if /^SDIRS=/;
+       $sdirs = 0 unless /\\$/;
+       if ($sdirs) {
+               my $dir;
+               foreach $dir (@skip) {
+                       s/$dir//;
+                       }
+               }
+       s/^VERSION=.*/VERSION=$version/;
+       s/^MAJOR=.*/MAJOR=$major/;
+       s/^MINOR=.*/MINOR=$minor/;
+       s/^INSTALLTOP=.*$/INSTALLTOP=$installprefix/;
+       s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
        s/^PLATFORM=.*$/PLATFORM=$target/;
        s/^CC=.*$/CC= $cc/;
        s/^CFLAG=.*$/CFLAG= $cflags/;
+       s/^DEPFLAG=.*$/DEPFLAG= $depflags/;
        s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
        s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
        s/^DES_ENC=.*$/DES_ENC= $des_obj/;
@@ -470,7 +512,9 @@ open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.
 open(OUT,'>crypto/opensslconf.h') || die "unable to create crypto/opensslconf.h:$!\n";
 while (<IN>)
        {
-       if      (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
+       if      (/^#define\s+OPENSSLDIR/)
+               { print OUT "#define OPENSSLDIR \"$openssldir\"\n"; }
+       elsif   (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
                { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
        elsif   (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
                { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
@@ -538,12 +582,27 @@ if($IsWindows) {
        open (OUT,">crypto/date.h") || die "Can't open date.h";
        printf OUT "#define DATE \"%s\"\n", scalar gmtime();
        close(OUT);
+} else {
+       if ( $perl =~ /./ ) {
+               (system "make -f Makefile.ssl PERL=\'$perl\' links") == 0 or exit $?;
+       } else {
+               (system 'make -f Makefile.ssl links') == 0 or exit $?;
+       }
+       (system 'make depend') == 0 or exit $? if $depflags ne "";
+       &dofile("tools/c_rehash",$openssldir,'^DIR=',   'DIR=%s',);
+       &dofile("util/mk1mf.pl",$openssldir,
+                               ('^\$INSTALLTOP=','$INSTALLTOP="%s";',));
 }
 
-system 'make -f Makefile.ssl links' if !$IsWindows;
 
-my $pwd=`pwd`;
-chop($pwd);
+my $pwd;
+
+if($IsWindows) {
+       $pwd="(include directory)";
+} else {
+       $pwd =`pwd`;
+       chop($pwd);
+}
 print <<EOF;
 
 NOTE: The OpenSSL header files have been moved from include/*.h
@@ -557,10 +616,11 @@ conflicts with other libraries.
 
 To compile programs that use the old form <foo.h>,
 usually an additional compiler option will suffice: E.g., add
-     -I/usr/local/include/openssl
+     -I$installprefix/include/openssl
 or
      -I$pwd/include/openssl
-to the CFLAGS in the Makefile of the program that you want to compile.
+to the CFLAGS in the Makefile of the program that you want to compile
+(and leave all the original -I...'s in place!).
 
 Please make sure that no old OpenSSL header files are around:
 The include directory should now be empty except for the openssl
@@ -569,18 +629,26 @@ EOF
 
 exit(0);
 
-sub bad_target
+sub usage
        {
-       print STDERR "Usage: Configure [-Dxxx] [-Lxxx] [-lxxx] [no-asm] [rsaref] os/compiler\n";
+       print STDERR $usage;
        print STDERR "pick os/compiler from:";
        my $j=0;
        my $i;
        foreach $i (sort keys %table)
                {
+               next if $i =~ /^debug/;
+               print STDERR "\n" if ($j++ % 4) == 0;
+               printf(STDERR "%-18s ",$i);
+               }
+       foreach $i (sort keys %table)
+               {
+               next if $i !~ /^debug/;
                print STDERR "\n" if ($j++ % 4) == 0;
                printf(STDERR "%-18s ",$i);
                }
        print STDERR "\n";
+       exit(1);
        }
 
 sub which
@@ -597,3 +665,22 @@ sub which
                }
        }
 
+sub dofile
+       {
+       my $f; my $p; my %m; my @a; my $k; my $ff;
+       ($f,$p,%m)=@_;
+
+       open(IN,"<$f") || die "unable to open $f:$!\n";
+       @a=<IN>;
+       close(IN);
+       foreach $k (keys %m)
+               {
+               grep(/$k/ && ($_=sprintf($m{$k}."\n",$p)),@a);
+               }
+       ($ff=$f) =~ s/\..*$//;
+       open(OUT,">$ff.new") || die "unable to open $f:$!\n";
+       print OUT @a;
+       close(OUT);
+       rename($f,"$ff.bak") || die "unable to rename $f\n";
+       rename("$ff.new",$f) || die "unable to rename $ff.new\n";
+       }