Initial code to support distinct certificate and CRL signing keys where the
[openssl.git] / Makefile.org
index 3956dfccea8db128e2e76e29fe546e07861df190..d3dc117eec03bac6b9fc97d037a1f9a3f46be753 100644 (file)
@@ -57,9 +57,8 @@ OPENSSLDIR=/usr/local/ssl
 # equal 4.
 # PKCS1_CHECK - pkcs1 tests.
 
-CC= gcc
-#CFLAG= -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
-CFLAG= -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
+CC= cc
+CFLAG= -O
 DEPFLAG= 
 PEX_LIBS= 
 EX_LIBS= 
@@ -67,6 +66,7 @@ EXE_EXT=
 ARFLAGS=
 AR=ar $(ARFLAGS) r
 RANLIB= ranlib
+NM= nm
 PERL= perl
 TAR= tar
 TARFLAGS= --no-recursion
@@ -78,119 +78,63 @@ MAKEDEPPROG=makedepend
 # gcc, then the driver will automatically translate it to -xarch=v8plus
 # and pass it down to assembler.
 AS=$(CC) -c
-ASFLAGS=$(CFLAG)
-
-# Set BN_ASM to bn_asm.o if you want to use the C version
-BN_ASM= bn_asm.o
-#BN_ASM= bn_asm.o
-#BN_ASM= asm/bn86-elf.o        # elf, linux-elf
-#BN_ASM= asm/bn86-sol.o # solaris
-#BN_ASM= asm/bn86-out.o # a.out, FreeBSD
-#BN_ASM= asm/bn86bsdi.o # bsdi
-#BN_ASM= asm/alpha.o    # DEC Alpha
-#BN_ASM= asm/pa-risc2.o # HP-UX PA-RISC
-#BN_ASM= asm/r3000.o    # SGI MIPS cpu
-#BN_ASM= asm/sparc.o    # Sun solaris/SunOS
-#BN_ASM= asm/bn-win32.o # Windows 95/NT
-#BN_ASM= asm/x86w16.o   # 16 bit code for Windows 3.1/DOS
-#BN_ASM= asm/x86w32.o   # 32 bit code for Windows 3.1
+ASFLAG=$(CFLAG)
 
 # For x86 assembler: Set PROCESSOR to 386 if you want to support
 # the 80386.
 PROCESSOR=
 
