htgop

Optical properties of a gas mixture
git clone git://git.meso-star.fr/htgop.git
Log | Files | Refs | README | LICENSE

commit de2b4c7b595b023f5ae787625f1b8c308cac27c5
parent af3a3cdba9e503c6e664ce8826a4be8a836ba383
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  6 Sep 2023 11:24:19 +0200

Write a POSIX Makefile to replace CMake

The build procedure is written in POSIX make, which the user can
configure via the config.mk file. The make.sh script contains commands
that could be found directly in POSIX make, but which are placed here to
simplify writing the Makefile. Finally, a pkg-config file is provided to
link the library as an external dependency.

In addition to the features already provided in its CMake alternative,
this Makefile supports the construction of static libraries and provides
an uninstall target. In any case, the main motivation behind its writing
is to use a good old well-established standard with simple features,
available on all UNIX systems, thus simplifying its portability and
support while being much lighter.

Diffstat:
M.gitignore | 15++++++++-------
AMakefile | 156+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig.mk | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahtgop.pc.in | 10++++++++++
Amake.sh | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 301 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,12 +1,13 @@ .gitignore -CMakeCache.txt -CMakeFiles -Makefile -tmp [Bb]uild* *.sw[po] -*.[ao] -*.orig +*.[aod] +*.so *~ +test* +!test*.[ch] +.config +.test tags - +*.pc +etc/ diff --git a/Makefile b/Makefile @@ -0,0 +1,156 @@ +# Copyright (C) 2018-2021, 2023 |Méso|Star> (contact@meso-star.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +.POSIX: +.SUFFIXES: # Clean up default inference rules + +include config.mk + +LIBNAME_STATIC = libhtgop.a +LIBNAME_SHARED = libhtgop.so +LIBNAME = $(LIBNAME_$(LIB_TYPE)) + +################################################################################ +# Library building +################################################################################ +SRC = src/htgop.c +OBJ = $(SRC:.c=.o) +DEP = $(SRC:.c=.d) + +build_library: .config $(DEP) + @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ + $$(if [ -n "$(LIBNAME)" ]; then \ + echo "$(LIBNAME)"; \ + else \ + echo "$(LIBNAME_SHARED)"; \ + fi) + +$(DEP) $(OBJ): config.mk + +$(LIBNAME_SHARED): $(OBJ) + $(CC) $(CFLAGS) $(RSYS_CFLAGS) -o $@ $(OBJ) $(LDFLAGS) $(SOFLAGS) $(RSYS_LIBS) -lm + +$(LIBNAME_STATIC): $(OBJ) + $(AR) -rc $@ $? + $(RANLIB) $@ + +.config: config.mk + @if ! $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys; then \ + echo "rsys $(RSYS_VERSION) not found" >&2; exit 1; fi + @echo "config done" > $@ + +.SUFFIXES: .c .d .o +.c.d: + @$(CC) $(CFLAGS) $(RSYS_CFLAGS) -MM -MT "$(@:.d=.o) $@" $< -MF $@ + +.c.o: + $(CC) $(CFLAGS) $(RSYS_CFLAGS) -DHTGOP_SHARED_BUILD -c $< -o $@ + +################################################################################ +# Installation +################################################################################ +pkg: + sed -e 's#@PREFIX@#$(PREFIX)#g'\ + -e 's#@VERSION@#$(VERSION)#g'\ + -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ + htgop.pc.in > htgop.pc + +htgop-local.pc: htgop.pc.in + sed -e '1d'\ + -e 's#^includedir=.*#includedir=./src/#'\ + -e 's#^libdir=.*#libdir=./#'\ + -e 's#@VERSION@#$(VERSION)#g'\ + -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ + htgop.pc.in > $@ + +install: build_library pkg + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib" $(LIBNAME) + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib/pkgconfig" htgop.pc + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/include/high_tune/" src/htgop.h + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/share/doc/htgop" COPYING README.md + +uninstall: + rm -f "$(DESTDIR)$(PREFIX)/lib/$(LIBNAME)" + rm -f "$(DESTDIR)$(PREFIX)/lib/pkgconfig/htgop.pc" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/htgop/COPYING" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/htgop/README.md" + rm -f "$(DESTDIR)$(PREFIX)/include/high_tune/htgop.h" + +################################################################################ +# Miscellaneous targets +################################################################################ +all: build_library build_tests + +clean: clean_test + rm -f $(OBJ) $(TEST_OBJ) $(LIBNAME) .config .test htgop.pc htgop-local.pc + +distclean: clean + rm -f $(DEP) $(TEST_DEP) + +lint: + shellcheck -o all make.sh + +################################################################################ +# Tests +################################################################################ +TEST_SRC =\ + src/test_htgop.c\ + src/test_htgop_fetch_radiative_properties.c\ + src/test_htgop_get_radiative_properties_bounds.c\ + src/test_htgop_load.c\ + src/test_htgop_sample.c +TEST_OBJ = $(TEST_SRC:.c=.o) +TEST_DEP = $(TEST_SRC:.c=.d) +TEST_FILE=etc/ecrad_opt_prop.txt + +PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) +HTGOP_CFLAGS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags htgop-local.pc) +HTGOP_LIBS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs htgop-local.pc) + +test: build_tests etc/ecrad_opt_prop.txt + @$(SHELL) make.sh check test_htgop + @$(SHELL) make.sh check test_htgop_fetch_radiative_properties "$(TEST_FILE)" + @$(SHELL) make.sh check test_htgop_get_radiative_properties_bounds "$(TEST_FILE)" + @$(SHELL) make.sh check test_htgop_load "$(TEST_FILE)" + @$(SHELL) make.sh check test_htgop_sample "$(TEST_FILE)" + +build_tests: build_library $(TEST_DEP) .test + @$(MAKE) -fMakefile -f.test $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) test_bin + +.test: Makefile make.sh + @$(SHELL) make.sh config_test $(TEST_SRC) > $@ + +clean_test: + $(SHELL) make.sh clean_test $(TEST_SRC) + +$(TEST_DEP): config.mk htgop-local.pc + @$(CC) $(CFLAGS) $(RSYS_CFLAGS) $(HTGOP_CFLAGS) \ + -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ + +$(TEST_OBJ): config.mk htgop-local.pc + $(CC) $(CFLAGS) $(RSYS_CFLAGS) $(HTGOP_CFLAGS) -c $(@:.o=.c) -o $@ + +test_htgop \ +test_htgop_fetch_radiative_properties \ +test_htgop_get_radiative_properties_bounds \ +test_htgop_load \ +test_htgop_sample \ +: config.mk htgop-local.pc + $(CC) -o $@ src/$@.o $(RSYS_LIBS) $(HTGOP_LIBS) -lm + +# Touch the target to update its timestamp. Otherwise, the extracted file will +# have a timestamp lower than its prerequisite, forcing its re-extraction. +etc/ecrad_opt_prop.txt: etc.tgz + tar xzvf etc.tgz && touch $@ diff --git a/config.mk b/config.mk @@ -0,0 +1,60 @@ +VERSION = 0.1.2 +PREFIX = /usr/local + +LIB_TYPE = SHARED +#LIB_TYPE = STATIC + +BUILD_TYPE = RELEASE +#BUILD_TYPE = DEBUG + +################################################################################ +# Tools +################################################################################ +AR = ar +CC = cc +PKG_CONFIG = pkg-config +RANLIB = ranlib + +################################################################################ +# Dependencies +################################################################################ +PCFLAGS_SHARED = +PCFLAGS_STATIC = --static +PCFLAGS = $(PCFLAGS_$(LIB_TYPE)) + +RSYS_VERSION = 0.7 +RSYS_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags rsys) +RSYS_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs rsys) + +################################################################################ +# Compilation options +################################################################################ +WFLAGS =\ + -Wall\ + -Wcast-align\ + -Wconversion\ + -Wextra\ + -Wmissing-declarations\ + -Wmissing-prototypes\ + -Wshadow + +CFLAGS_COMMON =\ + -std=c89\ + -pedantic\ + -fPIC\ + -fvisibility=hidden\ + -fstrict-aliasing\ + $(WFLAGS) + +CFLAGS_RELEASE = -O2 -DNDEBUG $(CFLAGS_COMMON) +CFLAGS_DEBUG = -g $(CFLAGS_COMMON) +CFLAGS = $(CFLAGS_$(BUILD_TYPE)) + +################################################################################ +# Linker options +################################################################################ +SOFLAGS = -shared -Wl,--no-undefined + +LDFLAGS_DEBUG = +LDFLAGS_RELEASE = -s +LDFLAGS = $(LDFLAGS_$(BUILD_TYPE)) diff --git a/htgop.pc.in b/htgop.pc.in @@ -0,0 +1,10 @@ +prefix=@PREFIX@ +includedir=${prefix}/include +libdir=${prefix}/lib + +Requires: rsys >= @RSYS_VERSION@ +Name: htgop +Description: High-Tune Gas Optical Properties +Version: @VERSION@ +Libs: -L${libdir} -lhtgop +CFlags: -I${includedir} diff --git a/make.sh b/make.sh @@ -0,0 +1,67 @@ +#!/bin/sh -e + +# Copyright (C) 2018-2021, 2023 |Méso|Star> (contact@meso-star.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +config_test() +{ + for i in "$@"; do + test=$(basename "${i}" ".c") + test_list="${test_list} ${test}" + printf "%s: %s\n" "${test}" "src/${test}.o" + done + printf "test_bin: %s\n" "${test_list}" +} + +check() +{ + prog="$1" + shift 1 + + printf "%s " "${prog}" + if ./"${prog}" "$@" > /dev/null 2>&1; then + printf "\e[1;32mOK\e[m\n" + else + printf "\e[1;31mError\e[m\n" + fi +} + +clean_test() +{ + for i in "$@"; do + rm -f "$(basename "${i}" ".c")" + done +} + +install() +{ + prefix=$1 + shift 1 + + mkdir -p "${prefix}" + + for i in "$@"; do + dst="${prefix}/${i##*/}" + + if cmp -s "${i}" "${dst}"; then + printf "Up to date %s\n" "${dst}" + else + printf "Installing %s\n" "${dst}" + cp "${i}" "${prefix}" + fi + done +} + +"$@"