1*412f47f9SXin Li# Makefile fragment - requires GNU make 2*412f47f9SXin Li# 3*412f47f9SXin Li# Copyright (c) 2019-2024, Arm Limited. 4*412f47f9SXin Li# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 5*412f47f9SXin Li 6*412f47f9SXin LiPLM := $(srcdir)/pl/math 7*412f47f9SXin LiAOR := $(srcdir)/math 8*412f47f9SXin LiB := build/pl/math 9*412f47f9SXin Li 10*412f47f9SXin Lipl-lib-srcs := $(wildcard $(PLM)/*.[cS]) 11*412f47f9SXin Li 12*412f47f9SXin Liifeq ($(WANT_SVE_MATH), 0) 13*412f47f9SXin Lipl-lib-srcs := $(filter-out $(PLM)/sv_%, $(pl-lib-srcs)) 14*412f47f9SXin Liendif 15*412f47f9SXin Li 16*412f47f9SXin Limath-test-srcs := \ 17*412f47f9SXin Li $(AOR)/test/mathtest.c \ 18*412f47f9SXin Li $(AOR)/test/mathbench.c \ 19*412f47f9SXin Li $(AOR)/test/ulp.c \ 20*412f47f9SXin Li 21*412f47f9SXin Limath-test-host-srcs := $(wildcard $(AOR)/test/rtest/*.[cS]) 22*412f47f9SXin Li 23*412f47f9SXin Lipl-includes := $(patsubst $(PLM)/%,build/pl/%,$(wildcard $(PLM)/include/*.h)) 24*412f47f9SXin Lipl-test-includes := $(patsubst $(PLM)/%,build/pl/include/%,$(wildcard $(PLM)/test/*.h)) 25*412f47f9SXin Li 26*412f47f9SXin Lipl-libs := \ 27*412f47f9SXin Li build/pl/lib/libmathlib.so \ 28*412f47f9SXin Li build/pl/lib/libmathlib.a \ 29*412f47f9SXin Li 30*412f47f9SXin Limath-tools := \ 31*412f47f9SXin Li build/pl/bin/mathtest \ 32*412f47f9SXin Li build/pl/bin/mathbench \ 33*412f47f9SXin Li build/pl/bin/mathbench_libc \ 34*412f47f9SXin Li build/pl/bin/runulp.sh \ 35*412f47f9SXin Li build/pl/bin/ulp \ 36*412f47f9SXin Li 37*412f47f9SXin Limath-host-tools := \ 38*412f47f9SXin Li build/pl/bin/rtest \ 39*412f47f9SXin Li 40*412f47f9SXin Lipl-lib-objs := $(patsubst $(PLM)/%,$(B)/%.o,$(basename $(pl-lib-srcs))) 41*412f47f9SXin Limath-test-objs := $(patsubst $(AOR)/%,$(B)/%.o,$(basename $(math-test-srcs))) 42*412f47f9SXin Limath-host-objs := $(patsubst $(AOR)/%,$(B)/%.o,$(basename $(math-test-host-srcs))) 43*412f47f9SXin Lipl-target-objs := $(pl-lib-objs) $(math-test-objs) 44*412f47f9SXin Lipl-objs := $(pl-target-objs) $(pl-target-objs:%.o=%.os) $(math-host-objs) 45*412f47f9SXin Li 46*412f47f9SXin Lipl/math-files := \ 47*412f47f9SXin Li $(pl-objs) \ 48*412f47f9SXin Li $(pl-libs) \ 49*412f47f9SXin Li $(math-tools) \ 50*412f47f9SXin Li $(math-host-tools) \ 51*412f47f9SXin Li $(pl-includes) \ 52*412f47f9SXin Li $(pl-test-includes) \ 53*412f47f9SXin Li 54*412f47f9SXin Liall-pl/math: $(pl-libs) $(math-tools) $(pl-includes) $(pl-test-includes) 55*412f47f9SXin Li 56*412f47f9SXin Li$(pl-objs): $(pl-includes) $(pl-test-includes) 57*412f47f9SXin Li$(pl-objs): CFLAGS_PL += $(math-cflags) 58*412f47f9SXin Li$(B)/test/mathtest.o: CFLAGS_PL += -fmath-errno 59*412f47f9SXin Li$(math-host-objs): CC = $(HOST_CC) 60*412f47f9SXin Li$(math-host-objs): CFLAGS_PL = $(HOST_CFLAGS) 61*412f47f9SXin Li 62*412f47f9SXin Li$(B)/sv_%: CFLAGS_PL += $(math-sve-cflags) 63*412f47f9SXin Li 64*412f47f9SXin Liulp-funcs-dir = build/pl/test/ulp-funcs/ 65*412f47f9SXin Liulp-wrappers-dir = build/pl/test/ulp-wrappers/ 66*412f47f9SXin Limathbench-funcs-dir = build/pl/test/mathbench-funcs/ 67*412f47f9SXin Liplsig-dirs = $(ulp-funcs-dir) $(ulp-wrappers-dir) $(mathbench-funcs-dir) 68*412f47f9SXin Li 69*412f47f9SXin Li$(plsig-dirs): 70*412f47f9SXin Li mkdir -p $@ 71*412f47f9SXin Li 72*412f47f9SXin Liulp-funcs = $(patsubst $(PLM)/%,$(ulp-funcs-dir)%,$(basename $(pl-lib-srcs))) 73*412f47f9SXin Liulp-wrappers = $(patsubst $(PLM)/%,$(ulp-wrappers-dir)%,$(basename $(pl-lib-srcs))) 74*412f47f9SXin Limathbench-funcs = $(patsubst $(PLM)/%,$(mathbench-funcs-dir)%,$(basename $(pl-lib-srcs))) 75*412f47f9SXin Liplsig-autogen-files = $(ulp-funcs) $(ulp-wrappers) $(mathbench-funcs) 76*412f47f9SXin Li 77*412f47f9SXin Li$(ulp-funcs): PLSIG_DIRECTIVE = EMIT_ULP_FUNCS 78*412f47f9SXin Li$(ulp-wrappers): PLSIG_DIRECTIVE = EMIT_ULP_WRAPPERS 79*412f47f9SXin Li$(mathbench-funcs): PLSIG_DIRECTIVE = EMIT_MATHBENCH_FUNCS 80*412f47f9SXin Li 81*412f47f9SXin Li.SECONDEXPANSION: 82*412f47f9SXin Li$(plsig-autogen-files): %: $(PLM)/$$(notdir $$@).c | $$(dir $$@) 83*412f47f9SXin Li $(CC) $< $(CFLAGS_PL) -D$(PLSIG_DIRECTIVE) -E -o - | { grep PL_SIG || true; } | cut -f 2- -d ' ' > $@ 84*412f47f9SXin Li 85*412f47f9SXin Libuild/pl/include/test/ulp_funcs_gen.h: $(ulp-funcs) 86*412f47f9SXin Li cat $^ | sort -u > $@ 87*412f47f9SXin Li 88*412f47f9SXin Libuild/pl/include/test/ulp_wrappers_gen.h: $(ulp-wrappers) 89*412f47f9SXin Li cat $^ > $@ 90*412f47f9SXin Li 91*412f47f9SXin Libuild/pl/include/test/mathbench_funcs_gen.h: $(mathbench-funcs) 92*412f47f9SXin Li cat $^ | sort -u > $@ 93*412f47f9SXin Li 94*412f47f9SXin Li$(B)/test/ulp.o: $(AOR)/test/ulp.h build/pl/include/test/ulp_funcs_gen.h build/pl/include/test/ulp_wrappers_gen.h 95*412f47f9SXin Li$(B)/test/ulp.o: CFLAGS_PL += -I build/pl/include/test 96*412f47f9SXin Li 97*412f47f9SXin Li$(B)/test/mathbench.o: build/pl/include/test/mathbench_funcs_gen.h 98*412f47f9SXin Li$(B)/test/mathbench.o: CFLAGS_PL += -I build/pl/include/test 99*412f47f9SXin Li 100*412f47f9SXin Libuild/pl/lib/libmathlib.so: $(pl-lib-objs:%.o=%.os) 101*412f47f9SXin Li $(CC) $(CFLAGS_PL) $(LDFLAGS) -shared -o $@ $^ 102*412f47f9SXin Li 103*412f47f9SXin Libuild/pl/lib/libmathlib.a: $(pl-lib-objs) 104*412f47f9SXin Li rm -f $@ 105*412f47f9SXin Li $(AR) rc $@ $^ 106*412f47f9SXin Li $(RANLIB) $@ 107*412f47f9SXin Li 108*412f47f9SXin Li$(math-host-tools): HOST_LDLIBS += -lm -lmpfr -lmpc 109*412f47f9SXin Li$(math-tools): LDLIBS += $(math-ldlibs) -lm 110*412f47f9SXin Li# math-sve-cflags should be empty if WANT_SVE_MATH is not enabled 111*412f47f9SXin Li$(math-tools): CFLAGS_PL += $(math-sve-cflags) 112*412f47f9SXin Li 113*412f47f9SXin Li# Some targets to build pl/math/test from math/test sources 114*412f47f9SXin Libuild/pl/math/test/%.o: $(srcdir)/math/test/%.S 115*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 116*412f47f9SXin Li 117*412f47f9SXin Libuild/pl/math/test/%.o: $(srcdir)/math/test/%.c 118*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 119*412f47f9SXin Li 120*412f47f9SXin Libuild/pl/math/test/%.os: $(srcdir)/math/test/%.S 121*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 122*412f47f9SXin Li 123*412f47f9SXin Libuild/pl/math/test/%.os: $(srcdir)/math/test/%.c 124*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 125*412f47f9SXin Li 126*412f47f9SXin Li# Some targets to build pl/ sources using appropriate flags 127*412f47f9SXin Libuild/pl/%.o: $(srcdir)/pl/%.S 128*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 129*412f47f9SXin Li 130*412f47f9SXin Libuild/pl/%.o: $(srcdir)/pl/%.c 131*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 132*412f47f9SXin Li 133*412f47f9SXin Libuild/pl/%.os: $(srcdir)/pl/%.S 134*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 135*412f47f9SXin Li 136*412f47f9SXin Libuild/pl/%.os: $(srcdir)/pl/%.c 137*412f47f9SXin Li $(CC) $(CFLAGS_PL) -c -o $@ $< 138*412f47f9SXin Li 139*412f47f9SXin Libuild/pl/bin/rtest: $(math-host-objs) 140*412f47f9SXin Li $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ $^ $(HOST_LDLIBS) 141*412f47f9SXin Li 142*412f47f9SXin Libuild/pl/bin/mathtest: $(B)/test/mathtest.o build/pl/lib/libmathlib.a 143*412f47f9SXin Li $(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 144*412f47f9SXin Li 145*412f47f9SXin Libuild/pl/bin/mathbench: $(B)/test/mathbench.o build/pl/lib/libmathlib.a 146*412f47f9SXin Li $(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 147*412f47f9SXin Li 148*412f47f9SXin Li# This is not ideal, but allows custom symbols in mathbench to get resolved. 149*412f47f9SXin Libuild/pl/bin/mathbench_libc: $(B)/test/mathbench.o build/pl/lib/libmathlib.a 150*412f47f9SXin Li $(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $< $(LDLIBS) -lc build/pl/lib/libmathlib.a -lm 151*412f47f9SXin Li 152*412f47f9SXin Libuild/pl/bin/ulp: $(B)/test/ulp.o build/pl/lib/libmathlib.a 153*412f47f9SXin Li $(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS) 154*412f47f9SXin Li 155*412f47f9SXin Libuild/pl/include/%.h: $(PLM)/include/%.h 156*412f47f9SXin Li cp $< $@ 157*412f47f9SXin Li 158*412f47f9SXin Libuild/pl/include/test/%.h: $(PLM)/test/%.h 159*412f47f9SXin Li cp $< $@ 160*412f47f9SXin Li 161*412f47f9SXin Libuild/pl/bin/%.sh: $(PLM)/test/%.sh 162*412f47f9SXin Li cp $< $@ 163*412f47f9SXin Li 164*412f47f9SXin Lipl-math-tests := $(wildcard $(PLM)/test/testcases/directed/*.tst) 165*412f47f9SXin Lipl-math-rtests := $(wildcard $(PLM)/test/testcases/random/*.tst) 166*412f47f9SXin Li 167*412f47f9SXin Licheck-pl/math-test: $(math-tools) 168*412f47f9SXin Li cat $(pl-math-tests) | $(EMULATOR) build/pl/bin/mathtest $(math-testflags) 169*412f47f9SXin Li 170*412f47f9SXin Licheck-pl/math-rtest: $(math-host-tools) $(math-tools) 171*412f47f9SXin Li cat $(pl-math-rtests) | build/pl/bin/rtest | $(EMULATOR) build/pl/bin/mathtest $(math-testflags) 172*412f47f9SXin Li 173*412f47f9SXin Liulp-input-dir=$(B)/test/inputs 174*412f47f9SXin Li$(ulp-input-dir): 175*412f47f9SXin Li mkdir -p $@ 176*412f47f9SXin Li 177*412f47f9SXin Limath-lib-lims = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.ulp,$(basename $(pl-lib-srcs))) 178*412f47f9SXin Limath-lib-fenvs = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.fenv,$(basename $(pl-lib-srcs))) 179*412f47f9SXin Limath-lib-itvs = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.itv,$(basename $(pl-lib-srcs))) 180*412f47f9SXin Li 181*412f47f9SXin Liulp-inputs = $(math-lib-lims) $(math-lib-fenvs) $(math-lib-itvs) 182*412f47f9SXin Li 183*412f47f9SXin Li$(ulp-inputs): CFLAGS_PL += -I$(PLM) -I$(PLM)/include $(math-cflags) 184*412f47f9SXin Li 185*412f47f9SXin Li$(ulp-input-dir)/%.ulp: $(PLM)/%.c | $(ulp-input-dir) 186*412f47f9SXin Li $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_ULP [^ ]* [^ ]*" || true; } > $@ 187*412f47f9SXin Li 188*412f47f9SXin Li$(ulp-input-dir)/%.fenv: $(PLM)/%.c | $(ulp-input-dir) 189*412f47f9SXin Li $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_EXPECT_FENV_ENABLED [^ ]*" || true; } > $@ 190*412f47f9SXin Li 191*412f47f9SXin Li$(ulp-input-dir)/%.itv: $(PLM)/%.c | $(ulp-input-dir) 192*412f47f9SXin Li $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep "PL_TEST_INTERVAL " || true; } | sed "s/ PL_TEST_INTERVAL/\nPL_TEST_INTERVAL/g" > $@ 193*412f47f9SXin Li 194*412f47f9SXin Liulp-lims := $(ulp-input-dir)/limits 195*412f47f9SXin Li$(ulp-lims): $(math-lib-lims) 196*412f47f9SXin Li cat $^ | sed "s/PL_TEST_ULP //g;s/^ *//g" > $@ 197*412f47f9SXin Li 198*412f47f9SXin Lifenv-exps := $(ulp-input-dir)/fenv 199*412f47f9SXin Li$(fenv-exps): $(math-lib-fenvs) 200*412f47f9SXin Li cat $^ | sed "s/PL_TEST_EXPECT_FENV_ENABLED //g;s/^ *//g" > $@ 201*412f47f9SXin Li 202*412f47f9SXin Liulp-itvs := $(ulp-input-dir)/intervals 203*412f47f9SXin Li$(ulp-itvs): $(math-lib-itvs) 204*412f47f9SXin Li cat $^ | sort -u | sed "s/PL_TEST_INTERVAL //g" > $@ 205*412f47f9SXin Li 206*412f47f9SXin Licheck-pl/math-ulp: $(math-tools) $(ulp-lims) $(fenv-exps) $(ulp-itvs) 207*412f47f9SXin Li WANT_SVE_MATH=$(WANT_SVE_MATH) \ 208*412f47f9SXin Li ULPFLAGS="$(math-ulpflags)" \ 209*412f47f9SXin Li LIMITS=../../../$(ulp-lims) \ 210*412f47f9SXin Li INTERVALS=../../../$(ulp-itvs) \ 211*412f47f9SXin Li FENV=../../../$(fenv-exps) \ 212*412f47f9SXin Li FUNC=$(func) \ 213*412f47f9SXin Li PRED=$(pred) \ 214*412f47f9SXin Li build/pl/bin/runulp.sh $(EMULATOR) 215*412f47f9SXin Li 216*412f47f9SXin Licheck-pl/math: check-pl/math-test check-pl/math-rtest check-pl/math-ulp 217*412f47f9SXin Li 218*412f47f9SXin Li$(DESTDIR)$(libdir)/pl/%.so: build/pl/lib/%.so 219*412f47f9SXin Li $(INSTALL) -D $< $@ 220*412f47f9SXin Li 221*412f47f9SXin Li$(DESTDIR)$(libdir)/pl/%: build/pl/lib/% 222*412f47f9SXin Li $(INSTALL) -m 644 -D $< $@ 223*412f47f9SXin Li 224*412f47f9SXin Li$(DESTDIR)$(includedir)/pl/%: build/pl/include/% 225*412f47f9SXin Li $(INSTALL) -m 644 -D $< $@ 226*412f47f9SXin Li 227*412f47f9SXin Liinstall-pl/math: \ 228*412f47f9SXin Li $(pl-libs:build/pl/lib/%=$(DESTDIR)$(libdir)/pl/%) \ 229*412f47f9SXin Li $(pl-includes:build/pl/include/%=$(DESTDIR)$(includedir)/pl/%) 230*412f47f9SXin Li 231*412f47f9SXin Liclean-pl/math: 232*412f47f9SXin Li rm -f $(pl/math-files) 233*412f47f9SXin Li 234*412f47f9SXin Li.PHONY: all-pl/math check-pl/math-test check-pl/math-rtest check-pl/math-ulp check-pl/math install-pl/math clean-pl/math 235