1# Makefile fragment - requires GNU make 2# 3# Copyright (c) 2019-2023, Arm Limited. 4# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 5 6S := $(srcdir)/math 7B := build/math 8 9math-lib-srcs := $(wildcard $(S)/*.[cS]) 10math-lib-srcs += $(wildcard $(S)/$(ARCH)/*.[cS]) 11 12math-test-srcs := \ 13 $(S)/test/mathtest.c \ 14 $(S)/test/mathbench.c \ 15 $(S)/test/ulp.c \ 16 17math-test-host-srcs := $(wildcard $(S)/test/rtest/*.[cS]) 18 19math-includes := $(patsubst $(S)/%,build/%,$(wildcard $(S)/include/*.h)) 20math-test-includes := $(patsubst $(S)/%,build/include/%,$(wildcard $(S)/test/*.h)) 21 22math-libs := \ 23 build/lib/libmathlib.so \ 24 build/lib/libmathlib.a \ 25 26math-tools := \ 27 build/bin/mathtest \ 28 build/bin/mathbench \ 29 build/bin/mathbench_libc \ 30 build/bin/runulp.sh \ 31 build/bin/ulp \ 32 33math-host-tools := \ 34 build/bin/rtest \ 35 36math-lib-objs := $(patsubst $(S)/%,$(B)/%.o,$(basename $(math-lib-srcs))) 37math-test-objs := $(patsubst $(S)/%,$(B)/%.o,$(basename $(math-test-srcs))) 38math-host-objs := $(patsubst $(S)/%,$(B)/%.o,$(basename $(math-test-host-srcs))) 39math-target-objs := $(math-lib-objs) $(math-test-objs) 40math-objs := $(math-target-objs) $(math-target-objs:%.o=%.os) $(math-host-objs) 41 42math-files := \ 43 $(math-objs) \ 44 $(math-libs) \ 45 $(math-tools) \ 46 $(math-host-tools) \ 47 $(math-includes) \ 48 $(math-test-includes) \ 49 50all-math: $(math-libs) $(math-tools) $(math-includes) $(math-test-includes) 51 52$(math-objs): $(math-includes) $(math-test-includes) 53$(math-objs): CFLAGS_ALL += $(math-cflags) 54$(B)/test/mathtest.o: CFLAGS_ALL += -fmath-errno 55$(math-host-objs): CC = $(HOST_CC) 56$(math-host-objs): CFLAGS_ALL = $(HOST_CFLAGS) 57 58$(B)/test/ulp.o: $(S)/test/ulp.h 59 60build/lib/libmathlib.so: $(math-lib-objs:%.o=%.os) 61 $(CC) $(CFLAGS_ALL) $(LDFLAGS) -shared -o $@ $^ 62 63build/lib/libmathlib.a: $(math-lib-objs) 64 rm -f $@ 65 $(AR) rc $@ $^ 66 $(RANLIB) $@ 67 68$(math-host-tools): HOST_LDLIBS += -lm -lmpfr -lmpc 69$(math-tools): LDLIBS += $(math-ldlibs) -lm 70# math-sve-cflags should be empty if WANT_SVE_MATH is not enabled 71$(math-tools): CFLAGS_ALL += $(math-sve-cflags) 72 73build/bin/rtest: $(math-host-objs) 74 $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ $^ $(HOST_LDLIBS) 75 76build/bin/mathtest: $(B)/test/mathtest.o build/lib/libmathlib.a 77 $(CC) $(CFLAGS_ALL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 78 79build/bin/mathbench: $(B)/test/mathbench.o build/lib/libmathlib.a 80 $(CC) $(CFLAGS_ALL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 81 82# This is not ideal, but allows custom symbols in mathbench to get resolved. 83build/bin/mathbench_libc: $(B)/test/mathbench.o build/lib/libmathlib.a 84 $(CC) $(CFLAGS_ALL) $(LDFLAGS) -static -o $@ $< $(LDLIBS) -lc build/lib/libmathlib.a -lm 85 86build/bin/ulp: $(B)/test/ulp.o build/lib/libmathlib.a 87 $(CC) $(CFLAGS_ALL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 88 89build/include/%.h: $(S)/include/%.h 90 cp $< $@ 91 92build/include/test/%.h: $(S)/test/%.h 93 cp $< $@ 94 95build/bin/%.sh: $(S)/test/%.sh 96 cp $< $@ 97 98math-tests := $(wildcard $(S)/test/testcases/directed/*.tst) 99math-rtests := $(wildcard $(S)/test/testcases/random/*.tst) 100 101check-math-test: $(math-tools) 102 cat $(math-tests) | $(EMULATOR) build/bin/mathtest $(math-testflags) 103 104check-math-rtest: $(math-host-tools) $(math-tools) 105 cat $(math-rtests) | build/bin/rtest | $(EMULATOR) build/bin/mathtest $(math-testflags) 106 107check-math-ulp: $(math-tools) 108 ULPFLAGS="$(math-ulpflags)" WANT_SIMD_EXCEPT="$(WANT_SIMD_EXCEPT)" build/bin/runulp.sh $(EMULATOR) 109 110check-math: check-math-test check-math-rtest check-math-ulp 111 112install-math: \ 113 $(math-libs:build/lib/%=$(DESTDIR)$(libdir)/%) \ 114 $(math-includes:build/include/%=$(DESTDIR)$(includedir)/%) 115 116clean-math: 117 rm -f $(math-files) 118 119.PHONY: all-math check-math-test check-math-rtest check-math-ulp check-math install-math clean-math 120