]> git.proxmox.com Git - ceph.git/blame - ceph/src/isa-l/make.inc
import quincy beta 17.1.0
[ceph.git] / ceph / src / isa-l / make.inc
CommitLineData
7c673cae 1########################################################################
f91f0fd5 2# Copyright(c) 2011-2018 Intel Corporation All rights reserved.
7c673cae
FG
3#
4# Redistribution and use in source and binary forms, with or without
f91f0fd5 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
20effc67 42version ?= 2.30.0
224ce89b
WB
43host_cpu ?= $(shell uname -m | sed -e 's/amd/x86_/')
44arch ?= $(shell uname | grep -v -e Linux -e BSD )
7c673cae 45
f91f0fd5
TL
46# aarch64 cpu arch = aarch64
47ifeq ($(host_cpu)_$(arch),aarch64_)
48 arch = aarch64
49endif
50
7c673cae 51CC = gcc
f91f0fd5 52AS = nasm
224ce89b 53AWK = awk
7c673cae
FG
54
55DEBUG = -g
56DEBUG_yasm = -g dwarf2
57DEBUG_nasm = -g
58
59# Default arch= build options
224ce89b 60CFLAGS_ = -Wall
7c673cae
FG
61ASFLAGS_ = -f elf64
62ARFLAGS_ = cr $@
63STRIP_gcc = strip -d -R .comment $@
64
65# arch=32 build options
66ASFLAGS_32 = -f elf32
67CFLAGS_32 = -m32
68ARFLAGS_32 = cr $@
69
70# arch=win64 build options
71ASFLAGS_win64 = -f win64
72CFLAGS_icl = -Qstd=c99
73ARFLAGS_win64 = -out:$@
74
75# arch=mingw build options
76ASFLAGS_mingw = -f win64
77ARFLAGS_mingw = cr $@
224ce89b
WB
78
79LDFLAGS_so = -Wl,-soname,$(soname)
7c673cae
FG
80
81ifeq ($(arch),mingw)
82 CC=x86_64-w64-mingw32-gcc
83 AR=x86_64-w64-mingw32-ar
f91f0fd5
TL
84 AS=yasm
85 LDFLAGS += -Wl,--force-exe-suffix
86 SIM=wine
87 EXT=.exe
88 CLEANFILES+=*.exe
7c673cae
FG
89endif
90
224ce89b
WB
91# arch=noarch build options
92ARFLAGS_noarch = cr $@
93ifeq ($(arch),noarch)
94 host_cpu=base_aliases
95endif
96
f91f0fd5
TL
97# arch=aarch64 build options
98ifeq ($(lib_debug),1)
99 ASFLAGS_aarch64 = -g -c
100else
101 ASFLAGS_aarch64 = -c
102endif
103
104ARFLAGS_aarch64 = cr $@
105ifeq ($(arch),aarch64)
106 AS=$(CC) -D__ASSEMBLY__
107 SIM=
108endif
109
224ce89b
WB
110ASFLAGS_Darwin = -f macho64 --prefix=_
111ARFLAGS_Darwin = -r $@
f91f0fd5 112ifeq ($(shell uname),Darwin)
224ce89b
WB
113 LDFLAGS_so =
114 STRIP_gcc =
115endif
7c673cae
FG
116
117INCLUDE = $(patsubst %,-I%/,$(subst :, ,$(VPATH)))
118CFLAGS = $(CFLAGS_$(arch)) $(CFLAGS_$(CC)) $(DEBUG) -O2 $(DEFINES) $(INCLUDE)
119ASFLAGS = $(ASFLAGS_$(arch)) $(ASFLAGS_$(CC)) $(DEBUG_$(AS)) $(DEFINES) $(INCLUDE)
120ARFLAGS = $(ARFLAGS_$(arch))
121DEFINES += $(addprefix -D , $D)
f91f0fd5
TL
122CLEANFILES += $(O) *.o *.a $(all_tests) $(bin_PROGRAMS) $(lib_name) $(so_lib_name) $(all_llvm_fuzz_tests)
123
124# set host_cpu=base_aliases for unsupported CPUs
125ifeq ($(filter aarch64 x86_%,$(host_cpu)),)
126 host_cpu=base_aliases
127endif
128
129other_tests += $(other_tests_$(host_cpu))
7c673cae 130
224ce89b 131lsrc += $(lsrc_$(host_cpu))
7c673cae 132O = bin
f91f0fd5 133lobj += $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(patsubst %.asm,%.o,$(lsrc) $(lsrc_intrinsic))))
7c673cae
FG
134objs = $(addprefix $(O)/,$(notdir $(lobj)))
135
136
137lib_name ?= isa-l.a
f91f0fd5 138default: lib slib progs
7c673cae
FG
139
140# Defaults for windows build
141ifeq ($(arch),win64)
142 AR=lib
143 CC=cl
144 OUTPUT_OPTION = -Fo$@
145 DEBUG=
146 lib_name := $(basename $(lib_name)).lib
147endif
148lsrcwin64 = $(lsrc)
149unit_testswin64 = $(unit_tests)
150exampleswin64 = $(examples)
151perf_testswin64 = $(perf_tests)
152
f91f0fd5 153
7c673cae 154# Build and run unit tests, performance tests, etc.
224ce89b
WB
155all_tests = $(notdir $(sort $(perf_tests) $(check_tests) $(unit_tests) $(examples) $(other_tests)))
156all_unit_tests = $(notdir $(sort $(check_tests) $(unit_tests)))
157all_perf_tests = $(notdir $(sort $(perf_tests)))
158all_check_tests = $(notdir $(sort $(check_tests)))
f91f0fd5 159all_llvm_fuzz_tests = $(notdir $(sort $(llvm_fuzz_tests)))
7c673cae
FG
160
161$(all_unit_tests): % : %.c $(lib_name)
162$(all_perf_tests): % : %.c $(lib_name)
224ce89b 163$(sort $(notdir $(examples))): % : %.c $(lib_name)
7c673cae
FG
164$(sort $(notdir $(other_tests))): % : %.c $(lib_name)
165
20effc67
TL
166fuzz_args = -fsanitize=fuzzer,address
167$(all_llvm_fuzz_tests): FUZZLINK = $(fuzz_args)
168$(all_llvm_fuzz_tests): CFLAGS += $(fuzz_args)
169$(all_llvm_fuzz_tests): CXXFLAGS += $(fuzz_args)
f91f0fd5
TL
170$(all_llvm_fuzz_tests): % : %.o $(lib_name)
171 $(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(FUZZLINK) -o $@
172
173
174# Check for modern as
175test-as = $(shell hash printf && printf $(3) > $(2) && $(AS) $(ASFLAGS) ${tmpf} -o /dev/null 2> /dev/null && echo $(1) || echo $(4))
176as_4 := "pblendvb xmm2, xmm1;"
177as_6 := "vinserti32x8 zmm0, ymm1, 1;"
178as_10 := "vpcompressb zmm0 {k1}, zmm1;"
179
180tmpf := $(shell mktemp)
181as_feature_level := $(call test-as, 4, $(tmpf), $(as_4), $(as_feature_level))
182as_feature_level := $(call test-as, 6, $(tmpf), $(as_6), $(as_feature_level))
183as_feature_level := $(call test-as, 10, $(tmpf), $(as_10), $(as_feature_level))
184tmpf := $(shell rm ${tmpf})
185
186ifneq ($(findstring $(as_feature_level),6 10),)
187 D_HAVE_AS_KNOWS_AVX512_y := -DHAVE_AS_KNOWS_AVX512
188endif
189
190CFLAGS += -DAS_FEATURE_LEVEL=$(as_feature_level) $(D_HAVE_AS_KNOWS_AVX512_y)
191ASFLAGS += -DAS_FEATURE_LEVEL=$(as_feature_level) $(D_HAVE_AS_KNOWS_AVX512_y)
192
193
194# Check for pthreads
195have_threads ?= $(shell printf "\#include <pthread.h>\nint main(void){return 0;}\n" | $(CC) -x c - -o /dev/null -lpthread && echo y )
196THREAD_LD_$(have_threads) := -lpthread
197THREAD_CFLAGS_$(have_threads) := -DHAVE_THREADS
198
199progs: $(bin_PROGRAMS)
200$(bin_PROGRAMS): CFLAGS += -DVERSION=\"$(version)\"
201$(bin_PROGRAMS): LDLIBS += $(THREAD_LD_y)
202$(bin_PROGRAMS): CFLAGS += $(THREAD_CFLAGS_y)
7c673cae
FG
203sim test trace: $(addsuffix .run,$(all_unit_tests))
204perf: $(addsuffix .run,$(all_perf_tests))
224ce89b
WB
205check: $(addsuffix .run,$(all_check_tests))
206ex: $(notdir $(examples))
7c673cae
FG
207all: lib $(all_tests)
208other: $(notdir $(other_tests))
f91f0fd5 209llvm_fuzz_tests: $(all_llvm_fuzz_tests)
7c673cae
FG
210tests: $(all_unit_tests)
211perfs: $(all_perf_tests)
224ce89b 212checks: $(all_check_tests)
f91f0fd5
TL
213trace: SIM=sde -debugtrace --
214sim: SIM=sde --
7c673cae
FG
215check test sim:
216 @echo Finished running $@
217
218$(objs): | $(O)
219$(O): ; mkdir -p $(O)
220
221# Build rule to run tests
222$(addsuffix .run,$(all_tests)): %.run : %
f91f0fd5 223 $(SIM) ./$<$(EXT)
7c673cae
FG
224 @echo Completed run: $<
225
226# Other build rules
224ce89b 227msg = $(if $(DEBUG),DEBUG) $(patsubst 32,32-bit,$(host_cpu)) $D
7c673cae 228
f91f0fd5 229# yasm/nasm assembly files
7c673cae
FG
230$(O)/%.o: %.asm
231 @echo " ---> Building $< $(msg)"
232 @$(AS) $(ASFLAGS) -o $@ $<
233
f91f0fd5
TL
234# gcc assembly files
235$(O)/%.o: $(host_cpu)/%.S
236 @echo " ---> Building $< $(msg)"
237 @$(AS) $(ASFLAGS) -o $@ $<
238
239$(O)/%.o : $(host_cpu)/%.c
240 @echo " ---> Building $< $(msg)"
241 @$(COMPILE.c) $(OUTPUT_OPTION) $<
7c673cae
FG
242$(O)/%.o %.o: %.c
243 @echo " ---> Building $< $(msg)"
244 @$(COMPILE.c) $(OUTPUT_OPTION) $<
245
246$(all_tests):
247 @echo " ---> Building Test $@ $(msg)"
248 @$(LINK.o) $(CFLAGS) $^ $(LDLIBS) -o $@
249
f91f0fd5
TL
250$(bin_PROGRAMS): % : %_cli.c $(lib_name)
251 @echo " ---> Building Programs $@ $(msg)"
252 @$(LINK.o) $(CFLAGS) $^ $(LDLIBS) -o $@
253
7c673cae
FG
254
255# Target to build lib files
256lib: $(lib_name)
257ifneq ($(lib_debug),1)
258 $(lib_name): DEBUG_$(AS)= # Don't put debug symbols in the lib
259 $(lib_name): DEBUG=
260 $(lib_name): DEFINES+=-D NDEBUG
261endif
262ifeq ($(lib_debug),1)
263 DEBUG+=-D DEBUG # Define DEBUG for macros
264endif
265
266#lib $(lib_name): $(lib_name)(${objs})
267$(lib_name): $(objs)
268 @echo " ---> Creating Lib $@"
269 @$(AR) $(ARFLAGS) $^
f91f0fd5 270ifneq ($(lib_debug),1)
7c673cae 271 @$(STRIP_$(CC))
f91f0fd5 272endif
7c673cae
FG
273
274
275# Target for shared lib
276so_lib_name = bin/libisal.so
277so_lib_inst = $(notdir $(so_lib_name))
278so_lib_ver = $(so_lib_inst).$(version)
279soname = $(so_lib_inst).$(word 1, $(subst ., ,$(version)))
280
281slib: $(so_lib_name)
224ce89b 282aobjs += $(addprefix $(O)/,$(patsubst %.asm,%.o,$(filter %.asm,$(notdir $(lsrc) $(lsrc_intrinsic)))))
f91f0fd5 283aobjs += $(addprefix $(O)/,$(patsubst %.S,%.o,$(filter %.S,$(notdir $(lsrc) $(lsrc_intrinsic)))))
224ce89b 284shared_objs += $(addprefix $(O)/shared_ver_,$(patsubst %.c,%.o,$(filter %.c,$(notdir $(lsrc) $(lsrc_intrinsic)))))
7c673cae
FG
285
286$(O)/shared_ver_%.o: %.c
287 @echo " ---> Building shared $< $(msg)"
288 @$(COMPILE.c) $(OUTPUT_OPTION) $<
f91f0fd5
TL
289$(O)/shared_ver_%.o: $(host_cpu)/%.c
290 @echo " ---> Building shared $< $(msg)"
291 @$(COMPILE.c) $(OUTPUT_OPTION) $<
7c673cae
FG
292ifneq ($(lib_debug),1)
293 $(so_lib_name): DEBUG_$(AS)=
294 $(so_lib_name): DEBUG=
295 $(so_lib_name): DEFINES+=-D NDEBUG
296endif
297
298$(shared_objs): CFLAGS += -fPIC
299$(shared_objs) $(aobjs): | $(O)
224ce89b 300$(so_lib_name): LDFLAGS+=$(LDFLAGS_so)
7c673cae
FG
301$(so_lib_name): $(shared_objs) $(aobjs)
302 @echo " ---> Creating Shared Lib $@"
303 @$(CC) $(CFLAGS) --shared $(LDFLAGS) -o $@ $^
304 @(cd $(@D); ln -f -s $(so_lib_inst) $(soname))
305
224ce89b
WB
306
307isa-l.h:
308 @echo 'Building $@'
309 @echo '' >> $@
f91f0fd5
TL
310 @echo '/**' >> $@
311 @echo ' * @file isa-l.h' >> $@
312 @echo ' * @brief Include for ISA-L library' >> $@
313 @echo ' */' >> $@
314 @echo '' >> $@
224ce89b
WB
315 @echo '#ifndef _ISAL_H_' >> $@
316 @echo '#define _ISAL_H_' >> $@
317 @echo '' >> $@
318 @echo '#define.ISAL_MAJOR_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$3}' >> $@
319 @echo '#define.ISAL_MINOR_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$4}' >> $@
320 @echo '#define.ISAL_PATCH_VERSION.${version}' | ${AWK} -F . '{print $$1, $$2, $$5}' >> $@
321 @echo '#define ISAL_MAKE_VERSION(maj, min, patch) ((maj) * 0x10000 + (min) * 0x100 + (patch))' >> $@
322 @echo '#define ISAL_VERSION ISAL_MAKE_VERSION(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION)' >> $@
323 @echo '' >> $@
324 @for unit in $(sort $(extern_hdrs)); do echo "#include <isa-l/$$unit>" | sed -e 's;include/;;' >> $@; done
325 @echo '#endif //_ISAL_H_' >> $@
326
327
7c673cae
FG
328# Target for install
329prefix = /usr/local
f91f0fd5
TL
330man1dir ?= $(prefix)/share/man/man1
331install_dirs = $(prefix)/lib $(prefix)/include/isa-l $(prefix)/bin $(man1dir)
7c673cae 332$(install_dirs): ; mkdir -p $@
f91f0fd5 333install: $(sort $(extern_hdrs)) | $(install_dirs) $(lib_name) $(so_lib_name) isa-l.h $(bin_PROGRAMS)
7c673cae
FG
334 install -m 644 $(lib_name) $(prefix)/lib/libisal.a
335 install -m 644 $^ $(prefix)/include/isa-l/.
224ce89b
WB
336 install -m 664 isa-l.h $(prefix)/include/.
337 install -m 664 include/types.h $(prefix)/include/isa-l/.
7c673cae
FG
338 install -m 664 $(so_lib_name) $(prefix)/lib/$(so_lib_ver)
339 (cd $(prefix)/lib && ln -f -s $(so_lib_ver) $(soname) && ln -f -s $(so_lib_ver) $(so_lib_inst))
340ifeq ($(shell uname),Darwin)
341 (cd $(prefix)/lib && ln -f -s $(so_lib_ver) $(basename $(so_lib_inst)).dylib)
224ce89b
WB
342 which glibtool && glibtool --mode=finish $(prefix)/lib
343else
7c673cae
FG
344 which libtool && libtool --mode=finish $(prefix)/lib || \
345 echo 'Lib installed at $(prefix)/lib. Run system-dependent programs to add shared lib path.'
224ce89b 346endif
f91f0fd5
TL
347 install -m 774 $(bin_PROGRAMS) $(prefix)/bin/.
348 install -m 664 $(dist_man_MANS) $(man1dir)/.
7c673cae
FG
349
350uninstall:
351 $(RM) $(prefix)/lib/libisal.a
352 $(RM) $(prefix)/lib/$(soname)
353 $(RM) $(prefix)/lib/$(so_lib_ver)
354 $(RM) $(prefix)/lib/$(so_lib_inst)
355 $(RM) -r $(prefix)/include/isa-l
356 $(RM) $(prefix)/include/isa-l.h
357 $(RM) $(prefix)/lib/$(basename $(so_lib_inst)).dylib
f91f0fd5
TL
358 $(RM) $(prefix)/bin/$(notdir $(bin_PROGRAMS))
359 $(RM) $(man1dir)/$(notdir $(dist_man_MANS))
7c673cae
FG
360
361# Collect performance data
362rpt_name = perf_report_$(shell uname -n)_$(shell date +%y%m%d).perf
363
364perf_report:
365 echo Results for $(rpt_name) >> $(rpt_name)
366 $(MAKE) -f Makefile.unx -k perf | tee -a $(rpt_name)
367 @echo Summary:
368 -grep runtime $(rpt_name)
369
370
371clean:
372 @echo Cleaning up
f91f0fd5 373 @$(RM) -r $(CLEANFILES)
7c673cae
FG
374
375
224ce89b
WB
376doc: isa-l.h
377 (cat Doxyfile; echo 'PROJECT_NUMBER=$(version)') | doxygen -
378 $(MAKE) -C generated_doc/latex &> generated_doc/latex_build_api.log
379 cp generated_doc/latex/refman.pdf isa-l_api_$(version).pdf
7c673cae 380