atrstm

Load and structure a combustion gas mixture
git clone git://git.meso-star.fr/atrstm.git
Log | Files | Refs | README | LICENSE

commit da7accd3266a8c9298f252460d2ec529a60ebd65
parent 6d97d2c07b48bc6fffcfe3e726befefc1f88dff2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 31 Aug 2023 15:56:21 +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 | 14+++++++-------
AMakefile | 195+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aatrstm.pc.in | 12++++++++++++
Aconfig.mk | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amake.sh | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 389 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,12 +1,12 @@ .gitignore -CMakeCache.txt -CMakeFiles -Makefile -tmp [Bb]uild* *.sw[po] -*.[ao] -*.orig +*.[aod] +*.so *~ +test* +!test*.[ch] +.config +.test tags - +*.pc diff --git a/Makefile b/Makefile @@ -0,0 +1,195 @@ +# Copyright (C) 2022, 2023 |Méso|Star> (contact@meso-star.com) +# Copyright (C) 2020, 2021 Centre National de la Recherche Scientifique +# +# 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 = libatrstm.a +LIBNAME_SHARED = libatrstm.so +LIBNAME = $(LIBNAME_$(LIB_TYPE)) + +################################################################################ +# Library building +################################################################################ +SRC =\ + src/atrstm.c\ + src/atrstm_cache.c\ + src/atrstm_dump_svx_octree.c\ + src/atrstm_log.c\ + src/atrstm_partition.c\ + src/atrstm_radcoefs.c\ + src/atrstm_rdgfa.c\ + src/atrstm_setup_octrees.c\ + src/atrstm_setup_uvm.c\ + src/atrstm_svx.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) $(DPDC_LIBS) + +$(LIBNAME_STATIC): $(OBJ) + $(AR) -rc $@ $? + $(RANLIB) $@ + +.config: config.mk + @if ! $(PKG_CONFIG) --atleast-version $(ATRRI_VERSION) atrri; then \ + echo "atrri $(ATRRI_VERSION) not found" >&2; exit 1; fi + @if ! $(PKG_CONFIG) --atleast-version $(ATRTP_VERSION) atrtp; then \ + echo "atrtp $(ATRTP_VERSION) not found" >&2; exit 1; fi + @if $(RSIMD_EXISTS); then \ + if ! $(PKG_CONFIG) --atleast-version $(RSIMD_VERSION) rsimd; then \ + echo "rsimd $(RSIMD_VERSION) not found" >&2; exit 1; fi; fi + @if ! $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys; then \ + echo "rsys $(RSYS_VERSION) not found" >&2; exit 1; fi + @if ! $(PKG_CONFIG) --atleast-version $(SMSH_VERSION) smsh; then \ + echo "smsh $(SMSH_VERSION) not found" >&2; exit 1; fi + @if ! $(PKG_CONFIG) --atleast-version $(SUVM_VERSION) suvm; then \ + echo "suvm $(SUVM_VERSION) not found" >&2; exit 1; fi + @if ! $(PKG_CONFIG) --atleast-version $(SVX_VERSION) svx; then \ + echo "svx $(SVX_VERSION) not found" >&2; exit 1; fi + @echo "config done" > $@ + +.SUFFIXES: .c .d .o +.c.d: + @$(CC) $(CFLAGS) $(DPDC_CFLAGS) -MM -MT "$(@:.d=.o) $@" $< -MF $@ + +.c.o: + $(CC) $(CFLAGS) $(DPDC_CFLAGS) -DATRSTM_SHARED_BUILD -c $< -o $@ + +################################################################################ +# Installation +################################################################################ +pkg: + sed -e 's#@PREFIX@#$(PREFIX)#g'\ + -e 's#@VERSION@#$(VERSION)#g'\ + -e 's#@ATRRI_VERSION@#$(ATRRI_VERSION)#g'\ + -e 's#@ATRTP_VERSION@#$(ATRTP_VERSION)#g'\ + -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ + -e 's#@SMSH_VERSION@#$(SMSH_VERSION)#g'\ + -e 's#@SUVM_VERSION@#$(SUVM_VERSION)#g'\ + -e 's#@SVX_VERSION@#$(SVX_VERSION)#g'\ + atrstm.pc.in | \ + if $(RSIMD_EXISTS); then \ + sed 's#@RSIMD@#, rsimd >= $(RSIMD_VERSION)#g'; \ + else \ + cat; \ + fi > atrstm.pc + +atrstm-local.pc: atrstm.pc.in + sed -e '1d'\ + -e 's#^includedir=.*#includedir=./src/#'\ + -e 's#^libdir=.*#libdir=./#'\ + -e 's#@VERSION@#$(VERSION)#g'\ + -e 's#@ATRRI_VERSION@#$(ATRRI_VERSION)#g'\ + -e 's#@ATRTP_VERSION@#$(ATRTP_VERSION)#g'\ + -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ + -e 's#@SMSH_VERSION@#$(SMSH_VERSION)#g'\ + -e 's#@SUVM_VERSION@#$(SUVM_VERSION)#g'\ + -e 's#@SVX_VERSION@#$(SVX_VERSION)#g'\ + atrstm.pc.in | \ + if $(RSIMD_EXISTS); then \ + sed 's#@RSIMD@#, rsimd >= $(RSIMD_VERSION)#g'; \ + else \ + sed 's#@RSIMD@##g'; \ + fi > $@ + +install: build_library pkg + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib" $(LIBNAME) + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib/pkgconfig" atrstm.pc + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/include/astoria" src/atrstm.h + @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/share/doc/atrstm" COPYING README.md + +uninstall: + rm -f "$(DESTDIR)$(PREFIX)/lib/$(LIBNAME)" + rm -f "$(DESTDIR)$(PREFIX)/lib/pkgconfig/atrstm.pc" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/atrstm/COPYING" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/atrstm/README.md" + rm -f "$(DESTDIR)$(PREFIX)/include/astoria/atrstm.h" + +################################################################################ +# Miscellaneous targets +################################################################################ +all: build_library build_tests + +clean: clean_test + rm -f $(OBJ) $(TEST_OBJ) $(LIBNAME) .config .test atrstm.pc atrstm-local.pc + +distclean: clean + rm -f $(DEP) $(TEST_DEP) + +lint: + shellcheck -o all make.sh + +################################################################################ +# Tests +################################################################################ +TEST_SRC =\ + src/test_atrstm.c\ + src/test_atrstm_radcoefs.c\ + src/test_atrstm_radcoefs_simd.c +TEST_OBJ = $(TEST_SRC:.c=.o) +TEST_DEP = $(TEST_SRC:.c=.d) + +PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) +ATRSTM_CFLAGS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags atrstm-local.pc) +ATRSTM_LIBS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs atrstm-local.pc) + +test: build_tests + @$(SHELL) make.sh run_test \ + src/test_atrstm_radcoefs.c \ + $$($(RSIMD_EXISTS) && echo src/test_atrstm_radcoefs_simd.c) + +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 \ + src/test_atrstm.c \ + src/test_atrstm_radcoefs.c \ + $$($(RSIMD_EXISTS) && echo src/test_atrstm_radcoefs_simd.c) \ + > $@ + +clean_test: + $(SHELL) make.sh clean_test $(TEST_SRC) + +$(TEST_DEP): config.mk atrstm-local.pc + @$(CC) $(CFLAGS) $(RSYS_CFLAGS) $(ATRSTM_CFLAGS) \ + -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ + +src/test_atrstm.o src/test_atrstm_radcoefs.o: config.mk atrstm-local.pc + $(CC) $(CFLAGS) $(RSYS_CFLAGS) $(ATRSTM_CFLAGS) -c $(@:.o=.c) -o $@ + +src/test_atrstm_radcoefs_simd.o: config.mk atrstm-local.pc + $(CC) $(CFLAGS) $(RSYS_CFLAGS) $(ATRSTM_CFLAGS) $(RSIMD_CFLAGS) -c $(@:.o=.c) -o $@ + +test_atrstm test_atrstm_radcoefs: config.mk atrstm-local.pc + $(CC) -o $@ src/$@.o $(RSYS_LIBS) $(ATRSTM_LIBS) -lm + +test_atrstm_radcoefs_simd: config.mk atrstm-local.pc + $(CC) -o $@ src/$@.o $(RSYS_LIBS) $(ATRSTM_LIBS) $(RSIMD_LIBS) diff --git a/atrstm.pc.in b/atrstm.pc.in @@ -0,0 +1,12 @@ +prefix=@PREFIX@ +includedir=${prefix}/include +libdir=${prefix}/lib + +Requires: rsys >= @RSYS_VERSION@, suvm >= @SUVM_VERSION@, svx >= @SVX_VERSION@ +Requires.private: atrri >= @ATRRI_VERSION@, atrtp >= @ATRTP_VERSION@, smsh >= @SMSH_VERSION@ @RSIMD@ +Name: atrstm +Description: AsToRia Semi-Transparent Medium library +Version: @VERSION@ +Libs: -L${libdir} -latrstm +Libs.private: -fopenmp +CFlags: -I${includedir} diff --git a/config.mk b/config.mk @@ -0,0 +1,105 @@ +VERSION = 0.0.1 +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)) + +ATRRI_VERSION = 0.0 +ATRRI_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags atrri) +ATRRI_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs atrri) + +ATRTP_VERSION = 0.0 +ATRTP_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags atrtp) +ATRTP_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs atrtp) + +RSIMD_VERSION = 0.3 +RSIMD_EXISTS = $(PKG_CONFIG) --exists rsimd +RSIMD_CFLAGS = $$($(RSIMD_EXISTS) && $(PKG_CONFIG) $(PCFLAGS) --cflags rsimd) +RSIMD_LIBS = $$($(RSIMD_EXISTS) && $(PKG_CONFIG) $(PCFLAGS) --libs rsimd) + +RSYS_VERSION = 0.12 +RSYS_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags rsys) +RSYS_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs rsys) + +SMSH_VERSION = 0.1 +SMSH_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags smsh) +SMSH_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs smsh) + +SUVM_VERSION = 0.2 +SUVM_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags suvm) +SUVM_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs suvm) + +SVX_VERSION = 0.2 +SVX_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags svx) +SVX_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs svx) + +DPDC_CFLAGS =\ + $(ATRRI_CFLAGS)\ + $(ATRTP_CFLAGS)\ + $(RSIMD_CFLAGS)\ + $(RSYS_CFLAGS)\ + $(SMSH_CFLAGS)\ + $(SUVM_CFLAGS)\ + $(SVX_CFLAGS)\ + -fopenmp +DPDC_LIBS=\ + $(ATRRI_LIBS)\ + $(ATRTP_LIBS)\ + $(RSIMD_LIBS)\ + $(RSYS_LIBS)\ + $(SMSH_LIBS)\ + $(SUVM_LIBS)\ + $(SVX_LIBS)\ + -fopenmp\ + -lm + +################################################################################ +# 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/make.sh b/make.sh @@ -0,0 +1,70 @@ +#!/bin/sh -e + +# Copyright (C) 2022, 2023 |Méso|Star> (contact@meso-star.com) +# Copyright (C) 2020, 2021 Centre National de la Recherche Scientifique +# +# 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}" +} + +run_test() +{ + for i in "$@"; do + test=$(basename "${i}" ".c") + + printf "%s " "${test}" + if "./${test}" > /dev/null 2>&1; then + printf "\e[1;32mOK\e[m\n" + else + printf "\e[1;31mError\e[m\n" + fi + done 2> /dev/null +} + + +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 +} + +"$@"