Makefile (6327B)
1 # Copyright (C) 2015, 2016, 2019, 2021, 2023, 2025 |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: # Clean up default inference rules 18 19 include config.mk 20 21 LIBNAME_STATIC = libsstl.a 22 LIBNAME_SHARED = libsstl.so 23 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 24 25 default: library 26 all: library tests util 27 28 ################################################################################ 29 # Library building 30 ################################################################################ 31 SRC = src/sstl.c src/sstl_ascii.c src/sstl_binary.c src/sstl_writer.c 32 OBJ = $(SRC:.c=.o) 33 DEP = $(SRC:.c=.d) 34 35 CFLAGS_LIB = -std=c99 $(CFLAGS_SO) $(INCS) -DSSTL_SHARED_BUILD 36 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) -lm 37 38 library: .config $(DEP) 39 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 40 $$(if [ -n "$(LIBNAME)" ]; then\ 41 echo "$(LIBNAME)";\ 42 else\ 43 echo "$(LIBNAME_SHARED)";\ 44 fi) 45 46 $(DEP) $(OBJ): config.mk 47 48 $(LIBNAME_SHARED): $(OBJ) 49 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 50 51 $(LIBNAME_STATIC): libsstl.o 52 $(AR) -rc $@ $? 53 $(RANLIB) $@ 54 55 libsstl.o: $(OBJ) 56 $(LD) -r $(OBJ) -o $@ 57 $(OBJCOPY) $(OCPFLAGS) $@ 58 59 .config: config.mk 60 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 61 echo "config done" > $@ 62 63 .SUFFIXES: .c .d .o 64 .c.d: 65 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 66 67 .c.o: 68 $(CC) $(CFLAGS_LIB) -c $< -o $@ 69 70 ################################################################################ 71 # Utils 72 ################################################################################ 73 UTIL_SRC = src/sstl_main.c 74 UTIL_OBJ = $(UTIL_SRC:.c=.o) 75 UTIL_DEP = $(UTIL_SRC:.c=.d) 76 77 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 78 79 INCS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys sstl-local) 80 LIBS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys sstl-local) 81 82 CFLAGS_UTIL = -std=c99 $(CFLAGS_EXE) $(INCS_UTIL) 83 LDFLAGS_UTIL = $(LDFLAGS_EXE) $(LIBS_UTIL) 84 85 util: library $(UTIL_DEP) 86 @$(MAKE) -fMakefile -f"$(UTIL_DEP)" sstl 87 88 sstl: config.mk sstl-local.pc $(UTIL_OBJ) $(LIBNAME) 89 $(CC) $(CFLAGS_UTIL) -o $@ $(UTIL_OBJ) $(LDFLAGS_UTIL) 90 91 $(UTIL_DEP): config.mk sstl-local.pc 92 @$(CC) $(CFLAGS_UTIL) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 93 94 $(UTIL_OBJ): config.mk sstl-local.pc 95 $(CC) $(CFLAGS_UTIL) -c $(@:.o=.c) -o $@ 96 97 ################################################################################ 98 # Installation 99 ################################################################################ 100 pkg: 101 sed -e 's#@PREFIX@#$(PREFIX)#g' \ 102 -e 's#@VERSION@#$(VERSION)#g' \ 103 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 104 sstl.pc.in > sstl.pc 105 106 sstl-local.pc: sstl.pc.in 107 sed -e '1d'\ 108 -e 's#^includedir=.*#includedir=./src/#' \ 109 -e 's#^libdir=.*#libdir=./#' \ 110 -e 's#@VERSION@#$(VERSION)#g' \ 111 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 112 sstl.pc.in > $@ 113 114 install: library util pkg 115 install() { mode="$$1"; prefix="$$2"; shift 2; \ 116 mkdir -p "$${prefix}"; \ 117 cp "$$@" "$${prefix}"; \ 118 chmod "$${mode}" "$$@"; \ 119 }; \ 120 install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 121 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" sstl.pc; \ 122 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/sstl.h; \ 123 install 755 "$(DESTDIR)$(BINPREFIX)" sstl; \ 124 install 644 "$(DESTDIR)$(MANPREFIX)/man1/" sstl.1; \ 125 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-stl" COPYING README.md 126 127 uninstall: 128 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 129 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/sstl.pc" 130 rm -f "$(DESTDIR)$(INCPREFIX)/star/sstl.h" 131 rm -f "$(DESTDIR)$(BINPREFIX)/sstl" 132 rm -f "$(DESTDIR)$(MANPREFIX)/man1/sstl.1" 133 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-stl/COPYING" 134 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-stl/README.md" 135 136 clean: clean_test 137 rm -f $(OBJ) $(DEP) $(LIBNAME) 138 rm -f $(UTIL_OBJ) $(UTIL_DEP) sstl 139 rm -f .config libsstl.o sstl.pc sstl-local.pc 140 141 lint: 142 mandoc -Tlint sstl.1 143 144 ################################################################################ 145 # Tests 146 ################################################################################ 147 TEST_SRC =\ 148 src/test_sstl.c\ 149 src/test_sstl_desc.c\ 150 src/test_sstl_load_ascii.c\ 151 src/test_sstl_load_binary.c\ 152 src/test_sstl_writer.c 153 TEST_OBJ = $(TEST_SRC:.c=.o) 154 TEST_DEP = $(TEST_SRC:.c=.d) 155 TEST_TGT = $(TEST_SRC:.c=.t) 156 157 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys sstl-local) 158 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys sstl-local) 159 160 CFLAGS_TEST = -std=c89 $(CFLAGS_EXE) $(INCS_TEST) 161 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) -lm 162 163 tests: library $(TEST_DEP) $(TEST_TGT) 164 @$(MAKE) -fMakefile \ 165 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 166 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 167 test_list 168 169 $(TEST_TGT): 170 @{ \ 171 exe="$$(basename "$@" ".t")"; \ 172 printf '%s: %s\n' "$${exe}" $(@:.t=.o); \ 173 printf 'test_list: %s\n' "$${exe}"; \ 174 } > $@ 175 176 $(TEST_DEP): config.mk sstl-local.pc 177 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 178 179 $(TEST_OBJ): config.mk sstl-local.pc 180 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 181 182 test_sstl \ 183 test_sstl_desc \ 184 test_sstl_load_ascii \ 185 test_sstl_load_binary \ 186 test_sstl_writer \ 187 : config.mk sstl-local.pc $(LIBNAME) 188 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 189 190 clean_test: 191 rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT) 192 rm -f 1_triangle.stl 1_triangle_no_normal.stl 193 rm -f 1_triangle_with_noise.stl empty.stl test.stl 194 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 195 196 test: tests 197 @err=0; \ 198 for i in $(TEST_SRC); do \ 199 test="$$(basename "$${i}" ".c")"; \ 200 printf '%s' "$${test}"; \ 201 if "./$${test}" > /dev/null 2>&1; then \ 202 printf '\n'; \ 203 else \ 204 printf ': error %s\n' "$$?"; \ 205 err=$$((err+1)); \ 206 fi \ 207 done; \ 208 [ "$${err}" -eq 0 ]