-# Set DES_ENC to des_enc.o if you want to use the C version
-#There are 4 x86 assember options.
-DES_ENC= asm/dx86-out.o asm/yx86-out.o
-#DES_ENC= des_enc.o fcrypt_b.o          # C
-#DES_ENC= asm/dx86-elf.o asm/yx86-elf.o # elf
-#DES_ENC= asm/dx86-sol.o asm/yx86-sol.o # solaris
-#DES_ENC= asm/dx86-out.o asm/yx86-out.o # a.out, FreeBSD
-#DES_ENC= asm/dx86bsdi.o asm/yx86bsdi.o # bsdi
-
-# Set BF_ENC to bf_enc.o if you want to use the C version
-#There are 4 x86 assember options.
-BF_ENC= asm/bx86-out.o
-#BF_ENC= bf_enc.o
-#BF_ENC= asm/bx86-elf.o # elf
-#BF_ENC= asm/bx86-sol.o # solaris
-#BF_ENC= asm/bx86-out.o # a.out, FreeBSD
-#BF_ENC= asm/bx86bsdi.o # bsdi
-
-# Set CAST_ENC to c_enc.o if you want to use the C version
-#There are 4 x86 assember options.
-CAST_ENC= asm/cx86-out.o
-#CAST_ENC= c_enc.o
-#CAST_ENC= asm/cx86-elf.o # elf
-#CAST_ENC= asm/cx86-sol.o # solaris
-#CAST_ENC= asm/cx86-out.o # a.out, FreeBSD
-#CAST_ENC= asm/cx86bsdi.o # bsdi
-
-# Set RC4_ENC to rc4_enc.o if you want to use the C version
-#There are 4 x86 assember options.
-RC4_ENC= asm/rx86-out.o
-#RC4_ENC= rc4_enc.o
-#RC4_ENC= asm/rx86-elf.o # elf
-#RC4_ENC= asm/rx86-sol.o # solaris
-#RC4_ENC= asm/rx86-out.o # a.out, FreeBSD
-#RC4_ENC= asm/rx86bsdi.o # bsdi
-
-# Set RC5_ENC to rc5_enc.o if you want to use the C version
-#There are 4 x86 assember options.
-RC5_ENC= asm/r586-out.o
-#RC5_ENC= rc5_enc.o
-#RC5_ENC= asm/r586-elf.o # elf
-#RC5_ENC= asm/r586-sol.o # solaris
-#RC5_ENC= asm/r586-out.o # a.out, FreeBSD
-#RC5_ENC= asm/r586bsdi.o # bsdi
-
-# Also need MD5_ASM defined
-MD5_ASM_OBJ= asm/mx86-out.o
-#MD5_ASM_OBJ= asm/mx86-elf.o        # elf
-#MD5_ASM_OBJ= asm/mx86-sol.o        # solaris
-#MD5_ASM_OBJ= asm/mx86-out.o        # a.out, FreeBSD
-#MD5_ASM_OBJ= asm/mx86bsdi.o        # bsdi
-
-# Also need SHA1_ASM defined
-SHA1_ASM_OBJ= asm/sx86-out.o
-#SHA1_ASM_OBJ= asm/sx86-elf.o       # elf
-#SHA1_ASM_OBJ= asm/sx86-sol.o       # solaris
-#SHA1_ASM_OBJ= asm/sx86-out.o       # a.out, FreeBSD
-#SHA1_ASM_OBJ= asm/sx86bsdi.o       # bsdi
-
-# Also need RMD160_ASM defined
-RMD160_ASM_OBJ= asm/rm86-out.o
-#RMD160_ASM_OBJ= asm/rm86-elf.o       # elf
-#RMD160_ASM_OBJ= asm/rm86-sol.o       # solaris
-#RMD160_ASM_OBJ= asm/rm86-out.o       # a.out, FreeBSD
-#RMD160_ASM_OBJ= asm/rm86bsdi.o       # bsdi
+# CPUID module collects small commonly used assembler snippets
+CPUID_OBJ= 
+BN_ASM= bn_asm.o
+DES_ENC= des_enc.o fcrypt_b.o
+AES_ENC= aes_core.o aes_cbc.o
+BF_ENC= bf_enc.o
+CAST_ENC= c_enc.o
+RC4_ENC= rc4_enc.o
+RC5_ENC= rc5_enc.o
+MD5_ASM_OBJ= 
+SHA1_ASM_OBJ= 
+RMD160_ASM_OBJ= 
+WP_ASM_OBJ=
+CMLL_ENC=
+PERLASM_SCHEME=
 
 # KRB5 stuff
 KRB5_INCLUDES=
 LIBKRB5=
 
+# Zlib stuff
+ZLIB_INCLUDE=
+LIBZLIB=
+
 DIRS=   crypto ssl engines apps test tools
 SHLIBDIRS= crypto ssl
 
 # dirs in crypto to build
 SDIRS=  \
-       md2 md4 md5 sha mdc2 hmac ripemd \
-       des rc2 rc4 rc5 idea bf cast \
-       bn ec rsa dsa ecdsa dh ecdh dso engine aes \
-       buffer bio stack lhash rand err objects \
-       evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5
+       objects \
+       md2 md4 md5 sha mdc2 hmac ripemd whrlpool \
+       des aes rc2 rc4 rc5 idea bf cast camellia seed \
+       bn ec rsa dsa ecdsa dh ecdh dso engine \
+       buffer bio stack lhash rand err \
+       evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \
+       cms pqueue ts 
+# keep in mind that the above list is adjusted by ./Configure
+# according to no-xxx arguments...
 
 # tests to perform.  "alltests" is a special word indicating that all tests
 # should be performed.
 TESTS = alltests
 
-MAKEFILE= Makefile.ssl
-NEWMAKE=  make
-MAKE=     $(NEWMAKE) -f Makefile.ssl
+MAKEFILE= Makefile
 
 MANDIR=$(OPENSSLDIR)/man
 MAN1=1
 MAN3=3
+MANSUFFIX=
+HTMLSUFFIX=html
+HTMLDIR=$(OPENSSLDIR)/html
 SHELL=/bin/sh
 
 TOP=    .
@@ -212,15 +156,81 @@ WTARFILE=       $(NAME)-win.tar
 EXHEADER=       e_os2.h
 HEADER=         e_os.h
 
