Makefile (6922B)
1 # Copyright (C) 2020-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: .b .c .d .o 18 19 include config.mk 20 21 LIBNAME_STATIC = libsmsh.a 22 LIBNAME_SHARED = libsmsh.so 23 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 24 25 default: library utils 26 all: default tests 27 28 ################################################################################ 29 # Library 30 ################################################################################ 31 SRC = src/smsh.c src/smsh_log.c 32 OBJ = $(SRC:.c=.o) 33 DEP = $(SRC:.c=.d) 34 35 CFLAGS_LIB = -std=c89 $(CFLAGS_SO) $(INCS) -DSMSH_SHARED_BUILD 36 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 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): libsmsh.o 52 $(AR) -rc $@ $? 53 $(RANLIB) $@ 54 55 libsmsh.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) -DSMSH_SHARED_BUILD -c $< -o $@ 69 70 ################################################################################ 71 # Util 72 ################################################################################ 73 UTIL_SRC = src/smsh2vtk.c src/smsh-desc.c src/vtk-data.c 74 UTIL_BIN = $(UTIL_SRC:.c=.b) 75 UTIL_OBJ = $(UTIL_SRC:.c=.o) 76 UTIL_DEP = $(UTIL_SRC:.c=.d) 77 UTIL_EXE = smsh2vtk smsh-desc vtk-data 78 79 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 80 INCS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smsh-local.pc) 81 LIBS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smsh-local.pc) 82 83 CFLAGS_UTIL = -std=c99 $(CFLAGS_EXE) $(INCS_UTIL) 84 LDFLAGS_UTIL = $(LDFLAGS_EXE) $(LIBS_UTIL) 85 86 utils: library $(UTIL_DEP) $(UTIL_BIN) 87 @for src in $(UTIL_SRC); do \ 88 dep="$${src%*.c}.d"; \ 89 bin="$${src%*.c}.b"; \ 90 exe="$$(basename "$${src}" ".c")"; \ 91 $(MAKE) -fMakefile -f"$${dep}" -f "$${bin}" "$${exe}"; \ 92 done 93 94 $(UTIL_BIN): 95 @exe=$$(basename "$@" ".b"); \ 96 printf '%s: src/%s.o\n' "$${exe}" "$${exe}" > $@ 97 98 $(UTIL_DEP): config.mk smsh-local.pc 99 $(CC) $(CFLAGS_UTIL) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 100 101 $(UTIL_OBJ): config.mk smsh-local.pc 102 $(CC) $(CFLAGS_UTIL) -c $(@:.o=.c) -o $@ 103 104 $(UTIL_EXE): config.mk smsh-local.pc $(LIBNAME) 105 $(CC) $(CFLAGS_UTIL) -o $@ src/$@.o $(LDFLAGS_UTIL) 106 107 ################################################################################ 108 # Miscellaneous 109 ################################################################################ 110 pkg: 111 sed -e 's#@PREFIX@#$(PREFIX)#g' \ 112 -e 's#@VERSION@#$(VERSION)#g' \ 113 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 114 smsh.pc.in > smsh.pc 115 116 smsh-local.pc: smsh.pc.in 117 sed -e '1d'\ 118 -e 's#^includedir=.*#includedir=./src/#'\ 119 -e 's#^libdir=.*#libdir=./#'\ 120 -e 's#@VERSION@#$(VERSION)#g'\ 121 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 122 smsh.pc.in > $@ 123 124 install: library utils pkg 125 install() { mode="$$1"; prefix="$$2"; shift 2; \ 126 mkdir -p "$${prefix}"; \ 127 cp "$$@" "$${prefix}"; \ 128 chmod "$${mode}" "$$@"; \ 129 }; \ 130 install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 131 install 755 "$(DESTDIR)$(BINPREFIX)" $(UTIL_EXE); \ 132 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" smsh.pc; \ 133 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/smsh.h; \ 134 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/smsh2vtk.1; \ 135 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/smsh-desc.1; \ 136 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/vtk-data.1; \ 137 install 644 "$(DESTDIR)$(MANPREFIX)/man5" doc/smsh.5; \ 138 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-mesh" COPYING README.md 139 140 uninstall: 141 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 142 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/smsh.pc" 143 rm -f "$(DESTDIR)$(INCPREFIX)/star/smsh.h" 144 rm -f "$(DESTDIR)$(MANPREFIX)/man1/smsh2vtk.1" 145 rm -f "$(DESTDIR)$(MANPREFIX)/man1/smsh-desc.1" 146 rm -f "$(DESTDIR)$(MANPREFIX)/man1/vtk-data.1" 147 rm -f "$(DESTDIR)$(MANPREFIX)/man5/smsh.5" 148 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-mesh/COPYING" 149 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-mesh/README.md" 150 for i in $(UTIL_EXE); do rm -f "$(DESTDIR)$(BINPREFIX)/$${i}"; done 151 152 lint: 153 mandoc -T lint -Wbase doc/smsh.5 154 mandoc -T lint -Wbase doc/smsh2vtk.1 || [ $$? -eq 1 ]; 155 mandoc -T lint -Wbase doc/smsh-desc.1 || [ $$? -eq 1 ]; 156 mandoc -T lint -Wbase doc/vtk-data.1 157 158 clean: clean_test 159 rm -f $(DEP) $(OBJ) $(LIBNAME) 160 rm -f $(UTIL_BIN) $(UTIL_DEP) $(UTIL_OBJ) $(UTIL_EXE) 161 rm -f .config libsmsh.o smsh.pc smsh-local.pc 162 163 ################################################################################ 164 # Tests 165 ################################################################################ 166 TEST_SRC = src/test_smsh.c src/test_smsh_load.c 167 TEST_OBJ = $(TEST_SRC:.c=.o) 168 TEST_DEP = $(TEST_SRC:.c=.d) 169 TEST_BIN = $(TEST_SRC:.c=.b) 170 171 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smsh-local.pc) 172 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smsh-local.pc) 173 174 CFLAGS_TEST = -std=c89 $(CFLAGS_EXE) $(INCS_TEST) 175 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 176 177 test: tests 178 @err=0; \ 179 for i in $(TEST_SRC); do \ 180 test="$$(basename "$${i}" ".c")"; \ 181 if "./$${test}" > /dev/null 2>&1; then \ 182 printf '%s\n' "$${test}"; \ 183 else \ 184 >&2 printf '%s: error %s\n' "$${test}" "$$?"; \ 185 err=$$((err+1)); \ 186 fi \ 187 done; \ 188 [ "$${err}" -eq 0 ] 189 190 tests: library $(TEST_DEP) $(TEST_BIN) 191 @$(MAKE) -fMakefile \ 192 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 193 $$(for i in $(TEST_BIN); do echo -f"$${i}"; done) \ 194 test_bin 195 196 .c.b: 197 @{ \ 198 bin="$$(basename "$<" ".c")"; \ 199 printf '%s: %s\n' "$${bin}" $(<:.c=.o); \ 200 printf 'test_bin: %s\n' "$${bin}"; \ 201 } > $@ 202 203 $(TEST_DEP): config.mk smsh-local.pc 204 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 205 206 $(TEST_OBJ): config.mk smsh-local.pc 207 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 208 209 test_smsh \ 210 test_smsh_load \ 211 : config.mk smsh-local.pc $(LIBNAME) 212 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 213 214 clean_test: 215 rm -f $(TEST_BIN) $(TEST_DEP) $(TEST_OBJ) 216 rm -f test_file.smsh 217 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done