Makefile (6992B)
1 # Copyright (C) 2020-2023, 2025-2026 |Méso|Star> (contact@meso-star.com) 2 # 3 # This program is free software: you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License as published by 5 # the Free Software Foundation, either version 3 of the License, or 6 # (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 .POSIX: 17 .SUFFIXES: .t .c .d .o 18 19 include config.mk 20 21 LIBNAME_STATIC = libsuvm.a 22 LIBNAME_SHARED = libsuvm.so 23 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 24 25 default: library 26 all: default tests $(ADDON) 27 28 ################################################################################ 29 # Library building 30 ################################################################################ 31 SRC =\ 32 src/suvm_device.c\ 33 src/suvm_primitive.c\ 34 src/suvm_volume.c\ 35 src/suvm_volume_at.c\ 36 src/suvm_volume_intersect_aabb.c 37 OBJ = $(SRC:.c=.o) 38 DEP = $(SRC:.c=.d) 39 40 CFLAGS_LIB = -std=c99 $(CFLAGS_SO) $(INCS) -DSUVM_SHARED_BUILD 41 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 42 43 library: .config $(DEP) 44 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 45 $$(if [ -n "$(LIBNAME)" ]; then\ 46 echo "$(LIBNAME)";\ 47 else\ 48 echo "$(LIBNAME_SHARED)";\ 49 fi) 50 51 $(DEP) $(OBJ): config.mk 52 53 $(LIBNAME_SHARED): $(OBJ) 54 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 55 56 $(LIBNAME_STATIC): libsuvm.o 57 $(AR) -rc $@ $? 58 $(RANLIB) $@ 59 60 libsuvm.o: $(OBJ) 61 $(LD) -r $(OBJ) -o $@ 62 $(OBJCOPY) $(OCPFLAGS) $@ 63 64 .config: config.mk 65 $(PKG_CONFIG) --atleast-version $(EMBREE_VERSION) embree4 66 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 67 @echo "config done" > $@ 68 69 .c.d: 70 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 71 72 .c.o: 73 $(CC) $(CFLAGS_LIB) -c $< -o $@ 74 75 ################################################################################ 76 # Installation 77 ################################################################################ 78 pkg: 79 sed -e 's#@PREFIX@#$(PREFIX)#g'\ 80 -e 's#@VERSION@#$(VERSION)#g'\ 81 -e 's#@EMBREE_VERSION@#$(EMBREE_VERSION)#g'\ 82 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 83 suvm.pc.in > suvm.pc 84 85 suvm-local.pc: suvm.pc.in 86 sed -e '1d'\ 87 -e 's#^includedir=.*#includedir=./src/#'\ 88 -e 's#^libdir=.*#libdir=./#'\ 89 -e 's#@VERSION@#$(VERSION)#g'\ 90 -e 's#@EMBREE_VERSION@#$(EMBREE_VERSION)#g'\ 91 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 92 suvm.pc.in > $@ 93 94 install: library pkg install_$(ADDON) 95 install() { mode="$$1"; prefix="$$2"; shift 2; \ 96 mkdir -p "$${prefix}"; \ 97 cp "$$@" "$${prefix}"; \ 98 chmod "$${mode}" "$$@"; \ 99 }; \ 100 install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 101 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" suvm.pc; \ 102 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/suvm.h; \ 103 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-uvm" COPYING README.md 104 105 install_: # Dummy target run when ADDON is disabled 106 107 uninstall: uninstall_utils 108 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 109 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/suvm.pc" 110 rm -f "$(DESTDIR)$(INCPREFIX)/star/suvm.h" 111 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-uvm/COPYING" 112 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-uvm/README.md" 113 114 lint: lint_utils 115 116 clean: clean_test clean_utils 117 rm -f $(DEP) $(OBJ) $(LIBNAME) 118 rm -f .config libsuvm.o suvm.pc suvm-local.pc 119 120 ################################################################################# 121 # Utils 122 ################################################################################# 123 UTIL_SRC = src/suvm_voxelize.c 124 UTIL_OBJ = $(UTIL_SRC:.c=.o) 125 UTIL_DEP = $(UTIL_SRC:.c=.d) 126 127 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 128 129 INCS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smsh suvm-local.pc) 130 LIBS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smsh suvm-local.pc) -lm 131 132 CFLAGS_UTIL = -std=c89 $(CFLAGS_EXE) $(INCS_UTIL) 133 LDFLAGS_UTIL = $(LDFLAGS_EXE) $(LIBS_UTIL) 134 135 utils: library .config_utils 136 @$(MAKE) $(UTIL_DEP); \ 137 $(MAKE) -f Makefile -f src/suvm_voxelize.d suvm-voxelize 138 139 .config_utils: config.mk 140 $(PKG_CONFIG) --atleast-version $(SMSH_VERSION) smsh 141 @echo "config done" > $@ 142 143 src/suvm_voxelize.d: config.mk suvm-local.pc 144 @$(CC) $(CFLAGS_UTIL) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 145 146 src/suvm_voxelize.o: config.mk suvm-local.pc 147 $(CC) $(CFLAGS_UTIL) -c $(@:.o=.c) -o $@ 148 149 suvm-voxelize: config.mk suvm-local.pc $(LIBNAME) src/suvm_voxelize.o 150 $(CC) $(CFLAGS_UTIL) -o $@ src/suvm_voxelize.o $(LDFLAGS_UTIL) 151 152 clean_utils: 153 rm -f $(UTIL_DEP) $(UTIL_OBJ) suvm-voxelize 154 rm -f .config_utils 155 156 install_utils: utils 157 install() { mode="$$1"; prefix="$$2"; shift 2; \ 158 mkdir -p "$${prefix}"; \ 159 cp "$$@" "$${prefix}"; \ 160 chmod "$${mode}" "$$@"; \ 161 }; \ 162 install 755 "$(DESTDIR)$(BINPREFIX)" suvm-voxelize; \ 163 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/suvm-voxelize.1 164 165 uninstall_utils: 166 rm -f "$(DESTDIR)$(BINPREFIX)/suvm-voxelize" 167 rm -f "$(DESTDIR)$(MANPREFIX)/man1/suvm-voxelize.1" 168 169 lint_utils: 170 mandoc -Tlint -Wall doc/suvm-voxelize.1 || [ $$? -le 1 ] 171 172 ################################################################################ 173 # Tests 174 ################################################################################ 175 TEST_SRC =\ 176 src/test_suvm_device.c\ 177 src/test_suvm_volume.c\ 178 src/test_suvm_primitive_intersection.c 179 TEST_OBJ = $(TEST_SRC:.c=.o) 180 TEST_DEP = $(TEST_SRC:.c=.d) 181 TEST_TGT = $(TEST_SRC:.c=.t) 182 183 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys suvm-local.pc) 184 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys suvm-local.pc) -lm 185 186 CFLAGS_TEST = -std=c89 $(CFLAGS_EXE) $(INCS_TEST) 187 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 188 189 tests: library $(TEST_DEP) $(TEST_TGT) 190 @$(MAKE) -fMakefile \ 191 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 192 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 193 test_list 194 195 .c.t: 196 @{ \ 197 tgt="$$(basename "$<" ".c")"; \ 198 printf '%s: %s\n' "$${tgt}" $(<:.c=.o); \ 199 printf 'test_list: %s\n' "$${tgt}"; \ 200 } > $@ 201 202 $(TEST_DEP): config.mk suvm-local.pc 203 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 204 205 $(TEST_OBJ): config.mk suvm-local.pc 206 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 207 208 test_suvm_device \ 209 test_suvm_volume \ 210 test_suvm_primitive_intersection \ 211 : config.mk suvm-local.pc $(LIBNAME) 212 $(CC) -std=c89 $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 213 214 clean_test: 215 rm -f $(TEST_BIN) $(TEST_DEP) $(TEST_OBJ) 216 rm -f ball.vtk box.vtk 217 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 218 219 test: tests 220 @err=0; \ 221 for i in $(TEST_SRC); do \ 222 test="$$(basename "$${i}" ".c")"; \ 223 if "./$${test}" > /dev/null 2>&1; then \ 224 printf '%s\n' "$${test}"; \ 225 else \ 226 >&2 printf '%s: error %s\n' "$${test}" "$$?"; \ 227 err=$$((err+1)); \ 228 fi \ 229 done; \ 230 [ "$${err}" -eq 0 ]