-all: Makefile.ssl build_all openssl.pc
+all: Makefile build_all openssl.pc libssl.pc libcrypto.pc
+
+# as we stick to -e, CLEARENV ensures that local variables in lower
+# Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn
+# shell, which [annoyingly enough] terminates unset with error if VAR
+# is not present:-( TOP= && unset TOP is tribute to HP-UX /bin/sh,
+# which terminates unset with error if no variable was present:-(
+CLEARENV=      TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS}     \
+               $${INCLUDE+INCLUDE} $${INCLUDES+INCLUDES}       \
+               $${DIR+DIR} $${DIRS+DIRS} $${SRC+SRC}           \
+               $${LIBSRC+LIBSRC} $${LIBOBJ+LIBOBJ} $${ALL+ALL} \
+               $${EXHEADER+EXHEADER} $${HEADER+HEADER}         \
+               $${GENERAL+GENERAL} $${CFLAGS+CFLAGS}           \
+               $${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS}           \
+               $${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS}             \
+               $${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS}     \
+               $${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS}
+
+BUILDENV=      PLATFORM='${PLATFORM}' PROCESSOR='${PROCESSOR}' \
+               CC='${CC}' CFLAG='${CFLAG}'                     \
+               AS='${CC}' ASFLAG='${CFLAG} -c'                 \
+               AR='${AR}' NM='${NM}' RANLIB='${RANLIB}'        \
+               CROSS_COMPILE_PREFIX='${CROSS_COMPILE_PREFIX}'  \
+               PERL='${PERL}'                                  \
+               SDIRS='${SDIRS}' LIBRPATH='${INSTALLTOP}/lib'   \
+               INSTALL_PREFIX='${INSTALL_PREFIX}'              \
+               INSTALLTOP='${INSTALLTOP}' OPENSSLDIR='${OPENSSLDIR}'   \
+               MAKEDEPEND='$$$${TOP}/util/domd $$$${TOP} -MD ${MAKEDEPPROG}' \
+               DEPFLAG='-DOPENSSL_NO_DEPRECATED ${DEPFLAG}'    \
+               MAKEDEPPROG='${MAKEDEPPROG}'                    \
+               SHARED_LDFLAGS='${SHARED_LDFLAGS}'              \
+               KRB5_INCLUDES='${KRB5_INCLUDES}' LIBKRB5='${LIBKRB5}'   \
+               EXE_EXT='${EXE_EXT}' SHARED_LIBS='${SHARED_LIBS}'       \
+               SHLIB_EXT='${SHLIB_EXT}' SHLIB_TARGET='${SHLIB_TARGET}' \
+               PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}'     \
+               CPUID_OBJ='${CPUID_OBJ}'                        \
+               BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}'         \
+               AES_ENC='${AES_ENC}' CMLL_ENC='${CMLL_ENC}'     \
+               BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}'       \
+               RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}'       \
+               SHA1_ASM_OBJ='${SHA1_ASM_OBJ}'                  \
+               MD5_ASM_OBJ='${MD5_ASM_OBJ}'                    \
+               RMD160_ASM_OBJ='${RMD160_ASM_OBJ}'              \
+               WP_ASM_OBJ='${WP_ASM_OBJ}'                      \
+               PERLASM_SCHEME='${PERLASM_SCHEME}'              \
+               THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES=
+# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors,
+# which in turn eliminates ambiguities in variable treatment with -e.
+
+# BUILD_CMD is a generic macro to build a given target in a given
+# subdirectory.  The target must be given through the shell variable
+# `target' and the subdirectory to build in must be given through `dir'.
+# This macro shouldn't be used directly, use RECURSIVE_BUILD_CMD or
+# BUILD_ONE_CMD instead.
+#
+# BUILD_ONE_CMD is a macro to build a given target in a given
+# subdirectory if that subdirectory is part of $(DIRS).  It requires
+# exactly the same shell variables as BUILD_CMD.
+#
+# RECURSIVE_BUILD_CMD is a macro to build a given target in all
+# subdirectories defined in $(DIRS).  It requires that the target
+# is given through the shell variable `target'.
+BUILD_CMD=  if [ -d "$$dir" ]; then \
+           (   cd $$dir && echo "making $$target in $$dir..." && \
+               $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. DIR=$$dir $$target \
+           ) || exit 1; \
+           fi
+RECURSIVE_BUILD_CMD=for dir in $(DIRS); do $(BUILD_CMD); done
+BUILD_ONE_CMD=\
+       if echo " $(DIRS) " | grep " $$dir " >/dev/null 2>/dev/null; then \
+               $(BUILD_CMD); \
+       fi
 
-BUILD_CMD=if echo " $(DIRS) " | grep " $$i " >/dev/null 2>/dev/null; then \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making all in $$i..." && \
-               $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' AS='${AS}' ASFLAGS='${ASFLAGS}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PROCESSOR='${PROCESSOR}' PERL='${PERL}' RANLIB='${RANLIB}' KRB5_INCLUDES='${KRB5_INCLUDES}' LIBKRB5='${LIBKRB5}' EXE_EXT='${EXE_EXT}' SHARED_LIBS='${SHARED_LIBS}' SHLIB_EXT='${SHLIB_EXT}' SHLIB_TARGET='${SHLIB_TARGET}' all ) || exit 1; \
-       else \
-               $(MAKE) $$i; \
-       fi; fi
+reflect:
+       @[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV)
 
 sub_all: build_all
 build_all: build_libs build_apps build_tests build_tools
