]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | ######################################################################## |
2 | # Copyright(c) 2011-2016 Intel Corporation All rights reserved. | |
3 | # | |
4 | # Redistribution and use in source and binary forms, with or without | |
1e59de90 | 5 | # modification, are permitted provided that the following conditions |
7c673cae FG |
6 | # are met: |
7 | # * Redistributions of source code must retain the above copyright | |
8 | # notice, this list of conditions and the following disclaimer. | |
9 | # * Redistributions in binary form must reproduce the above copyright | |
10 | # notice, this list of conditions and the following disclaimer in | |
11 | # the documentation and/or other materials provided with the | |
12 | # distribution. | |
13 | # * Neither the name of Intel Corporation nor the names of its | |
14 | # contributors may be used to endorse or promote products derived | |
15 | # from this software without specific prior written permission. | |
16 | # | |
17 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
18 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
19 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
20 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
21 | # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
22 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
23 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
24 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
25 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
26 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
27 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 | ######################################################################## | |
29 | ||
30 | ||
31 | # Makefile include for optimized libraries | |
32 | # make targets: | |
33 | # lib - build library of optimized functions | |
34 | # slib - build shared library | |
35 | # test - run unit tests of functions | |
36 | # perf - run performance tests | |
37 | # install - install headers and libs to system location | |
38 | # sim - run on simulator | |
39 | # trace - get simulator trace | |
40 | # clean - remove object files | |
41 | ||
1e59de90 TL |
42 | version ?= 2.24.0 |
43 | ||
44 | ||
7c673cae FG |
45 | |
46 | CC = gcc | |
1e59de90 TL |
47 | AS = nasm |
48 | AWK = awk | |
7c673cae FG |
49 | |
50 | DEBUG = -g | |
51 | DEBUG_yasm = -g dwarf2 | |
52 | DEBUG_nasm = -g | |
53 | ||
54 | # Default arch= build options | |
1e59de90 | 55 | CFLAGS_ = -Wall |
7c673cae FG |
56 | ASFLAGS_ = -f elf64 |
57 | ARFLAGS_ = cr $@ | |
58 | STRIP_gcc = strip -d -R .comment $@ | |
59 | ||
60 | # arch=32 build options | |
61 | ASFLAGS_32 = -f elf32 | |
62 | CFLAGS_32 = -m32 | |
63 | ARFLAGS_32 = cr $@ | |
64 | ||
65 | # arch=win64 build options | |
66 | ASFLAGS_win64 = -f win64 | |
67 | CFLAGS_icl = -Qstd=c99 | |
68 | ARFLAGS_win64 = -out:$@ | |
69 | ||
70 | # arch=mingw build options | |
71 | ASFLAGS_mingw = -f win64 | |
72 | ARFLAGS_mingw = cr $@ | |
1e59de90 TL |
73 | |
74 | LDFLAGS_so = -Wl,-soname,$(soname) | |
7c673cae FG |
75 | |
76 | ifeq ($(arch),mingw) | |
77 | CC=x86_64-w64-mingw32-gcc | |
78 | AR=x86_64-w64-mingw32-ar | |
1e59de90 TL |
79 | LDFLAGS += -Wl,--force-exe-suffix |
80 | SIM=wine | |
81 | EXT=.exe | |
82 | CLEANFILES+=*.exe | |
83 | endif | |
84 | ||
85 | ASFLAGS_Darwin = -f macho64 --prefix=_ | |
86 | ARFLAGS_Darwin = -r $@ | |
87 | ifeq ($(shell uname),Darwin) | |
88 | LDFLAGS_so = | |
89 | STRIP_gcc = | |
7c673cae FG |
90 | endif |
91 | ||
1e59de90 TL |
92 | # arch=aarch64 build options |
93 | ifeq ($(lib_debug),1) | |
94 | ASFLAGS_aarch64 = -g -c | |
95 | else | |
96 | ASFLAGS_aarch64 = -c | |
97 | endif | |
7c673cae | 98 | |
1e59de90 TL |
99 | ARFLAGS_aarch64 = cr $@ |
100 | ifeq ($(arch),aarch64) | |
101 | AS=$(CC) -D__ASSEMBLY__ | |
102 | SIM= | |
103 | endif | |
104 | # arch=noarch build options | |
105 | ARFLAGS_noarch = cr $@ | |
106 | CFLAGS_noarch= -DNOARCH | |
107 | ifeq ($(arch),noarch) | |
108 | host_cpu=base_aliases | |
109 | endif | |
7c673cae FG |
110 | INCLUDE = $(patsubst %,-I%/,$(subst :, ,$(VPATH))) |
111 | CFLAGS = $(CFLAGS_$(arch)) $(CFLAGS_$(CC)) $(DEBUG) -O2 $(DEFINES) $(INCLUDE) | |
112 | ASFLAGS = $(ASFLAGS_$(arch)) $(ASFLAGS_$(CC)) $(DEBUG_$(AS)) $(DEFINES) $(INCLUDE) | |
113 | ARFLAGS = $(ARFLAGS_$(arch)) | |
114 | DEFINES += $(addprefix -D , $D) | |
1e59de90 | 115 | CLEANFILES += $(O) *.o *.a $(all_tests) $(lib_name) $(so_lib_name) |
7c673cae | 116 | |
1e59de90 TL |
117 | ifeq ($(filter aarch64 x86_%,$(host_cpu)),) |
118 | host_cpu=base_aliases | |
119 | endif | |
120 | lsrc += $(lsrc_$(host_cpu)) | |
7c673cae | 121 | O = bin |
1e59de90 | 122 | lobj += $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(patsubst %.asm,%.o,$(lsrc) $(lsrc_intrinsic)))) |
7c673cae FG |
123 | objs = $(addprefix $(O)/,$(notdir $(lobj))) |
124 | ||
125 | ||
126 | lib_name ?= isa-l_crypto.a | |
127 | default: lib slib | |
128 | ||
129 | # Defaults for windows build | |
130 | ifeq ($(arch),win64) | |
131 | AR=lib | |
132 | CC=cl | |
133 | OUTPUT_OPTION = -Fo$@ | |
134 | DEBUG= | |
135 | lib_name := $(basename $(lib_name)).lib | |
136 | endif | |
137 | lsrcwin64 = $(lsrc) | |
138 | unit_testswin64 = $(unit_tests) | |
139 | exampleswin64 = $(examples) | |
140 | perf_testswin64 = $(perf_tests) | |
141 | ||
1e59de90 | 142 | |
7c673cae | 143 | # Build and run unit tests, performance tests, etc. |
1e59de90 TL |
144 | all_tests = $(notdir $(sort $(perf_tests) $(check_tests) $(unit_tests) $(examples) $(other_tests))) |
145 | all_unit_tests = $(notdir $(sort $(check_tests) $(unit_tests))) | |
146 | all_perf_tests = $(notdir $(sort $(perf_tests))) | |
147 | all_check_tests = $(notdir $(sort $(check_tests))) | |
7c673cae FG |
148 | |
149 | $(all_unit_tests): % : %.c $(lib_name) | |
150 | $(all_perf_tests): % : %.c $(lib_name) | |
1e59de90 | 151 | $(sort $(notdir $(examples))): % : %.c $(lib_name) |
7c673cae FG |
152 | $(sort $(notdir $(other_tests))): % : %.c $(lib_name) |
153 | ||
1e59de90 TL |
154 | # Check for modern as |
155 | test-as = $(shell hash printf && printf $(3) > $(2) && $(AS) $(ASFLAGS) ${tmpf} -o /dev/null 2> /dev/null && echo $(1) || echo $(4)) | |
156 | as_4 := "pblendvb xmm2, xmm1;" | |
157 | as_6 := "vinserti32x8 zmm0, ymm1, 1;" | |
158 | as_10 := "vpcompressb zmm0 {k1}, zmm1;" | |
159 | ||
160 | tmpf := $(shell mktemp) | |
161 | as_feature_level := $(call test-as, 4, $(tmpf), $(as_4), $(as_feature_level)) | |
162 | as_feature_level := $(call test-as, 6, $(tmpf), $(as_6), $(as_feature_level)) | |
163 | as_feature_level := $(call test-as, 10, $(tmpf), $(as_10), $(as_feature_level)) | |
164 | tmpf := $(shell rm ${tmpf}) | |
165 | ||
166 | ifneq ($(findstring $(as_feature_level),6 10),) | |
167 | D_HAVE_AS_KNOWS_AVX512_y := -DHAVE_AS_KNOWS_AVX512 | |
168 | endif | |
169 | ||
170 | CFLAGS += -DAS_FEATURE_LEVEL=$(as_feature_level) $(D_HAVE_AS_KNOWS_AVX512_y) | |
171 | ASFLAGS += -DAS_FEATURE_LEVEL=$(as_feature_level) $(D_HAVE_AS_KNOWS_AVX512_y) | |
172 | ||
7c673cae FG |
173 | sim test trace: $(addsuffix .run,$(all_unit_tests)) |
174 | perf: $(addsuffix .run,$(all_perf_tests)) | |
1e59de90 TL |
175 | check: $(addsuffix .run,$(all_check_tests)) |
176 | ex: $(notdir $(examples)) | |
7c673cae FG |
177 | all: lib $(all_tests) |
178 | other: $(notdir $(other_tests)) | |
179 | tests: $(all_unit_tests) | |
180 | perfs: $(all_perf_tests) | |
1e59de90 TL |
181 | checks: $(all_check_tests) |
182 | trace: SIM=sde -debugtrace -- | |
183 | sim: SIM=sde -- | |
7c673cae FG |
184 | check test sim: |
185 | @echo Finished running $@ | |
186 | ||
187 | $(objs): | $(O) | |
188 | $(O): ; mkdir -p $(O) | |
189 | ||
190 | # Build rule to run tests | |
191 | $(addsuffix .run,$(all_tests)): %.run : % | |
1e59de90 | 192 | $(SIM) ./$<$(EXT) |
7c673cae FG |
193 | @echo Completed run: $< |
194 | ||
195 | # Other build rules | |
1e59de90 TL |
196 | msg = $(if $(DEBUG),DEBUG) $(patsubst 32,32-bit,$(host_cpu)) $D |
197 | ||
198 | # gcc assembly files | |
199 | $(O)/%.o: $(host_cpu)/%.S | |
200 | @echo " ---> Building $< $(msg)" | |
201 | @$(AS) $(ASFLAGS) -o $@ $< | |
7c673cae | 202 | |
1e59de90 TL |
203 | $(O)/%.o : $(host_cpu)/%.c |
204 | @echo " ---> Building $< $(msg)" | |
205 | @$(COMPILE.c) $(OUTPUT_OPTION) $< | |
206 | # yasm/nasm assembly files | |
7c673cae FG |
207 | $(O)/%.o: %.asm |
208 | @echo " ---> Building $< $(msg)" | |
209 | @$(AS) $(ASFLAGS) -o $@ $< | |
210 | ||
1e59de90 | 211 | |
7c673cae FG |
212 | $(O)/%.o %.o: %.c |
213 | @echo " ---> Building $< $(msg)" | |
214 | @$(COMPILE.c) $(OUTPUT_OPTION) $< | |
215 | ||
216 | $(all_tests): | |
217 | @echo " ---> Building Test $@ $(msg)" | |
218 | @$(LINK.o) $(CFLAGS) $^ $(LDLIBS) -o $@ | |
219 | ||
220 | ||
221 | # Target to build lib files | |
222 | lib: $(lib_name) | |
223 | ifneq ($(lib_debug),1) | |
224 | $(lib_name): DEBUG_$(AS)= # Don't put debug symbols in the lib | |
225 | $(lib_name): DEBUG= | |
226 | $(lib_name): DEFINES+=-D NDEBUG | |
227 | endif | |
228 | ifeq ($(lib_debug),1) | |
229 | DEBUG+=-D DEBUG # Define DEBUG for macros | |
230 | endif | |
231 | ||
232 | #lib $(lib_name): $(lib_name)(${objs}) | |
233 | $(lib_name): $(objs) | |
234 | @echo " ---> Creating Lib $@" | |
235 | @$(AR) $(ARFLAGS) $^ | |
1e59de90 | 236 | ifneq ($(lib_debug),1) |
7c673cae | 237 | @$(STRIP_$(CC)) |
1e59de90 | 238 | endif |
7c673cae FG |
239 | |
240 | ||
241 | # Target for shared lib | |
242 | so_lib_name = bin/libisal_crypto.so | |
243 | so_lib_inst = $(notdir $(so_lib_name)) | |
244 | so_lib_ver = $(so_lib_inst).$(version) | |
245 | soname = $(so_lib_inst).$(word 1, $(subst ., ,$(version))) | |
246 | ||
247 | slib: $(so_lib_name) | |
1e59de90 TL |
248 | aobjs += $(addprefix $(O)/,$(patsubst %.asm,%.o,$(filter %.asm,$(notdir $(lsrc) $(lsrc_intrinsic))))) |
249 | aobjs += $(addprefix $(O)/,$(patsubst %.S,%.o,$(filter %.S,$(notdir $(lsrc) $(lsrc_intrinsic))))) | |
250 | shared_objs += $(addprefix $(O)/shared_ver_,$(patsubst %.c,%.o,$(filter %.c,$(notdir $(lsrc) $(lsrc_intrinsic))))) | |
7c673cae FG |
251 | |
252 | $(O)/shared_ver_%.o: %.c | |
253 | @echo " ---> Building shared $< $(msg)" | |
254 | @$(COMPILE.c) $(OUTPUT_OPTION) $< | |
255 | ||
1e59de90 TL |
256 | $(O)/shared_ver_%.o: $(host_cpu)/%.c |
257 | @echo " ---> Building shared $< $(msg)" | |
258 | @$(COMPILE.c) $(OUTPUT_OPTION) $< | |
7c673cae FG |
259 | ifneq ($(lib_debug),1) |
260 | $(so_lib_name): DEBUG_$(AS)= | |
261 | $(so_lib_name): DEBUG= | |
262 | $(so_lib_name): DEFINES+=-D NDEBUG | |
263 | endif | |
264 | ||
265 | $(shared_objs): CFLAGS += -fPIC | |
266 | $(shared_objs) $(aobjs): | $(O) | |
1e59de90 | 267 | $(so_lib_name): LDFLAGS+=$(LDFLAGS_so) |
7c673cae FG |
268 | $(so_lib_name): $(shared_objs) $(aobjs) |
269 | @echo " ---> Creating Shared Lib $@" | |
270 | @$(CC) $(CFLAGS) --shared $(LDFLAGS) -o $@ $^ | |
271 | @(cd $(@D); ln -f -s $(so_lib_inst) $(soname)) | |
272 | ||
1e59de90 TL |
273 | isa-l_crypto.h: |
274 | @echo 'Building $@' | |
275 | @echo '' >> $@ | |
276 | @echo '/**' >> $@ | |
277 | @echo ' * @file isa-l_crypto.h'>> $@ | |
278 | @echo ' * @brief Include for ISA-L_crypto library' >> $@ | |
279 | @echo ' */' >> $@ | |
280 | @echo '' >> $@ | |
281 | @echo '#ifndef _ISAL_CRYPTO_H_' >> $@ | |
282 | @echo '#define _ISAL_CRYPTO_H_' >> $@ | |
283 | @echo '' >> $@ | |
284 | @echo '#define.ISAL_CRYPTO_MAJOR_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$3}' >> $@ | |
285 | @echo '#define.ISAL_CRYPTO_MINOR_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$4}' >> $@ | |
286 | @echo '#define.ISAL_CRYPTO_PATCH_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$5}' >> $@ | |
287 | @echo '#define ISAL_CRYPTO_MAKE_VERSION(maj, min, patch) ((maj) * 0x10000 + (min) * 0x100 + (patch))' >> $@ | |
288 | @echo '#define ISAL_CRYPTO_VERSION ISAL_CRYPTO_MAKE_VERSION(ISAL_CRYPTO_MAJOR_VERSION, ISAL_CRYPTO_MINOR_VERSION, ISAL_CRYPTO_PATCH_VERSION)' >> $@ | |
289 | @echo '' >> $@ | |
290 | @for unit in $(sort $(extern_hdrs)); do echo "#include <isa-l_crypto/$$unit>" | sed -e 's;include/;;' >> $@; done | |
291 | @echo '#endif //_ISAL_CRYPTO_H_' >> $@ | |
292 | ||
293 | ||
7c673cae FG |
294 | # Target for install |
295 | prefix = /usr/local | |
296 | install_dirs = $(prefix)/lib $(prefix)/include/isa-l_crypto | |
297 | $(install_dirs): ; mkdir -p $@ | |
298 | install: $(sort $(extern_hdrs)) | $(install_dirs) $(lib_name) $(so_lib_name) isa-l_crypto.h | |
299 | install -m 644 $(lib_name) $(prefix)/lib/libisal_crypto.a | |
300 | install -m 644 $^ $(prefix)/include/isa-l_crypto/. | |
1e59de90 TL |
301 | install -m 664 isa-l_crypto.h $(prefix)/include/. |
302 | install -m 664 include/types.h $(prefix)/include/isa-l_crypto/. | |
303 | install -m 664 include/endian_helper.h $(prefix)/include/isa-l_crypto/. | |
7c673cae FG |
304 | install -m 664 $(so_lib_name) $(prefix)/lib/$(so_lib_ver) |
305 | (cd $(prefix)/lib && ln -f -s $(so_lib_ver) $(soname) && ln -f -s $(so_lib_ver) $(so_lib_inst)) | |
306 | ifeq ($(shell uname),Darwin) | |
307 | (cd $(prefix)/lib && ln -f -s $(so_lib_ver) $(basename $(so_lib_inst)).dylib) | |
1e59de90 TL |
308 | which glibtool && glibtool --mode=finish $(prefix)/lib |
309 | else | |
7c673cae FG |
310 | which libtool && libtool --mode=finish $(prefix)/lib || \ |
311 | echo 'Lib installed at $(prefix)/lib. Run system-dependent programs to add shared lib path.' | |
1e59de90 | 312 | endif |
7c673cae FG |
313 | |
314 | uninstall: | |
315 | $(RM) $(prefix)/lib/libisal_crypto.a | |
316 | $(RM) $(prefix)/lib/$(soname) | |
317 | $(RM) $(prefix)/lib/$(so_lib_ver) | |
318 | $(RM) $(prefix)/lib/$(so_lib_inst) | |
319 | $(RM) -r $(prefix)/include/isa-l_crypto | |
320 | $(RM) $(prefix)/include/isa-l_crypto.h | |
321 | $(RM) $(prefix)/lib/$(basename $(so_lib_inst)).dylib | |
322 | ||
323 | # Collect performance data | |
324 | rpt_name = perf_report_$(shell uname -n)_$(shell date +%y%m%d).perf | |
325 | ||
326 | perf_report: | |
327 | echo Results for $(rpt_name) >> $(rpt_name) | |
328 | $(MAKE) -f Makefile.unx -k perf | tee -a $(rpt_name) | |
329 | @echo Summary: | |
330 | -grep runtime $(rpt_name) | |
331 | ||
332 | ||
333 | clean: | |
334 | @echo Cleaning up | |
1e59de90 TL |
335 | @$(RM) -r $(CLEANFILES) |
336 | ||
337 | doc: isa-l_crypto.h | |
338 | (cat Doxyfile; echo 'PROJECT_NUMBER=$(version)') | doxygen - | |
339 | $(MAKE) -C generated_doc/latex &> generated_doc/latex_build_api.log | |
340 | cp generated_doc/latex/refman.pdf isa-l_crypto_api_$(version).pdf |