star-meteo

Time varying meteorological data
git clone git://git.meso-star.fr/star-meteo.git
Log | Files | Refs | README | LICENSE

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))