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