Makefile (8650B)
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 utils 29 all: default tests 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_mixture.c\ 39 src/sln_polyline.c\ 40 src/sln_tree_build.c\ 41 src/sln_tree.c 42 OBJ = $(SRC:.c=.o) 43 DEP = $(SRC:.c=.d) 44 45 CFLAGS_LIB = -std=c99 $(CFLAGS_SO) $(INCS) -DSLN_SHARED_BUILD 46 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 47 48 library: .config $(DEP) 49 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 50 $$(if [ -n "$(LIBNAME)" ]; then\ 51 echo "$(LIBNAME)";\ 52 else\ 53 echo "$(LIBNAME_SHARED)";\ 54 fi) 55 56 $(DEP) $(OBJ): config.mk 57 58 $(LIBNAME_SHARED): $(OBJ) 59 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 60 61 $(LIBNAME_STATIC): libsln.o 62 $(AR) -rc $@ $? 63 $(RANLIB) $@ 64 65 libsln.o: $(OBJ) 66 $(LD) -r $(OBJ) -o $@ 67 $(OBJCOPY) $(OCPFLAGS) $@ 68 69 .config: config.mk 70 $(PKG_CONFIG) --atleast-version $(LBLU_VERSION) lblu 71 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 72 $(PKG_CONFIG) --atleast-version $(SBB_VERSION) sbb 73 $(PKG_CONFIG) --atleast-version $(SHTR_VERSION) shtr 74 $(PKG_CONFIG) --atleast-version $(SSP_VERSION) star-sp 75 echo "config done" > $@ 76 77 .SUFFIXES: .c .d .o 78 .c.d: 79 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 80 81 .c.o: 82 $(CC) $(CFLAGS_LIB) -c $< -o $@ 83 84 ################################################################################ 85 # Utils 86 ################################################################################ 87 UTIL_SRC = src/sln_build.c src/sln_get.c src/sln_slab.c 88 UTIL_OBJ = $(UTIL_SRC:.c=.o) 89 UTIL_DEP = $(UTIL_SRC:.c=.d) 90 91 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 92 93 INCS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys sln-local shtr) 94 LIBS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys sln-local shtr) 95 CFLAGS_UTIL = -std=c89 $(CFLAGS_EXE) $(INCS_UTIL) 96 LDFLAGS_UTIL = $(LDFLAGS_EXE) $(LIBS_UTIL) 97 98 INCS_SLAB = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys sln-local sbb shtr star-sp) 99 LIBS_SLAB = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys sln-local sbb shtr star-sp) -lm 100 CFLAGS_SLAB = -std=c89 $(CFLAGS_EXE) $(INCS_SLAB) -fopenmp 101 LDFLAGS_SLAB = $(LDFLAGS_EXE) $(LIBS_SLAB) 102 103 utils: library $(UTIL_DEP) .config 104 @$(MAKE) -fMakefile \ 105 $$(for i in $(UTIL_DEP); do printf -- '-f%s\n' "$${i}"; done) \ 106 sln-build sln-get sln-slab 107 108 $(UTIL_DEP) $(UTIL_OBJ): config.mk sln-local.pc 109 110 111 src/sln_build.d src/sln_build.o: src/sln_build.c 112 src/sln_get.d src/sln_get.o: src/sln_get.c 113 src/sln_slab.d src/sln_slab.o: src/sln_slab.c 114 115 sln-build: config.mk sln-local.pc src/sln_build.o $(LIBNAME) 116 $(CC) $(CFLAGS_UTIL) -o $@ src/sln_build.o $(LDFLAGS_UTIL) 117 118 sln-get: config.mk sln-local.pc src/sln_get.o $(LIBNAME) 119 $(CC) $(CFLAGS_UTIL) -o $@ src/sln_get.o $(LDFLAGS_UTIL) 120 121 sln-slab: config.mk sln-local.pc src/sln_slab.o $(LIBNAME) 122 $(CC) $(CFLAGS_SLAB) -o $@ src/sln_slab.o $(LDFLAGS_SLAB) 123 124 src/sln_build.d src/sln_get.d: 125 @$(CC) $(CFLAGS_UTIL) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 126 127 src/sln_slab.d: 128 @$(CC) $(CFLAGS_SLAB) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 129 130 src/sln_build.o src/sln_get.o: 131 $(CC) $(CFLAGS_UTIL) -c $(@:.o=.c) -o $@ 132 133 src/sln_slab.o: 134 $(CC) $(CFLAGS_SLAB) -c $(@:.o=.c) -o $@ 135 136 clean_utils: 137 rm -f $(UTIL_OBJ) $(UTIL_DEP) sln-build sln-get sln-slab 138 139 ################################################################################ 140 # Installation 141 ################################################################################ 142 pkg: 143 sed -e 's#@PREFIX@#$(PREFIX)#g' \ 144 -e 's#@VERSION@#$(VERSION)#g' \ 145 -e 's#@LBLU_VERSION@#$(LBLU_VERSION)#g' \ 146 -e 's#@SHTR_VERSION@#$(SHTR_VERSION)#g' \ 147 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 148 sln.pc.in > sln.pc 149 150 sln-local.pc: sln.pc.in 151 sed -e '1d' \ 152 -e 's#^includedir=.*#includedir=./src/#' \ 153 -e 's#^libdir=.*#libdir=./#' \ 154 -e 's#@VERSION@#$(VERSION)#g' \ 155 -e 's#@LBLU_VERSION@#$(LBLU_VERSION)#g' \ 156 -e 's#@SHTR_VERSION@#$(SHTR_VERSION)#g' \ 157 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 158 sln.pc.in > $@ 159 160 install: library pkg utils 161 install() { mode="$$1"; prefix="$$2"; shift 2; \ 162 mkdir -p "$${prefix}"; \ 163 cp "$$@" "$${prefix}"; \ 164 printf '%s\n' "$${@}" | while read -r i; do \ 165 chmod "$${mode}" "$${prefix}/$${i##*/}"; \ 166 done; \ 167 }; \ 168 if [ "$(LIB_TYPE)" = "STATIC" ]; then mode=644; else mode=755; fi; \ 169 install "$${mode}" "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 170 install 755 "$(DESTDIR)$(BINPREFIX)" sln-build; \ 171 install 755 "$(DESTDIR)$(BINPREFIX)" sln-get; \ 172 install 755 "$(DESTDIR)$(BINPREFIX)" sln-slab; \ 173 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" sln.pc; \ 174 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/sln.h; \ 175 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/sln-build.1; \ 176 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/sln-get.1; \ 177 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/sln-slab.1; \ 178 install 644 "$(DESTDIR)$(MANPREFIX)/man5" doc/sln-mixture.5; \ 179 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-line" COPYING README.md 180 181 uninstall: 182 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 183 rm -f "$(DESTDIR)$(BINPREFIX)/sln-build" 184 rm -f "$(DESTDIR)$(BINPREFIX)/sln-get" 185 rm -f "$(DESTDIR)$(BINPREFIX)/sln-slab" 186 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/sln.pc" 187 rm -f "$(DESTDIR)$(BINPREFIX)/sln" 188 rm -f "$(DESTDIR)$(INCPREFIX)/star/sln.h" 189 rm -f "$(DESTDIR)$(MANPREFIX)/man1/sln-build.1" 190 rm -f "$(DESTDIR)$(MANPREFIX)/man1/sln-get.1" 191 rm -f "$(DESTDIR)$(MANPREFIX)/man1/sln-slab.1" 192 rm -f "$(DESTDIR)$(MANPREFIX)/man5/sln-mixture.5" 193 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-line/COPYING" 194 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-line/README.md" 195 196 clean: clean_test clean_utils 197 rm -f $(OBJ) $(DEP) $(LIBNAME) 198 rm -f .config libsln.o sln.pc sln-local.pc 199 200 lint: 201 mandoc -Tlint -Wwarning doc/sln-build.1 202 mandoc -Tlint -Wwarning doc/sln-get.1 203 mandoc -Tlint -Wwarning doc/sln-slab.1 204 mandoc -Tlint doc/sln-mixture.5 205 206 ################################################################################ 207 # Tests 208 ################################################################################ 209 TEST_SRC =\ 210 src/test_sln_device.c\ 211 src/test_sln_mesh.c\ 212 src/test_sln_mixture.c\ 213 src/test_sln_tree.c 214 TEST_OBJ = $(TEST_SRC:.c=.o) 215 TEST_DEP = $(TEST_SRC:.c=.d) 216 TEST_TGT = $(TEST_SRC:.c=.t) 217 218 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys sln-local shtr) 219 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys sln-local shtr) 220 221 CFLAGS_TEST = -std=c89 $(CFLAGS_EXE) $(INCS_TEST) 222 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 223 224 tests: library $(TEST_DEP) $(TEST_TGT) 225 @$(MAKE) -fMakefile \ 226 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 227 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 228 test_list 229 230 $(TEST_TGT): 231 @{ \ 232 exe="$$(basename "$@" ".t")"; \ 233 printf '%s: %s\n' "$${exe}" $(@:.t=.o); \ 234 printf 'test_list: %s\n' "$${exe}"; \ 235 } > $@ 236 237 $(TEST_DEP): config.mk sln-local.pc 238 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 239 240 $(TEST_OBJ): config.mk sln-local.pc 241 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 242 243 test_sln_device \ 244 test_sln_mesh \ 245 test_sln_mixture \ 246 test_sln_tree \ 247 : config.mk sln-local.pc $(LIBNAME) 248 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 249 250 clean_test: 251 rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT) mixture.txt 252 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 253 254 test: tests 255 @err=0; \ 256 for i in $(TEST_SRC); do \ 257 test="$$(basename "$${i}" ".c")"; \ 258 printf '%s' "$${test}"; \ 259 if "./$${test}" > /dev/null 2>&1; then \ 260 printf '\n'; \ 261 else \ 262 printf ': error %s\n' "$$?"; \ 263 err=$$((err+1)); \ 264 fi \ 265 done; \ 266 [ "$${err}" -eq 0 ]