star-mesh

Define and load a binary data format for meshes
git clone git://git.meso-star.fr/star-mesh.git
Log | Files | Refs | README | LICENSE

commit 3bc74c4136c1b9185fe1816a7983ddac8cc1ffef
parent c78fd06783367bf0821e4c4f3c52d2257446e49c
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 26 Feb 2025 11:36:48 +0100

Rewriting the Makefile

Delete the make.sh script. It implemented functions which, while
contributing to the clarity of the Makefile, made the build system less
compact. All these functions can be implemented with just a few lines of
shell code, without any major impact on the clarity of the Makefile.
Perhaps on the contrary, since it's all in one place.

Diffstat:
MMakefile | 134++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mconfig.mk | 10+++++++---
Dmake.sh | 70----------------------------------------------------------------------
3 files changed, 86 insertions(+), 128 deletions(-)

diff --git a/Makefile b/Makefile @@ -14,7 +14,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. .POSIX: -.SUFFIXES: # Clean up default inference rules +.SUFFIXES: .b .c .d .o include config.mk @@ -22,14 +22,20 @@ LIBNAME_STATIC = libsmsh.a LIBNAME_SHARED = libsmsh.so LIBNAME = $(LIBNAME_$(LIB_TYPE)) +default: library $(ADDONS) +all: default tests + ################################################################################ -# Library building +# Library ################################################################################ SRC = src/smsh.c src/smsh_log.c OBJ = $(SRC:.c=.o) DEP = $(SRC:.c=.d) -build_library: .config $(DEP) +CFLAGS_LIB = -std=c89 $(CFLAGS_SO) $(INCS) -DSMSH_SHARED_BUILD +LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) + +library: .config $(DEP) @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ $$(if [ -n "$(LIBNAME)" ]; then\ echo "$(LIBNAME)";\ @@ -40,7 +46,7 @@ build_library: .config $(DEP) $(DEP) $(OBJ): config.mk $(LIBNAME_SHARED): $(OBJ) - $(CC) $(CFLAGS_SO) $(RSYS_CFLAGS) -o $@ $(OBJ) $(LDFLAGS_SO) $(RSYS_LIBS) + $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) $(LIBNAME_STATIC): libsmsh.o $(AR) -rc $@ $? @@ -51,19 +57,20 @@ libsmsh.o: $(OBJ) $(OBJCOPY) $(OCPFLAGS) $@ .config: config.mk - @if ! $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys; then\ - echo "rsys $(RSYS_VERSION) not found" >&2; exit 1; fi + $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys @echo "config done" > $@ .SUFFIXES: .c .d .o .c.d: - @$(CC) $(CFLAGS_SO) $(RSYS_CFLAGS) -MM -MT "$(@:.d=.o) $@" $< -MF $@ + @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ .c.o: - $(CC) $(CFLAGS_SO) $(RSYS_CFLAGS) -DSMSH_SHARED_BUILD -c $< -o $@ + $(CC) $(CFLAGS_LIB) -DSMSH_SHARED_BUILD -c $< -o $@ + +PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) ################################################################################ -# Installation +# Miscellaneous ################################################################################ pkg: sed -e 's#@PREFIX@#$(PREFIX)#g' \ @@ -79,68 +86,85 @@ smsh-local.pc: smsh.pc.in -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ smsh.pc.in > $@ -install: build_library pkg - @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib" $(LIBNAME) - @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib/pkgconfig" smsh.pc - @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/include/star" src/smsh.h - @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/share/doc/star-mesh" COPYING README.md - @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/share/man/man5" smsh.5 +install: library pkg + install() { mode="$$1"; prefix="$$2"; shift 2; \ + mkdir -p "$${prefix}"; \ + cp "$$@" "$${prefix}"; \ + chmod "$${mode}" "$$@"; \ + }; \ + install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ + install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" smsh.pc; \ + install 644 "$(DESTDIR)$(INCPREFIX)/star" src/smsh.h; \ + install 644 "$(DESTDIR)$(MANPREFIX)/man5" smsh.5; \ + install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-mesh" COPYING README.md uninstall: - rm -f "$(DESTDIR)$(PREFIX)/lib/$(LIBNAME)" - rm -f "$(DESTDIR)$(PREFIX)/lib/pkgconfig/smsh.pc" + rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" + rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/smsh.pc" + rm -f "$(DESTDIR)$(INCPREFIX)/star/smsh.h" + rm -f "$(DESTDIR)$(MANPREFIX)/man5/smsh.5" rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-mesh/COPYING" rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-mesh/README.md" - rm -f "$(DESTDIR)$(PREFIX)/include/star/smsh.h" - rm -f "$(DESTDIR)$(PREFIX)/share/man/man5/smsh.5" - -################################################################################ -# Miscellaneous targets -################################################################################ -all: build_library build_tests - -clean: clean_test - rm -f $(OBJ) $(TEST_OBJ) $(LIBNAME) - rm -f .config .test libsmsh.o smsh.pc smsh-local.pc - rm -f test_file.smsh - -distclean: clean - rm -f $(DEP) $(TEST_DEP) lint: - shellcheck -o all make.sh mandoc -T lint -Wbase smsh.5 +clean: clean_test + rm -f $(DEP) $(OBJ) $(LIBNAME) + rm -f .config libsmsh.o smsh.pc smsh-local.pc + ################################################################################ # Tests ################################################################################ TEST_SRC = src/test_smsh.c src/test_smsh_load.c TEST_OBJ = $(TEST_SRC:.c=.o) TEST_DEP = $(TEST_SRC:.c=.d) - -PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) -SMSH_CFLAGS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags smsh-local.pc) -SMSH_LIBS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs smsh-local.pc) - -test: build_tests - @$(SHELL) make.sh run_test $(TEST_SRC) - -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 - @echo "Setup tests" - @$(SHELL) make.sh config_test $(TEST_SRC) > $@ - -clean_test: - @$(SHELL) make.sh clean_test $(TEST_SRC) +TEST_BIN = $(TEST_SRC:.c=.b) + +INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys smsh-local.pc) +LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys smsh-local.pc) + +CFLAGS_TEST = -std=c89 $(CFLAGS_EXE) $(INCS_TEST) +LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) + +test: tests + @err=0; \ + for i in $(TEST_SRC); do \ + test="$$(basename "$${i}" ".c")"; \ + if "./$${test}" > /dev/null 2>&1; then \ + printf '%s\n' "$${test}"; \ + else \ + >&2 printf '%s: error %s\n' "$${test}" "$$?"; \ + err=$$((err+1)); \ + fi \ + done; \ + [ "$${err}" -eq 0 ] + +tests: library $(TEST_DEP) $(TEST_BIN) + @$(MAKE) -fMakefile \ + $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ + $$(for i in $(TEST_BIN); do echo -f"$${i}"; done) \ + test_bin + +.c.b: + @{ \ + bin="$$(basename "$<" ".c")"; \ + printf '%s: %s\n' "$${bin}" $(<:.c=.o); \ + printf 'test_bin: %s\n' "$${bin}"; \ + } > $@ $(TEST_DEP): config.mk smsh-local.pc - @$(CC) $(CFLAGS_EXE) $(RSYS_CFLAGS) $(SMSH_CFLAGS) \ - -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ + @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ $(TEST_OBJ): config.mk smsh-local.pc - $(CC) $(CFLAGS_EXE) $(RSYS_CFLAGS) $(SMSH_CFLAGS) -c $(@:.o=.c) -o $@ + $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ + +test_smsh \ +test_smsh_load \ +: config.mk smsh-local.pc $(LIBNAME) + $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) -test_smsh test_smsh_load: config.mk smsh-local.pc $(LIBNAME) - $(CC) $(CFLAGS_EXE) -o $@ src/$@.o $(LDFLAGS_EXE) $(SMSH_LIBS) $(RSYS_LIBS) +clean_test: + rm -f $(TEST_BIN) $(TEST_DEP) $(TEST_OBJ) + rm -f test_file.smsh + for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done diff --git a/config.mk b/config.mk @@ -7,6 +7,11 @@ LIB_TYPE = SHARED BUILD_TYPE = RELEASE #BUILD_TYPE = DEBUG +BINPREFIX = $(PREFIX)/bin +LIBPREFIX = $(PREFIX)/lib +INCPREFIX = $(PREFIX)/include +MANPREFIX = $(PREFIX)/share/man + ################################################################################ # Tools ################################################################################ @@ -25,8 +30,8 @@ PCFLAGS_STATIC = --static PCFLAGS = $(PCFLAGS_$(LIB_TYPE)) RSYS_VERSION=0.14 -RSYS_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags rsys) -RSYS_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs rsys) +INCS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags rsys) +LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs rsys) ################################################################################ # Compilation options @@ -47,7 +52,6 @@ CFLAGS_HARDENED =\ -fstack-protector-strong CFLAGS_COMMON =\ - -std=c89\ -pedantic\ -fvisibility=hidden\ -fstrict-aliasing\ diff --git a/make.sh b/make.sh @@ -1,70 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2020-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/>. - -set -e - -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 "\033[1;32mOK\033[m\n" - else - printf "\033[1;31mError\033[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 -} - -"$@"