@@ -228,23 +238,28 @@ build_all: build_libs build_apps build_tests build_tools
 build_libs: build_crypto build_ssl build_engines
 
 build_crypto:
-       @i=crypto; $(BUILD_CMD)
+       @dir=crypto; target=all; $(BUILD_ONE_CMD)
 build_ssl:
-       @i=ssl; $(BUILD_CMD)
+       @dir=ssl; target=all; $(BUILD_ONE_CMD)
 build_engines:
-       @i=engines; $(BUILD_CMD)
+       @dir=engines; target=all; $(BUILD_ONE_CMD)
 build_apps:
-       @i=apps; $(BUILD_CMD)
+       @dir=apps; target=all; $(BUILD_ONE_CMD)
 build_tests:
-       @i=test; $(BUILD_CMD)
+       @dir=test; target=all; $(BUILD_ONE_CMD)
 build_tools:
-       @i=tools; $(BUILD_CMD)
+       @dir=tools; target=all; $(BUILD_ONE_CMD)
+
+all_testapps: build_libs build_testapps
+build_testapps:
+       @dir=crypto; target=testapps; $(BUILD_ONE_CMD)
 
 libcrypto$(SHLIB_EXT): libcrypto.a
        @if [ "$(SHLIB_TARGET)" != "" ]; then \
                $(MAKE) SHLIBDIRS=crypto build-shared; \
        else \
                echo "There's no support for shared libraries on this platform" >&2; \
+               exit 1; \
        fi
 
 libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a
@@ -252,10 +267,11 @@ libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a
                $(MAKE) SHLIBDIRS=ssl SHLIBDEPS='-lcrypto' build-shared; \
        else \
                echo "There's no support for shared libraries on this platform" >&2; \
+               exit 1; \
        fi
 
 clean-shared:
-       @for i in $(SHLIBDIRS); do \
+       @set -e; for i in $(SHLIBDIRS); do \
                if [ -n "$(SHARED_LIBS_LINK_EXTS)" ]; then \
                        tmp="$(SHARED_LIBS_LINK_EXTS)"; \
                        for j in $${tmp:-x}; do \
@@ -269,8 +285,8 @@ clean-shared:
        done
 
 link-shared:
-       @ for i in ${SHLIBDIRS}; do \
-               $(NEWMAKE) -f $(HERE)/Makefile.shared \
+       @ set -e; for i in ${SHLIBDIRS}; do \
+               $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \
                        LIBNAME=$$i LIBVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} \
                        LIBCOMPATVERSIONS=";${SHLIB_VERSION_HISTORY}" \
                        symlink.$(SHLIB_TARGET); \
@@ -280,22 +296,45 @@ link-shared:
 build-shared: do_$(SHLIB_TARGET) link-shared
 
 do_$(SHLIB_TARGET):
-       @ libs='-L. ${SHLIBDEPS}'; for i in ${SHLIBDIRS}; do \
+       @ set -e; libs='-L. ${SHLIBDEPS}'; for i in ${SHLIBDIRS}; do \
                if [ "${SHLIBDIRS}" = "ssl" -a -n "$(LIBKRB5)" ]; then \
                        libs="$(LIBKRB5) $$libs"; \
                fi; \
-               $(NEWMAKE) -f Makefile.shared \
-                       CC="$(CC)" LDFLAGS="$(LDFLAGS)" \
-                       SHARED_LDFLAGS="$(SHARED_LDFLAGS)" \
+               $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \
                        LIBNAME=$$i LIBVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} \
                        LIBCOMPATVERSIONS=";${SHLIB_VERSION_HISTORY}" \
                        LIBDEPS="$$libs $(EX_LIBS)" \
-                       LIBRPATH="$(INSTALLTOP)/lib" \
                        link_a.$(SHLIB_TARGET); \
                libs="-l$$i $$libs"; \
        done
 
