Makefile (5232B)
1 # Copyright (C) 2018, 2020-2025 |Méso|Star> (contact@meso-star.com) 2 # Copyright (C) 2018 Université Paul Sabatier 3 # 4 # This program is free software: you can redistribute it and/or modify 5 # it under the terms of the GNU General Public License as published by 6 # the Free Software Foundation, either version 3 of the License, or 7 # (at your option) any later version. 8 # 9 # This program is distributed in the hope that it will be useful, 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 # GNU General Public License for more details. 13 # 14 # You should have received a copy of the GNU General Public License 15 # along with this program. If not, see <http://www.gnu.org/licenses/>. 16 17 .POSIX: 18 .SUFFIXES: # Clean up default inference rules 19 20 include config.mk 21 22 LIBNAME_STATIC = libsvx.a 23 LIBNAME_SHARED = libsvx.so 24 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 25 26 default: library 27 all: default tests 28 29 ################################################################################ 30 # Library building 31 ################################################################################ 32 SRC =\ 33 src/svx_bintree.c\ 34 src/svx_bintree_trace_ray.c\ 35 src/svx_buffer.c\ 36 src/svx_device.c\ 37 src/svx_octree.c\ 38 src/svx_octree_trace_ray.c\ 39 src/svx_tree.c 40 OBJ = $(SRC:.c=.o) 41 DEP = $(SRC:.c=.d) 42 43 CFLAGS_LIB = $(CFLAGS_SO) $(INCS) -DSVX_SHARED_BUILD 44 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 45 46 library: .config $(DEP) 47 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 48 $$(if [ -n "$(LIBNAME)" ]; then \ 49 echo "$(LIBNAME)"; \ 50 else \ 51 echo "$(LIBNAME_SHARED)"; \ 52 fi) 53 54 $(DEP) $(OBJ): config.mk 55 56 $(LIBNAME_SHARED): $(OBJ) 57 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 58 59 $(LIBNAME_STATIC): libsvx.o 60 $(AR) -rc $@ $? 61 $(RANLIB) $@ 62 63 libsvx.o: $(OBJ) 64 $(LD) -r $(OBJ) -o $@ 65 $(OBJCOPY) $(OCPFLAGS) $@ 66 67 .config: config.mk 68 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 69 @echo "config done" > $@ 70 71 .SUFFIXES: .c .d .o 72 .c.d: 73 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 74 75 .c.o: 76 $(CC) $(CFLAGS_LIB) -c $< -o $@ 77 78 ################################################################################ 79 # Miscellaneous 80 ################################################################################ 81 pkg: 82 sed -e 's#@PREFIX@#$(PREFIX)#g'\ 83 -e 's#@VERSION@#$(VERSION)#g'\ 84 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 85 svx.pc.in > svx.pc 86 87 svx-local.pc: svx.pc.in 88 sed -e '1d'\ 89 -e 's#^includedir=.*#includedir=./src/#'\ 90 -e 's#^libdir=.*#libdir=./#'\ 91 -e 's#@VERSION@#$(VERSION)#g'\ 92 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 93 svx.pc.in > $@ 94 95 install: library pkg 96 install() { mode="$$1"; prefix="$$2"; shift 2; \ 97 mkdir -p "$${prefix}"; \ 98 cp "$$@" "$${prefix}"; \ 99 chmod "$${mode}" "$$@"; \ 100 }; \ 101 install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 102 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" svx.pc; \ 103 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/svx.h; \ 104 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-vx" COPYING README.md 105 106 uninstall: 107 rm -f "$(DESTDIR)$(PREFIX)/lib/$(LIBNAME)" 108 rm -f "$(DESTDIR)$(PREFIX)/lib/pkgconfig/svx.pc" 109 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-vx/COPYING" 110 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-vx/README.md" 111 rm -f "$(DESTDIR)$(PREFIX)/include/star/svx.h" 112 113 clean: clean_test 114 rm -f $(DEP) $(OBJ) $(LIBNAME) 115 rm -f .config libsvx.o svx.pc svx-local.pc 116 117 ################################################################################ 118 # Tests 119 ################################################################################ 120 TEST_SRC =\ 121 src/test_svx_bintree.c\ 122 src/test_svx_bintree_trace_ray.c\ 123 src/test_svx_device.c\ 124 src/test_svx_octree.c\ 125 src/test_svx_octree_trace_ray.c 126 TEST_OBJ = $(TEST_SRC:.c=.o) 127 TEST_DEP = $(TEST_SRC:.c=.d) 128 TEST_TGT = $(TEST_SRC:.c=.t) 129 130 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 131 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys svx-local.pc) 132 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys svx-local.pc) -lm 133 134 CFLAGS_TEST = $(CFLAGS_EXE) $(INCS_TEST) 135 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 136 137 tests: library $(TEST_DEP) $(TEST_TGT) 138 @$(MAKE) -fMakefile \ 139 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 140 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 141 test_list 142 143 $(TEST_TGT): 144 @{ \ 145 exe="$$(basename "$@" ".t")"; \ 146 printf '%s: %s\n' "$${exe}" $(@:.t=.o); \ 147 printf 'test_list: %s\n' "$${exe}"; \ 148 } > $@ 149 150 $(TEST_DEP): config.mk svx-local.pc 151 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 152 153 $(TEST_OBJ): config.mk svx-local.pc 154 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 155 156 test_svx_bintree \ 157 test_svx_bintree_trace_ray \ 158 test_svx_device \ 159 test_svx_octree \ 160 test_svx_octree_trace_ray \ 161 : config.mk svx-local.pc $(LIBNAME) 162 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 163 clean_test: 164 rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT) 165 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 166 167 test: tests 168 @err=0; \ 169 for i in $(TEST_SRC); do \ 170 test="$$(basename "$${i}" ".c")"; \ 171 if "./$${test}" > /dev/null 2>&1; then \ 172 printf '%s\n' "$${test}"; \ 173 else \ 174 >&2 printf '%s: error %s\n' "$${test}" "$$?"; \ 175 err=$$((err+1)); \ 176 fi \ 177 done; \ 178 [ "$${err}" -eq 0 ]