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