Makefile (10003B)
1 # Copyright (C) 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 18 include config.mk 19 20 LIBNAME_STATIC = libsmeteo.a 21 LIBNAME_SHARED = libsmeteo.so 22 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 23 24 default: library 25 all: default tests util $(PLUGIN) 26 27 ################################################################################ 28 # Library 29 ################################################################################ 30 SRC = src/smeteo.c src/smeteo_load.c 31 OBJ = $(SRC:.c=.o) 32 DEP = $(SRC:.c=.d) 33 34 CFLAGS_LIB = -std=c99 $(CFLAGS_SO) $(INCS) -DSMETEO_SHARED_BUILD 35 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 36 37 library: .config $(DEP) 38 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 39 $$(if [ -n "$(LIBNAME)" ]; then\ 40 echo "$(LIBNAME)";\ 41 else\ 42 echo "$(LIBNAME_SHARED)";\ 43 fi) 44 45 $(LIBNAME_SHARED) B$(DEP) $(OBJ): config.mk .config 46 47 $(LIBNAME_SHARED): $(OBJ) 48 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 49 50 $(LIBNAME_STATIC): libsmeteo.o 51 $(AR) -rc $@ $? 52 $(RANLIB) $@ 53 54 libsmeteo.o: $(OBJ) 55 $(LD) -r $(OBJ) -o $@ 56 $(OBJCOPY) $(OCPFLAGS) $@ 57 58 .config: config.mk 59 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 60 @echo "config done" > $@ 61 62 .SUFFIXES: .c .d .o 63 .c.d: 64 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 65 66 .c.o: 67 $(CC) $(CFLAGS_LIB) -c $< -o $@ 68 69 ################################################################################ 70 # Utils 71 ################################################################################ 72 UTIL_SRC = src/smeteo_main.c 73 UTIL_OBJ = $(UTIL_SRC:.c=.o) 74 UTIL_DEP = $(UTIL_SRC:.c=.d) 75 76 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 77 INCS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smeteo-local) 78 LIBS_UTIL = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smeteo-local) 79 80 CFLAGS_UTIL = -std=c89 $(CFLAGS_EXE) $(INCS_UTIL) 81 LDFLAGS_UTIL = $(LDFLAGS_EXE) $(LIBS_UTIL) 82 83 util: library $(UTIL_DEP) 84 @$(MAKE) -fMakefile -f"$(UTIL_DEP)" smeteo 85 86 smeteo: config.mk smeteo-local.pc $(UTIL_OBJ) 87 $(CC) $(CFLAGS_UTIL) -o $@ $(UTIL_OBJ) $(LDFLAGS_UTIL) 88 89 $(UTIL_DEP): config.mk smeteo-local.pc 90 @$(CC) $(CFLAGS_UTIL) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 91 92 $(UTIL_OBJ): config.mk smeteo-local.pc 93 $(CC) $(CFLAGS_UTIL) -c $(@:.o=.c) -o $@ 94 95 ################################################################################ 96 # Plugin 97 ################################################################################ 98 PLUGIN_SRC =\ 99 src/stardis_smeteo.c\ 100 src/stardis_smeteo_library.c 101 PLUGIN_OBJ = $(PLUGIN_SRC:.c=.o) 102 PLUGIN_DEP = $(PLUGIN_SRC:.c=.d) 103 104 INCS_PLUGIN = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smeteo-local scem stardis) 105 LIBS_PLUGIN = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smeteo-local scem) -lm 106 107 CFLAGS_PLUGIN = -std=c89 $(CFLAGS_SO) $(INCS_PLUGIN) 108 LDFLAGS_PLUGIN = $(LDFLAGS_SO) $(LIBS_PLUGIN) 109 110 stardis: library $(PLUGIN_DEP) 111 @$(MAKE) -fMakefile $$(for i in $(PLUGIN_DEP); do echo -f $${i}; done) \ 112 libstardis_smeteo.so 113 114 libstardis_smeteo.so $(PLUGIN_DEP) $(PLUGIN_OBJ): \ 115 config.mk smeteo-local.pc .config_plugin 116 117 .config_plugin: 118 $(PKG_CONFIG) --atleast-version $(SCEM_VERSION) scem 119 $(PKG_CONFIG) --atleast-version $(STARDIS_VERSION) stardis 120 @echo 'config done' > $@ 121 122 libstardis_smeteo.so: $(PLUGIN_OBJ) 123 $(CC) $(CFLAGS_PLUGIN) -o $@ $(PLUGIN_OBJ) $(LDFLAGS_PLUGIN) 124 125 $(PLUGIN_DEP): $(@:.d=.c) 126 @$(CC) $(CFLAGS_PLUGIN) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 127 128 $(PLUGIN_OBJ): $(@:.o=.c) 129 $(CC) $(CFLAGS_PLUGIN) -c $(@:.o=.c) -o $@ 130 131 ################################################################################ 132 # Miscellaneous 133 ################################################################################ 134 pkg: 135 sed -e 's#@PREFIX@#$(PREFIX)#g' \ 136 -e 's#@VERSION@#$(VERSION)#g' \ 137 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g' \ 138 smeteo.pc.in > smeteo.pc 139 140 smeteo-local.pc: smeteo.pc.in 141 sed -e '1d'\ 142 -e 's#^includedir=.*#includedir=./src/#'\ 143 -e 's#^libdir=.*#libdir=./#'\ 144 -e 's#@VERSION@#$(VERSION)#g'\ 145 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 146 smeteo.pc.in > $@ 147 148 install: library util pkg $(PLUGIN) 149 install() { mode="$$1"; prefix="$$2"; shift 2; \ 150 mkdir -p "$${prefix}"; \ 151 cp "$$@" "$${prefix}"; \ 152 chmod "$${mode}" "$${prefix}/$${@##*/}"; \ 153 }; \ 154 if [ "$(LIB_TYPE)" = "STATIC" ]; then mode=644; else mode=755; fi; \ 155 install "$${mode}" "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 156 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" smeteo.pc; \ 157 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/smeteo.h; \ 158 install 755 "$(DESTDIR)$(BINPREFIX)/" smeteo; \ 159 install 644 "$(DESTDIR)$(MANPREFIX)/man1" doc/smeteo.1; \ 160 install 644 "$(DESTDIR)$(MANPREFIX)/man3" doc/libstardis_smeteo.3; \ 161 install 644 "$(DESTDIR)$(MANPREFIX)/man5" doc/smeteo.5; \ 162 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-meteo" COPYING README.md; \ 163 if [ $(PLUGIN) = "stardis" ]; then \ 164 install 755 "$(DESTDIR)$(LIBPREFIX)" libstardis_smeteo.so; \ 165 fi 166 167 uninstall: 168 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 169 rm -f "$(DESTDIR)$(LIBPREFIX)/libstardis_smeteo.so" 170 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/smeteo.pc" 171 rm -f "$(DESTDIR)$(INCPREFIX)/star/smeteo.h" 172 rm -f "$(DESTDIR)$(BINPREFIX)/smeteo" 173 rm -f "$(DESTDIR)$(MANPREFIX)/man1/smeteo.1" 174 rm -f "$(DESTDIR)$(MANPREFIX)/man3/libstardis_smeteo.3" 175 rm -f "$(DESTDIR)$(MANPREFIX)/man5/smeteo.5" 176 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-meteo/COPYING" 177 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-meteo/README.md" 178 179 lint: 180 mandoc -T lint -Wbase doc/smeteo.1 || [ $$? -le 1 ] 181 mandoc -T lint -Wbase doc/libstardis_smeteo.3 || [ $$? -le 1 ] 182 mandoc -T lint -Wbase doc/smeteo.5 || [ $$? -le 1 ] 183 184 clean: clean_test 185 rm -f $(DEP) $(OBJ) $(LIBNAME) 186 rm -f $(UTIL_DEP) $(UTIL_OBJ) smeteo 187 rm -f $(PLUGIN_DEP) $(PLUGIN_OBJ) libstardis_smeteo.so 188 rm -f .config .config_plugin libsmeteo.o smeteo.pc smeteo-local.pc 189 190 ################################################################################ 191 # Tests 192 ################################################################################ 193 TEST_SRC_stardis = src/test_stardis_smeteo.c 194 TEST_SRC = src/test_smeteo.c src/test_smeteo_load.c $(TEST_SRC_$(PLUGIN)) 195 TEST_OBJ = $(TEST_SRC:.c=.o) 196 TEST_DEP = $(TEST_SRC:.c=.d) 197 TEST_TGT = $(TEST_SRC:.c=.t) 198 199 TEST_stardis=Tsrf.pdf 200 201 TEST_FILES_INVALID =\ 202 samples/invalid_albedo.txt\ 203 samples/invalid_albedo2.txt\ 204 samples/invalid_longitude.txt\ 205 samples/invalid_longitude2.txt\ 206 samples/invalid_latitude.txt\ 207 samples/invalid_latitude2.txt\ 208 samples/invalid_date.txt\ 209 samples/invalid_date2.txt\ 210 samples/invalid_date3.txt\ 211 samples/invalid_date4.txt\ 212 samples/invalid_hour.txt\ 213 samples/invalid_hour2.txt\ 214 samples/invalid_hour3.txt\ 215 samples/invalid_Tsrf.txt\ 216 samples/invalid_Tatm.txt\ 217 samples/invalid_TAhum.txt\ 218 samples/invalid_TRhum.txt\ 219 samples/invalid_TRhum2.txt\ 220 samples/invalid_SWdn.txt\ 221 samples/invalid_SWdn_direct.txt\ 222 samples/invalid_SWdn_diffus.txt\ 223 samples/invalid_SWup.txt\ 224 samples/invalid_Trad.txt\ 225 samples/invalid_H.txt\ 226 samples/invalid_LE.txt\ 227 samples/invalid_day_1850.txt\ 228 samples/missing_data.txt\ 229 samples/variable_time_period.txt 230 231 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smeteo-local.pc) 232 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smeteo-local.pc) 233 234 CFLAGS_TEST = -std=c99 $(CFLAGS_EXE) $(INCS_TEST) 235 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 236 237 tests: library $(TEST_DEP) $(TEST_TGT) $(PLUGIN) 238 @$(MAKE) -fMakefile \ 239 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 240 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 241 test_list 242 243 $(TEST_TGT): 244 @{ \ 245 exe="$$(basename "$@" ".t")"; \ 246 printf '%s: %s\n' "$${exe}" $(@:.t=.o); \ 247 printf 'test_list: %s\n' "$${exe}"; \ 248 } > $@ 249 250 $(TEST_DEP): config.mk smeteo-local.pc 251 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 252 253 $(TEST_OBJ): config.mk smeteo-local.pc 254 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 255 256 test_smeteo \ 257 test_smeteo_load \ 258 : config.mk smeteo-local.pc $(LIBNAME) 259 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 260 261 # There is no pkg-config file for the stardis plugin, as it must be 262 # loaded at runtime by Stardis. Therefore, provide the library name 263 # directly for link editing. 264 test_stardis_smeteo: config.mk smeteo-local.pc $(LIBNAME) libstardis_smeteo.so 265 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) -lstardis_smeteo 266 267 clean_test: 268 rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT) 269 rm -f test.txt rm Tsrf.txt Tsrf.pdf 270 rm -f *.stl stardis_model_imposed_flux.txt stardis_model_external_source.txt 271 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 272 273 Tsrf.pdf: $(PLUGIN) Tsrf.txt src/plot.gp 274 gnuplot -e "Tsrf='Tsrf.txt'" src/plot.gp > Tsrf.pdf 275 276 Tsrf.txt: \ 277 libstardis_smeteo.so \ 278 src/test_stardis_smeteo_ground_temperature.sh \ 279 samples/star-meteo_input.txt 280 $(SHELL) src/test_stardis_smeteo_ground_temperature.sh \ 281 samples/star-meteo_input.txt > $@ 282 283 test_regular: tests util 284 @err=0; \ 285 for i in $(TEST_SRC); do \ 286 i="$$(basename "$${i}" '.c')"; \ 287 if ./"$${i}" "$$@" > /dev/null 2>&1; then \ 288 printf '%s\n' "$${i}"; \ 289 else \ 290 >&2 printf '%s: error %s\n' "$${i}" "$$?"; \ 291 err="$$((err+1))"; \ 292 fi; \ 293 done; \ 294 \ 295 for i in $(TEST_FILES_INVALID); do \ 296 if ! LD_LIBRARY_PATH=./:"$${LD_LIBRARY_PATH}" ./smeteo "$${i}" \ 297 > /dev/null 2>&1; then \ 298 printf '%s\n' "$${i}"; \ 299 else \ 300 >&2 printf '%s: error %s\n' "$${i}" "$$?"; \ 301 err="$$((err+1))"; \ 302 fi; \ 303 done; \ 304 \ 305 [ "$${err}" -eq 0 ] 306 307 test: test_regular $(TEST_$(PLUGIN))