-openssl.pc: Makefile.ssl
+libcrypto.pc: Makefile
+       @ ( echo 'prefix=$(INSTALLTOP)'; \
+           echo 'exec_prefix=$${prefix}'; \
+           echo 'libdir=$${exec_prefix}/lib'; \
+           echo 'includedir=$${prefix}/include'; \
+           echo ''; \
+           echo 'Name: OpenSSL-libcrypto'; \
+           echo 'Description: OpenSSL cryptography library'; \
+           echo 'Version: '$(VERSION); \
+           echo 'Requires: '; \
+           echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \
+           echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc
+
+libssl.pc: Makefile
+       @ ( echo 'prefix=$(INSTALLTOP)'; \
+           echo 'exec_prefix=$${prefix}'; \
+           echo 'libdir=$${exec_prefix}/lib'; \
+           echo 'includedir=$${prefix}/include'; \
+           echo ''; \
+           echo 'Name: OpenSSL'; \
+           echo 'Description: Secure Sockets Layer and cryptography libraries'; \
+           echo 'Version: '$(VERSION); \
+           echo 'Requires: '; \
+           echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
+           echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc
+
+openssl.pc: Makefile
        @ ( echo 'prefix=$(INSTALLTOP)'; \
            echo 'exec_prefix=$${prefix}'; \
            echo 'libdir=$${exec_prefix}/lib'; \
@@ -308,28 +347,22 @@ openssl.pc: Makefile.ssl
            echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
            echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc
 
-Makefile.ssl: Makefile.org
-       @echo "Makefile.ssl is older than Makefile.org."
+Makefile: Makefile.org Configure config
+       @echo "Makefile is older than Makefile.org, Configure or config."
        @echo "Reconfigure the source tree (via './config' or 'perl Configure'), please."
        @false
 
 libclean:
-       rm -f *.map *.so *.so.* engines/*.so *.a */lib */*/lib
+       rm -f *.map *.so *.so.* *.dll engines/*.so engines/*.dll *.a engines/*.a */lib */*/lib
 
 clean: libclean
        rm -f shlib/*.o *.o core a.out fluff rehash.time testlog make.log cctest cctest.c
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making clean in $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' clean ) || exit 1; \
-               rm -f $(LIBS); \
-       fi; \
-       done;
-       rm -f openssl.pc
+       @set -e; target=clean; $(RECURSIVE_BUILD_CMD)
+       rm -f $(LIBS)
+       rm -f openssl.pc libssl.pc libcrypto.pc
        rm -f speed.* .pure
        rm -f $(TARFILE)
-       @for i in $(ONEDIRS) ;\
+       @set -e; for i in $(ONEDIRS) ;\
        do \
        rm -fr $$i/*; \
        done
@@ -339,93 +372,57 @@ makefile.one: files
        sh util/do_ms.sh
 
 files:
-       $(PERL) $(TOP)/util/files.pl Makefile.ssl > $(TOP)/MINFO
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making 'files' in $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' PERL='${PERL}' files ) || exit 1; \
-       fi; \
-       done;
+       $(PERL) $(TOP)/util/files.pl Makefile > $(TOP)/MINFO
+       @set -e; target=files; $(RECURSIVE_BUILD_CMD)
 
 links:
-       @$(TOP)/util/point.sh Makefile.ssl Makefile
        @$(PERL) $(TOP)/util/mkdir-p.pl include/openssl
        @$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER)
-       @for i in $(DIRS); do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making links in $$i..." && \
-               $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PERL='${PERL}' KRB5_INCLUDES='${KRB5_INCLUDES}' LIBKRB5='${LIBKRB5}' links ) || exit 1; \
-       fi; \
-       done;
+       @set -e; target=links; $(RECURSIVE_BUILD_CMD)
 
 gentests:
        @(cd test && echo "generating dummy tests (if needed)..." && \
-       $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PROCESSOR='${PROCESSOR}' PERL='${PERL}' RANLIB='${RANLIB}' TESTS='${TESTS}' KRB5_INCLUDES='${KRB5_INCLUDES}' LIBKRB5='${LIBKRB5}' EXE_EXT='${EXE_EXT}' SHARED_LIBS='${SHARED_LIBS}' SHLIB_EXT='${SHLIB_EXT}' SHLIB_TARGET='${SHLIB_TARGET}' TESTS='${TESTS}' OPENSSL_DEBUG_MEMORY=on generate );
+       $(CLEARENV) && $(MAKE) -e $(BUILDENV) TESTS='${TESTS}' OPENSSL_DEBUG_MEMORY=on generate );
 
 dclean:
-       rm -f *.bak
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making dclean in $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' PERL='${PERL}' dclean ) || exit 1; \
-       fi; \
-       done;
+       rm -rf *.bak include/openssl certs/.0
+       @set -e; target=dclean; $(RECURSIVE_BUILD_CMD)
 
 rehash: rehash.time
-rehash.time: certs
-       @(OPENSSL="`pwd`/apps/openssl"; OPENSSL_DEBUG_MEMORY=on; \
+rehash.time: certs apps
+       @if [ -z "$(CROSS_COMPILE_PREFIX)" ]; then \
+               (OPENSSL="`pwd`/util/opensslwrap.sh"; \
+               [ -x "apps/openssl.exe" ] && OPENSSL="apps/openssl.exe" || :; \
+               OPENSSL_DEBUG_MEMORY=on; \
                export OPENSSL OPENSSL_DEBUG_MEMORY; \
-               LD_LIBRARY_PATH="`pwd`"; DYLD_LIBRARY_PATH="`pwd`"; SHLIB_PATH="`pwd`"; LIBPATH="`pwd`"; \
-               if [ "$(PLATFORM)" = "Cygwin" ]; then PATH="`pwd`:$$PATH"; fi; \
-               export LD_LIBRARY_PATH DYLD_LIBRARY_PATH SHLIB_PATH LIBPATH PATH; \
-               $(PERL) tools/c_rehash certs)
-       touch rehash.time
+               $(PERL) tools/c_rehash certs) && \
+               touch rehash.time; \
+       else :; fi
 
 test:   tests
 
 tests: rehash
        @(cd test && echo "testing..." && \
-       $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PROCESSOR='${PROCESSOR}' PERL='${PERL}' RANLIB='${RANLIB}' TESTS='${TESTS}' KRB5_INCLUDES='${KRB5_INCLUDES}' LIBKRB5='${LIBKRB5}' EXE_EXT='${EXE_EXT}' SHARED_LIBS='${SHARED_LIBS}' SHLIB_EXT='${SHLIB_EXT}' SHLIB_TARGET='${SHLIB_TARGET}' TESTS='${TESTS}' OPENSSL_DEBUG_MEMORY=on tests );
-       @LD_LIBRARY_PATH="`pwd`"; DYLD_LIBRARY_PATH="`pwd`"; SHLIB_PATH="`pwd`"; LIBPATH="`pwd`"; \
-               if [ "$(PLATFORM)" = "Cygwin" ]; then PATH="`pwd`:$$PATH"; fi; \
-               export LD_LIBRARY_PATH DYLD_LIBRARY_PATH SHLIB_PATH LIBPATH PATH; \
-               apps/openssl version -a
+       $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. TESTS='${TESTS}' OPENSSL_DEBUG_MEMORY=on tests );
+       util/opensslwrap.sh version -a
 
 report:
        @$(PERL) util/selftest.pl
 
 depend:
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making dependencies $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' CFLAG='${CFLAG}' DEPFLAG='${DEPFLAG}' MAKEDEPPROG='${MAKEDEPPROG}' KRB5_INCLUDES='${KRB5_INCLUDES}' PERL='${PERL}' depend ) || exit 1; \
-       fi; \
-       done;
+       @set -e; target=depend; $(RECURSIVE_BUILD_CMD)
 
 lint:
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making lint $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' lint ) || exit 1; \
-       fi; \
-       done;
+       @set -e; target=lint; $(RECURSIVE_BUILD_CMD)
 
 tags:
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i && echo "making tags $$i..." && \
-               $(MAKE) SDIRS='${SDIRS}' tags ) || exit 1; \
-       fi; \
-       done;
+       rm -f TAGS
+       find . -name '[^.]*.[ch]' | xargs etags -a
 
 errors:
        $(PERL) util/mkerr.pl -recurse -write
        (cd engines; $(MAKE) PERL=$(PERL) errors)
+       $(PERL) util/ck_errf.pl */*.c */*/*.c
 
 stacks:
        $(PERL) util/mkstack.pl -write
@@ -440,12 +437,21 @@ crypto/objects/obj_dat.h: crypto/objects/obj_dat.pl crypto/objects/obj_mac.h
        $(PERL) crypto/objects/obj_dat.pl crypto/objects/obj_mac.h crypto/objects/obj_dat.h
 crypto/objects/obj_mac.h: crypto/objects/objects.pl crypto/objects/objects.txt crypto/objects/obj_mac.num
        $(PERL) crypto/objects/objects.pl crypto/objects/objects.txt crypto/objects/obj_mac.num crypto/objects/obj_mac.h
+crypto/objects/obj_xref.h: crypto/objects/objxref.pl crypto/objects/obj_xref.txt crypto/objects/obj_mac.num
+       $(PERL) crypto/objects/objxref.pl > crypto/objects/obj_xref.h
+
+apps/openssl-vms.cnf: apps/openssl.cnf
+       $(PERL) VMS/VMSify-conf.pl < apps/openssl.cnf > apps/openssl-vms.cnf
+
+crypto/bn/bn_prime.h: crypto/bn/bn_prime.pl
+       $(PERL) crypto/bn/bn_prime.pl >crypto/bn/bn_prime.h
+
 
 TABLE: Configure
        (echo 'Output of `Configure TABLE'"':"; \
        $(PERL) Configure TABLE) > TABLE
 
-update: depend errors stacks util/libeay.num util/ssleay.num crypto/objects/obj_dat.h TABLE
+update: errors stacks util/libeay.num util/ssleay.num crypto/objects/obj_dat.h crypto/objects/obj_xref.h apps/openssl-vms.cnf crypto/bn/bn_prime.h TABLE depend
 
 # Build distribution tar-file. As the list of files returned by "find" is
 # pretty long, on several platforms a "too many arguments" error or similar
@@ -480,31 +486,26 @@ dist:
        @$(MAKE) TAR='${TAR}' TARFLAGS='${TARFLAGS}' tar
 
 dist_pem_h:
-       (cd crypto/pem; $(MAKE) CC='${CC}' SDIRS='${SDIRS}' CFLAG='${CFLAG}' pem.h; $(MAKE) clean)
+       (cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean)
+
+install: all install_docs install_sw
 
-install: all install_docs
+install_sw:
        @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \
                $(INSTALL_PREFIX)$(INSTALLTOP)/lib \
+               $(INSTALL_PREFIX)$(INSTALLTOP)/lib/engines \
                $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig \
                $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \
-               $(INSTALL_PREFIX)$(OPENSSLDIR)/engines \
                $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \
                $(INSTALL_PREFIX)$(OPENSSLDIR)/certs \
-               $(INSTALL_PREFIX)$(OPENSSLDIR)/private \
-               $(INSTALL_PREFIX)$(OPENSSLDIR)/lib
-       @for i in $(EXHEADER) ;\
+               $(INSTALL_PREFIX)$(OPENSSLDIR)/private
+       @set -e; headerlist="$(EXHEADER)"; for i in $$headerlist;\
        do \
        (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
        chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
        done;
-       @for i in $(DIRS) ;\
-       do \
-       if [ -d "$$i" ]; then \
-               (cd $$i; echo "installing $$i..."; \
-               $(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALL_PREFIX='${INSTALL_PREFIX}' INSTALLTOP='${INSTALLTOP}' OPENSSLDIR='${OPENSSLDIR}' EX_LIBS='${EX_LIBS}' SDIRS='${SDIRS}' RANLIB='${RANLIB}' EXE_EXT='${EXE_EXT}' SHARED_LIBS='${SHARED_LIBS}' install ); \
-       fi; \
-       done
-       @for i in $(LIBS) ;\
+       @set -e; target=install; $(RECURSIVE_BUILD_CMD)
+       @set -e; for i in $(LIBS) ;\
        do \
                if [ -f "$$i" ]; then \
                (       echo installing $$i; \
@@ -514,7 +515,7 @@ install: all install_docs
                        mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i ); \
                fi; \
        done;
-       @if [ -n "$(SHARED_LIBS)" ]; then \
+       @set -e; if [ -n "$(SHARED_LIBS)" ]; then \
                tmp="$(SHARED_LIBS)"; \
                for i in $${tmp:-x}; \
                do \
@@ -525,19 +526,29 @@ install: all install_docs
                                        chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new; \
                                        mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i; \
                                else \
-                                       c=`echo $$i | sed 's/^lib/cyg/'`; \
+                                       c=`echo $$i | sed 's/^lib\(.*\)\.dll\.a/cyg\1-$(SHLIB_VERSION_NUMBER).dll/'`; \
                                        cp $$c $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \
                                        chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \
                                        mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c; \
-                                       cp $$i.a $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.a.new; \
-                                       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.a.new; \
-                                       mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.a.new $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.a; \
+                                       cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new; \
+                                       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new; \
+                                       mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/lib/$$i; \
                                fi ); \
+                               if expr $(PLATFORM) : 'mingw' > /dev/null; then \
+                               (       case $$i in \
+                                               *crypto*) i=libeay32.dll;; \
+                                               *ssl*)    i=ssleay32.dll;; \
+                                       esac; \
+                                       echo installing $$i; \
+                                       cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \
+                                       chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \
+                                       mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i ); \
+                               fi; \
                        fi; \
                done; \
                (       here="`pwd`"; \
                        cd $(INSTALL_PREFIX)$(INSTALLTOP)/lib; \
-                       $(NEWMAKE) -f $$here/Makefile HERE="$$here" link-shared ); \
+                       $(MAKE) -f $$here/Makefile HERE="$$here" link-shared ); \
                if [ "$(INSTALLTOP)" != "/usr" ]; then \
                        echo 'OpenSSL shared libraries have been installed in:'; \
                        echo '  $(INSTALLTOP)'; \
@@ -545,7 +556,33 @@ install: all install_docs
                        sed -e '1,/^$$/d' doc/openssl-shared.txt; \
                fi; \
        fi
+       cp libcrypto.pc $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig/libcrypto.pc
+       cp libssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig/libssl.pc
        cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/lib/pkgconfig/openssl.pc
+
+install_html_docs:
+       here="`pwd`"; \
+       for subdir in apps crypto ssl; do \
+               mkdir -p $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \
+               for i in doc/$$subdir/*.pod; do \
+                       fn=`basename $$i .pod`; \
+                       echo "installing html/$$fn.$(HTMLSUFFIX)"; \
+                       cat $$i \
+                       | sed -r 's/L<([^)]*)(\([0-9]\))?\|([^)]*)(\([0-9]\))?>/L<\1|\3>/g' \
+                       | pod2html --podroot=doc --htmlroot=.. --podpath=apps:crypto:ssl \
+                       | sed -r 's/<!DOCTYPE.*//g' \
+                       > $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir/$$fn.$(HTMLSUFFIX); \
+                       $(PERL) util/extract-names.pl < $$i | \
+                               grep -v $$filecase "^$$fn\$$" | \
+                               (cd $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \
+                                while read n; do \
+                                       $$here/util/point.sh $$fn.$(HTMLSUFFIX) "$$n".$(HTMLSUFFIX); \
+                                done); \
+               done; \
+       done
 
 install_docs:
        @$(PERL) $(TOP)/util/mkdir-p.pl \
@@ -556,39 +593,41 @@ install_docs:
        @pod2man="`cd util; ./pod2mantest $(PERL)`"; \
        here="`pwd`"; \
        filecase=; \
-       if [ "$(PLATFORM)" = "DJGPP" -o "$(PLATFORM)" = "Cygwin" ]; then \
+       if [ "$(PLATFORM)" = "DJGPP" -o "$(PLATFORM)" = "Cygwin" -o "$(PLATFORM)" = "mingw" ]; then \
                filecase=-i; \
        fi; \
-       for i in doc/apps/*.pod; do \
+       set -e; for i in doc/apps/*.pod; do \
                fn=`basename $$i .pod`; \
-               if [ "$$fn" = "config" ]; then sec=5; else sec=1; fi; \
-               echo "installing man$$sec/$$fn.$$sec"; \
+               sec=`$(PERL) util/extract-section.pl 1 < $$i`; \
+               echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \
                (cd `$(PERL) util/dirname.pl $$i`; \
                sh -c "$$pod2man \
                        --section=$$sec --center=OpenSSL \
                        --release=$(VERSION) `basename $$i`") \
-                       >  $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$$sec; \
+                       >  $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \
                $(PERL) util/extract-names.pl < $$i | \
-                       grep -v $$filecase "^$$fn\$$" | \
+                       (grep -v $$filecase "^$$fn\$$"; true) | \
+                       (grep -v "[     ]"; true) | \
                        (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \
                         while read n; do \
-                               $$here/util/point.sh $$fn.$$sec $$n.$$sec; \
+                               $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \
                         done); \
        done; \
-       for i in doc/crypto/*.pod doc/ssl/*.pod; do \
+       set -e; for i in doc/crypto/*.pod doc/ssl/*.pod; do \
                fn=`basename $$i .pod`; \
-               if [ "$$fn" = "des_modes" ]; then sec=7; else sec=3; fi; \
-               echo "installing man$$sec/$$fn.$$sec"; \
+               sec=`$(PERL) util/extract-section.pl 3 < $$i`; \
+               echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \
                (cd `$(PERL) util/dirname.pl $$i`; \
                sh -c "$$pod2man \
                        --section=$$sec --center=OpenSSL \
                        --release=$(VERSION) `basename $$i`") \
-                       >  $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$$sec; \
+                       >  $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \
                $(PERL) util/extract-names.pl < $$i | \
-                       grep -v $$filecase "^$$fn\$$" | \
+                       (grep -v $$filecase "^$$fn\$$"; true) | \
+                       (grep -v "[     ]"; true) | \
                        (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \
                         while read n; do \
-                               $$here/util/point.sh $$fn.$$sec $$n.$$sec; \
+                               $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \
                         done); \
        done