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