commit 4a9554b0f8d22ea890fe0ae50216bb9ca44054a9
parent 3cb7c4260413a32c9337212e1268e34461e684ca
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Sun, 23 Mar 2025 10:41:12 +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.
Add the BINPREFIX, LIBPREFIX, INCPREFIX and MANPREFIX macros to control
the subdirectories into which binaries, libraries, header files and
documentation are copied. Systems may use locations other than those
proposed by default.
Diffstat:
| M | Makefile | | | 114 | ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- |
| M | config.mk | | | 17 | ++++++++--------- |
| D | make.sh | | | 92 | ------------------------------------------------------------------------------- |
3 files changed, 81 insertions(+), 142 deletions(-)
diff --git a/Makefile b/Makefile
@@ -22,6 +22,9 @@ LIBNAME_STATIC = libstar-sp.a
LIBNAME_SHARED = libstar-sp.so
LIBNAME = $(LIBNAME_$(LIB_TYPE))
+default: library
+all: library tests
+
################################################################################
# Star-SP building
################################################################################
@@ -36,7 +39,7 @@ SRC =\
OBJ = $(SRC:.c=.o)
DEP = $(SRC:.c=.d)
-build_library: .config $(DEP)
+library: .config $(DEP)
@$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \
$$(if [ -n "$(LIBNAME)" ]; then \
echo "$(LIBNAME)"; \
@@ -47,7 +50,7 @@ build_library: .config $(DEP)
$(DEP) $(OBJ): config.mk
$(LIBNAME_SHARED): $(OBJ)
- $(CXX) $(CXXFLAGS) $(AES_CFLAGS) $(DPDC_CFLAGS) -o $@ $(OBJ) $(LDFLAGS_SO) $(DPDC_LIBS)
+ $(CXX) $(CXXFLAGS) $(INCS) -o $@ $(OBJ) $(LDFLAGS_SO) $(LIBS)
$(LIBNAME_STATIC): libstar-sp.o
$(AR) -rc $@ $?
@@ -58,21 +61,19 @@ libstar-sp.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
- @if ! $(PKG_CONFIG) --atleast-version $(RANDOM123_VERSION) random123; then \
- echo "random123 $(RANDOM123_VERSION) not found" >&2; exit 1; fi
+ $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) random123
+ $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys
@echo "config done" > .config
.SUFFIXES: .c .d .o
.c.d:
- @$(CXX) $(CXXFLAGS) $(DPDC_CFLAGS) $(AES_CFLAGS) -MM -MT "$(@:.d=.o) $@" $< -MF $@
+ @$(CXX) $(CXXFLAGS) $(INCS) -MM -MT "$(@:.d=.o) $@" $< -MF $@
.c.o:
- $(CXX) $(CXXFLAGS) $(DPDC_CFLAGS) $(AES_CFLAGS) -DSSP_SHARED_BUILD -c $< -o $@
+ $(CXX) $(CXXFLAGS) $(INCS) -DSSP_SHARED_BUILD -c $< -o $@
################################################################################
-# Installation
+# Miscellaneous
################################################################################
pkg:
sed -e 's#@PREFIX@#$(PREFIX)#g' \
@@ -91,11 +92,16 @@ star-sp-local.pc: config.mk star-sp.pc.in
-e 's#@RANDOM123_VERSION@#$(RANDOM123_VERSION)#g'\
star-sp.pc.in > $@
-install: build_library pkg
- @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib" $(LIBNAME)
- @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/lib/pkgconfig" star-sp.pc
- @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/include/star" src/ssp.h
- @$(SHELL) make.sh install "$(DESTDIR)$(PREFIX)/share/doc/star-sp" COPYING README.md
+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" star-sp.pc; \
+ install 644 "$(DESTDIR)$(INCPREFIX)/star" src/ssp.h; \
+ install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-sp" COPYING README.md
uninstall:
rm -f "$(DESTDIR)$(PREFIX)/lib/$(LIBNAME)"
@@ -104,20 +110,9 @@ uninstall:
rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-sp/README.md"
rm -f "$(DESTDIR)$(PREFIX)/include/star/ssp.h"
-################################################################################
-# Miscellaneous targets
-################################################################################
-all: build_library build_tests
-
clean: clean_test
- rm -f $(OBJ) $(TEST_OBJ) $(LIBNAME)
- rm -f .config .test libstar-sp.o star-sp.pc star-sp-local.pc
-
-distclean: clean
- rm -f $(DEP) $(TEST_DEP)
-
-lint:
- shellcheck -o all make.sh
+ rm -f $(DEP) $(OBJ) $(LIBNAME)
+ rm -f .config libstar-sp.o star-sp.pc star-sp-local.pc
################################################################################
# Tests
@@ -139,28 +134,33 @@ TEST_SRC =\
src/test_ssp_rng_proxy.c
TEST_OBJ = $(TEST_SRC:.c=.o)
TEST_DEP = $(TEST_SRC:.c=.d)
+TEST_TGT = $(TEST_SRC:.c=.t)
PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG)
-SSP_CFLAGS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags star-sp-local.pc)
-SSP_LIBS = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs star-sp-local.pc)
-
-build_tests: build_library $(TEST_DEP) .test
- @$(MAKE) -fMakefile -f.test $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) test_bin
+INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags rsys star-sp-local.pc)
+LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs rsys star-sp-local.pc)
-test: build_tests
- @$(SHELL) make.sh run_test "$(AES_CFLAGS)" $(TEST_SRC)
+CFLAGS_TEST = $(CFLAGS) $(INCS_TEST)
+LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) -lm
-.test: Makefile
- @$(SHELL) make.sh config_test $(TEST_SRC) > .test
+tests: library $(TEST_DEP) $(TEST_TGT)
+ @$(MAKE) -fMakefile \
+ $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \
+ $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \
+ test_list
-clean_test:
- @$(SHELL) make.sh clean_test $(TEST_SRC)
+$(TEST_TGT):
+ @{ \
+ exe="$$(basename "$@" ".t")"; \
+ printf '%s: %s\n' "$${exe}" $(@:.t=.o); \
+ printf 'test_list: %s\n' "$${exe}"; \
+ } > $@
$(TEST_DEP): config.mk star-sp-local.pc
- @$(CC) $(CFLAGS) $(SSP_CFLAGS) $(RSYS_CFLAGS) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@
+ @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@
$(TEST_OBJ): config.mk star-sp-local.pc
- $(CC) $(CFLAGS) $(SSP_CFLAGS) $(RSYS_CFLAGS) -c $(@:.o=.c) -o $@
+ $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@
test_ssp_ran_circle \
test_ssp_ran_discrete \
@@ -177,4 +177,36 @@ test_ssp_ran_uniform_disk \
test_ssp_rng \
test_ssp_rng_proxy \
: config.mk star-sp-local.pc $(LIBNAME)
- $(CC) $(CFLAGS) -o $@ src/$@.o $(LDFLAGS_EXE) $(SSP_LIBS) $(RSYS_LIBS) -lm
+ $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST)
+
+clean_test:
+ rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT)
+ for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done
+
+test: tests
+ @err=0; \
+ check() { name="$$1"; exe="$$2"; shift 2; \
+ printf '%s %s' "$${name}" "$$@"; \
+ if "./$${exe}" "$$@"> /dev/null 2>&1; then \
+ printf '\n'; \
+ else \
+ printf ': error %s\n' "$$?"; \
+ err=$$((err+1)); \
+ fi \
+ }; \
+ for i in $(TEST_SRC); do \
+ test="$$(basename "$${i}" ".c")"; \
+ if [ "$${test}" != "test_ssp_rng" ]; then \
+ check "$${test}" "$${test}"; \
+ else \
+ if [ -n "$(AES_CFLAGS)" ]; then \
+ check test_ssp_rng_aes test_ssp_rng aes; \
+ fi; \
+ check test_ssp_rng_kiss test_ssp_rng kiss; \
+ check test_ssp_rng_mt19937_64 test_ssp_rng mt19937_64; \
+ check test_ssp_rng_ranlux48 test_ssp_rng ranlux48; \
+ check test_ssp_rng_random_device test_ssp_rng random_device; \
+ check test_ssp_rng_threefry test_ssp_rng threefry; \
+ fi \
+ done; \
+ [ "$${err}" -eq 0 ]
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
################################################################################
@@ -26,15 +31,9 @@ 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)
-
RANDOM123_VERSION = 1.14
-RANDOM123_CFLAGS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags random123)
-RANDOM123_LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs random123)
-
-DPDC_CFLAGS = $(RSYS_CFLAGS) $(RANDOM123_CFLAGS)
-DPDC_LIBS = $(RSYS_LIBS) $(RANDOM123_LIBS)
+INCS = $$($(PKG_CONFIG) $(PCFLAGS) --cflags random123 rsys)
+LIBS = $$($(PKG_CONFIG) $(PCFLAGS) --libs random123 rsys)
################################################################################
# Compilation options
@@ -75,7 +74,7 @@ CFLAGS = $(CFLAGS_$(BUILD_TYPE)) -fPIE
CXXFLAGS_RELEASE = -O2 -DNDEBUG $(CXXFLAGS_COMMON)
CXXFLAGS_DEBUG = -g $(CXXFLAGS_COMMON)
-CXXFLAGS = $(CXXFLAGS_$(BUILD_TYPE)) -fPIC
+CXXFLAGS = $(CXXFLAGS_$(BUILD_TYPE)) $(AES_CFLAGS) -fPIC
################################################################################
# Linker options
diff --git a/make.sh b/make.sh
@@ -1,92 +0,0 @@
-#!/bin/sh
-
-# Copyright (C) 2015-2025 |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}"
-}
-
-check()
-{
- name="$1"
- prog="$2"
- shift 2
-
- printf "%s " "${name}"
- if ./"${prog}" "$@" > /dev/null 2>&1; then
- printf "\033[1;32mOK\033[m\n"
- else
- printf "\033[1;31mError\033[m\n"
- fi
-}
-
-run_test()
-{
- aes_flags=$1
- shift 1
-
- for i in "$@"; do
- test=$(basename "${i}" ".c")
- if ! [ "${test}" = "test_ssp_rng" ]; then
- check "${test}" "${test}"
- else
- if [ -n "${aes_flags}" ]; then
- check "${test}_aes" "${test}" aes
- fi
- check "${test}_kiss" "${test}" kiss
- check "${test}_mt19937_64" "${test}" mt19937_64
- check "${test}_ranlux48" "${test}" ranlux48
- check "${test}_random_device" "${test}" random_device
- check "${test}_threefry" "${test}" threefry
- 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
-}
-
-"$@"