Use common source files for FIPS mode and utilize same optimizations.
[oweals/openssl.git] / fips-1.0 / Makefile
1 #
2 # OpenSSL/crypto/Makefile
3 #
4
5 DIR=            fips-1.0
6 TOP=            ..
7 CC=             cc
8 INCLUDE=        -I. -I$(TOP) -I../include
9 # INCLUDES targets sudbirs!
10 INCLUDES=       -I.. -I../.. -I../../include
11 CFLAG=          -g
12 MAKEDEPPROG=    makedepend
13 MAKEDEPEND=     $(TOP)/util/domd $(TOP) -MD $(MAKEDEPPROG)
14 MAKEFILE=       Makefile
15 RM=             rm -f
16 AR=             ar r
17 ARD=            ar d
18 TEST=           fips_test_suite.c
19 FIPS_TVDIR=     testvectors
20 FIPS_TVOK=      $$HOME/fips/tv.ok
21
22 FIPSCANLOC=     $(FIPSLIBDIR)fipscanister.o
23
24 RECURSIVE_MAKE= [ -n "$(FDIRS)" ] && for i in $(FDIRS) ; do \
25                     (cd $$i && echo "making $$target in $(DIR)/$$i..." && \
26                     $(MAKE) -e TOP=../.. DIR=$$i INCLUDES='${INCLUDES}' $$target ) || exit 1; \
27                 done;
28
29 PEX_LIBS=
30 EX_LIBS=
31  
32 CFLAGS= $(INCLUDE) $(CFLAG) -DHMAC_EXT=\"$${HMAC_EXT:-sha1}\"
33 ASFLAGS= $(INCLUDE) $(ASFLAG)
34 AFLAGS=$(ASFLAGS)
35
36 LIBS=
37
38 FDIRS=sha rand des aes dsa rsa dh hmac
39
40 GENERAL=Makefile README fips-lib.com install.com
41
42 LIB= $(TOP)/libcrypto.a
43 SHARED_LIB= $(FIPSCANLIB)$(SHLIB_EXT)
44 LIBSRC=fips.c 
45 LIBOBJ=fips.o
46
47 FIPS_OBJ_LISTS=sha/lib hmac/lib rand/lib des/lib aes/lib dsa/lib rsa/lib dh/lib
48
49 SRC= $(LIBSRC)
50
51 EXHEADER=fips.h
52 HEADER=$(EXHEADER) fips_utl.h
53 EXE=fipsld
54
55 ALL=    $(GENERAL) $(SRC) $(HEADER)
56
57 top:
58         @(cd ..; $(MAKE) DIRS=$(DIR) all)
59
60 testapps:
61         @if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi
62
63 all:
64         @if [ -n "$(FIPSCANLIB)" ]; then \
65                 $(MAKE) -e subdirs lib shared; \
66         fi
67
68 # Idea behind fipscanister.o is to "seize" the sequestered code between
69 # known symbols for fingerprinting purposes, which would be commonly
70 # done with ld -r start.o ... end.o. The latter however presents a minor
71 # challenge on multi-ABI platforms. As just implied, we'd rather use ld,
72 # but the trouble is that we don't generally know how ABI-selection
73 # compiler flag is translated to corresponding linker flag. All compiler
74 # drivers seem to recognize -r flag and pass it down to linker, but some
75 # of them, including gcc, erroneously add -lc, as well as run-time
76 # components, such as crt1.o and alike. Fortunately among those vendor
77 # compilers which were observed to misinterpret -r flag multi-ABI ones
78 # are equipped with smart linkers, which don't require any ABI-selection
79 # flag and simply assume that all objects are of the same type as first
80 # one in command line. So the idea is to identify gcc and deficient
81 # vendor compiler drivers...
82
83 fipscanister.o: fips_start.o $(LIBOBJ) $(FIPS_OBJ_LISTS) fips_end.o
84         FIPS_ASM=""; for i in $(BN_ASM) ; do FIPS_ASM="$$FIPS_ASM ../crypto/bn/$$i" ; done; \
85         for i in $(AES_ASM_OBJ) ; do FIPS_ASM="$$FIPS_ASM ../crypto/aes/$$i" ; done; \
86         for i in $(DES_ENC) ; do FIPS_ASM="$$FIPS_ASM ../crypto/des/$$i" ; done; \
87         for i in $(SHA1_ASM_OBJ) ; do FIPS_ASM="$$FIPS_ASM ../crypto/sha/$$i" ; done; \
88         if [ -n "$(CPUID_OBJ)" ]; then \
89                 CPUID=../crypto/$(CPUID_OBJ) ; \
90         else \
91                 CPUID="" ; \
92         fi ; \
93         objs="fips_start.o $(LIBOBJ) $(FIPS_EX_OBJ) $$CPUID $$FIPS_ASM"; \
94         for i in $(FIPS_OBJ_LISTS); do \
95                 dir=`dirname $$i`; script="s|^|$$dir/|;s| | $$dir/|g"; \
96                 objs="$$objs `sed "$$script" $$i`"; \
97         done; \
98         objs="$$objs fips_end.o" ; \
99         if [ -n "${FIPS_SITE_LD}" ]; then \
100                 set -x; ${FIPS_SITE_LD} -r -o $@ $$objs; \
101         elif $(CC) -dumpversion >/dev/null 2>&1; then \
102                 set -x; $(CC) $(CFLAGS) -r -nostdlib -o $@ $$objs ; \
103         else case "`(uname -s) 2>/dev/null`" in \
104                 HP-UX|OSF1|SunOS) set -x; /usr/ccs/bin/ld -r -o $@ $$objs ;; \
105                 AIX) set -x; $(CC) $(CFLAGS) -Wl,-bnoobjreorder -r -o $@ $$objs ;; \
106                 *) set -x; $(CC) $(CFLAGS) -r -o $@ $$objs ;; \
107         esac fi
108         sha/fips_standalone_sha1 fipscanister.o > fipscanister.o.sha1
109
110 # If another exception is immediately required, assign approprite
111 # site-specific ld command to FIPS_SITE_LD environment variable.
112
113 fips_start.o: fips_canister.c
114         $(CC) $(CFLAGS) -DFIPS_START -c -o $@ fips_canister.c
115 fips_end.o: fips_canister.c
116         $(CC) $(CFLAGS) -DFIPS_END -c -o $@ fips_canister.c
117 fips_premain_dso$(EXE_EXT): fips_premain.c
118         $(CC) $(CFLAGS) -DFINGERPRINT_PREMAIN_DSO_LOAD -o $@ fips_premain.c \
119                 ../libcrypto.a $(EX_LIBS)
120
121 subdirs:
122         @target=all; $(RECURSIVE_MAKE)
123
124 files:
125         $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
126         @target=files; $(RECURSIVE_MAKE)
127
128 links:
129         @$(PERL) $(TOP)/util/mklink.pl ../include/openssl $(EXHEADER)
130         @$(PERL) $(TOP)/util/mklink.pl ../test $(TEST)
131         @target=links; $(RECURSIVE_MAKE)
132
133 # lib: and $(LIB): are splitted to avoid end-less loop
134 lib:    $(FIPSCANLIB) $(FIPSCANLOC)
135         @touch lib
136
137 $(FIPSCANLIB):  $(FIPSCANLOC)
138         $(AR) ../$(FIPSCANLIB).a $(FIPSCANLOC)
139         if [ "$(FIPSCANLIB)" = "libfips" ]; then \
140                 $(AR) $(LIB) $(FIPSCANLOC) ; \
141                 $(RANLIB) $(LIB) || echo Never Mind. ; \
142         fi
143         $(RANLIB) ../$(FIPSCANLIB).a || echo Never mind.
144         @touch lib
145
146 shared: lib subdirs fips_premain_dso$(EXE_EXT)
147
148 libs:
149         @target=lib; $(RECURSIVE_MAKE)
150
151 fips_test: top
152         @target=fips_test; $(RECURSIVE_MAKE)
153
154 fips_test_diff:
155         @if diff -b -B -I '^\#' -cr -X fips-nodiff.txt $(FIPS_TVDIR) $(FIPS_TVOK) ; then \
156                 echo "FIPS diff OK" ; \
157         else \
158                 echo "***FIPS DIFF ERROR***" ; exit 1 ; \
159         fi
160
161
162 install:
163         @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile...
164         @headerlist="$(EXHEADER)"; for i in $$headerlist ;\
165         do \
166         (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
167         chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
168         done;
169         @target=install; $(RECURSIVE_MAKE)
170
171 lint:
172         @target=lint; $(RECURSIVE_MAKE)
173
174 depend:
175         @[ -z "$(THIS)" ] || $(MAKEDEPEND) -- $(CFLAG) $(INCLUDE) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
176         @[ -z "$(THIS)" ] || (set -e; target=depend; $(RECURSIVE_MAKE) )
177         @if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi
178
179 clean:
180         rm -f fipscanister.o.sha1 fips_premain_dso$(EXE_EXT) \
181                 *.s *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
182         @target=clean; $(RECURSIVE_MAKE)
183
184 dclean:
185         $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
186         mv -f Makefile.new $(MAKEFILE)
187         @target=dclean; $(RECURSIVE_MAKE)
188
189 # DO NOT DELETE THIS LINE -- make depend depends on it.
190
191 fips.o: ../include/openssl/asn1.h ../include/openssl/bio.h
192 fips.o: ../include/openssl/crypto.h ../include/openssl/des.h
193 fips.o: ../include/openssl/des_old.h ../include/openssl/e_os2.h
194 fips.o: ../include/openssl/err.h ../include/openssl/evp.h
195 fips.o: ../include/openssl/fips.h ../include/openssl/fips_rand.h
196 fips.o: ../include/openssl/hmac.h ../include/openssl/lhash.h
197 fips.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h
198 fips.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
199 fips.o: ../include/openssl/ossl_typ.h ../include/openssl/rand.h
200 fips.o: ../include/openssl/safestack.h ../include/openssl/stack.h
201 fips.o: ../include/openssl/symhacks.h ../include/openssl/ui.h
202 fips.o: ../include/openssl/ui_compat.h fips.c fips_locl.h