From f45899ff8dba90264409eb3fe7a29bb08ce2ee3c Mon Sep 17 00:00:00 2001 From: epochryphon Date: Mon, 31 Aug 2026 05:10:53 +0200 Subject: [PATCH] Update makefile --- makefile | 182 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 145 insertions(+), 37 deletions(-) diff --git a/makefile b/makefile index 030cf1a..ee76535 100644 --- a/makefile +++ b/makefile @@ -1,33 +1,114 @@ .POSIX: -CC = gcc -CFLAGS = -std=c17 \ - -pedantic -pedantic-errors -Werror -Wall -Wextra -Wshadow \ - -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition \ - -Wformat=2 -Wcast-qual -Wwrite-strings -Winit-self -Wnull-dereference \ - -Wdouble-promotion -Wconversion -Wsign-conversion -Wsign-compare \ - -Wtype-limits -Wunreachable-code -Wswitch-enum -Wswitch-default \ - -Wundef -Wendif-labels -Wpointer-arith -Wredundant-decls \ - -Wbad-function-cast -Wmissing-noreturn -Wnested-externs -Wlogical-op \ - -Wclobbered -Wfloat-equal -Wrestrict -Wsequence-point -Waddress \ - -Wvla -Wduplicated-cond -Wduplicated-branches -fno-common -ftrapv \ - -fstack-protector-strong - -LIBS = -DEBUG_FLAGS = -g3 -O0 -fsanitize=undefined -RELEASE_FLAGS = -O2 -s -D NDEBUG - all: help help: - @echo "Please use: 'make init', 'make debug', 'make fast', 'make release', or 'make clean'" - @echo "Supports parallel builds (via 'make -j8 debug')" + @echo "Please use: 'make init', 'make debug', 'make build', 'make release', or 'make clean'" + @echo "Note: parallel builds (via 'make -jN' where N is some number of how many jobs to generate)" + @echo "This is supported via recursive build shell calls. Not actually passing -j to make so should work even on a pure POSIX system." init: @mkdir -p output source_code includes config @touch config/version source_code/main.c @echo "_00.000.00.0000" > config/version - @echo "Project initialized." + @printf '%s\n' \ + '# POSIX Virtual Environment for C Build System.' \ + '# Usage: . config/activate' \ + '' \ + '# Prevents double-sourcing.' \ + 'if [ -n "$$_OLD_VIRTUAL_CC" ]; then' \ + ' deactivate' \ + 'fi' \ + '' \ + '_OLD_VIRTUAL_CC="$$CC"' \ + '_OLD_VIRTUAL_LIBS="$$LIBS"' \ + '_OLD_VIRTUAL_CFLAGS="$$CFLAGS"' \ + '_OLD_VIRTUAL_DEBUG_FLAGS="$$DEBUG_FLAGS"' \ + '_OLD_VIRTUAL_RELEASE_FLAGS="$$RELEASE_FLAGS"' \ + '_OLD_VIRTUAL_PS1="$$PS1"' \ + '' \ + '# Base configuration variables (Updated by "env_set VARIABLE value")' \ + 'export CC="cc"' \ + 'export LIBS=""' \ + 'export CFLAGS=""' \ + 'export DEBUG_FLAGS=""' \ + 'export RELEASE_FLAGS=""' \ + 'export C_VENV_ACTIVE="true"' \ + '' \ + '# Prepend (directory_name_env) to the shell prompt' \ + 'ENV_NAME="$$(basename "$$PWD")"' \ + 'PS1="($${ENV_NAME}_env) $$PS1"' \ + 'export PS1' \ + '' \ + '# Function to dynamically set variables in the terminal AND save them to this file.' \ + 'env_set() {' \ + ' if [ -z "$$1" ]; then' \ + ' echo "Usage: env_set [value]"' \ + ' return 1' \ + ' fi' \ + ' ' \ + ' VAR_NAME="$$1"' \ + ' shift' \ + ' VAR_VALUE="$$*"' \ + ' ' \ + ' # Update the active shell session' \ + ' export "$$VAR_NAME"="$$VAR_VALUE"' \ + ' ' \ + ' # Update this activate file using POSIX sed. To ensure the new value persists the next activate.' \ + ' sed "s|^export $$VAR_NAME=.*|export $$VAR_NAME=\"$$VAR_VALUE\"|" config/activate > config/activate.tmp' \ + ' mv config/activate.tmp config/activate' \ + ' ' \ + ' echo "Updated $$VAR_NAME to '\''$$VAR_VALUE'\''"' \ + '}' \ + '' \ + 'deactivate() {' \ + ' # Restore prior environment variables' \ + ' if [ -n "$$_OLD_VIRTUAL_CC" ]; then' \ + ' export CC="$$_OLD_VIRTUAL_CC"' \ + ' else' \ + ' unset CC' \ + ' fi' \ + '' \ + ' if [ -n "$$_OLD_VIRTUAL_LIBS" ]; then' \ + ' export LIBS="$$_OLD_VIRTUAL_LIBS"' \ + ' else' \ + ' unset LIBS' \ + ' fi' \ + '' \ + ' if [ -n "$$_OLD_VIRTUAL_CFLAGS" ]; then' \ + ' export CFLAGS="$$_OLD_VIRTUAL_CFLAGS"' \ + ' else' \ + ' unset CFLAGS' \ + ' fi' \ + '' \ + ' if [ -n "$$_OLD_VIRTUAL_DEBUG_FLAGS" ]; then' \ + ' export DEBUG_FLAGS="$$_OLD_VIRTUAL_DEBUG_FLAGS"' \ + ' else' \ + ' unset DEBUG_FLAGS' \ + ' fi' \ + '' \ + ' if [ -n "$$_OLD_VIRTUAL_RELEASE_FLAGS" ]; then' \ + ' export RELEASE_FLAGS="$$_OLD_VIRTUAL_RELEASE_FLAGS"' \ + ' else' \ + ' unset RELEASE_FLAGS' \ + ' fi' \ + '' \ + ' if [ -n "$$_OLD_VIRTUAL_PS1" ]; then' \ + ' export PS1="$$_OLD_VIRTUAL_PS1"' \ + ' fi' \ + ' ' \ + ' unset _OLD_VIRTUAL_CC' \ + ' unset _OLD_VIRTUAL_LIBS' \ + ' unset _OLD_VIRTUAL_CFLAGS' \ + ' unset _OLD_VIRTUAL_DEBUG_FLAGS' \ + ' unset _OLD_VIRTUAL_RELEASE_FLAGS' \ + ' unset _OLD_VIRTUAL_PS1' \ + ' unset C_VENV_ACTIVE' \ + ' unset ENV_NAME' \ + ' unset -f env_set' \ + ' unset -f deactivate' \ + '}' > config/activate + @echo "Project initialized. type '. config/activate', or 'source config/activate' to enter the virtual environment." clean: @rm -rf output/obj_debug output/obj_release config/*.mk @@ -36,46 +117,69 @@ clean: # Dynamic Build Graph Generators debug: + @if [ -z "$$C_VENV_ACTIVE" ]; then \ + echo "Error: Virtual environment not active."; \ + echo "Please run: '. config/activate' (or 'source config/activate') before building."; \ + exit 1; \ + fi @mkdir -p config output/obj_debug @PROJ_NAME=$$(basename "$$(pwd)"); \ VERS=$$(cat config/version 2>/dev/null || echo "_00.000.00.0000"); \ OUT="output/$${PROJ_NAME}$${VERS}"; \ MK="config/debug.mk"; \ + ACTIVE_CC=$${CC:-c99}; \ + ACTIVE_LIBS=$${LIBS:-}; \ + ACTIVE_CFLAGS=$${CFLAGS:-}; \ + ACTIVE_DEBUG_FLAGS=$${DEBUG_FLAGS:-}; \ echo ".POSIX:" > $$MK; \ - HEADERS=$$(find includes -type f -name '*.h' | tr '\n' ' '); \ OBJS=""; \ - for SRC in $$(find source_code -type f -name '*.c'); do \ + SRCS=$$(find source_code -type f -name '*.c' 2>/dev/null); \ + for SRC in $$SRCS; do \ OBJ="output/obj_debug/$${SRC}.o"; \ OBJS="$$OBJS $$OBJ"; \ - echo "$$OBJ: $$SRC $$HEADERS" >> $$MK; \ + echo "$$OBJ: $$SRC" >> $$MK; \ echo " @mkdir -p $$(dirname $$OBJ)" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(DEBUG_FLAGS) -I includes -c $$SRC -o $$OBJ $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_DEBUG_FLAGS -I includes -c $$SRC -o $$OBJ $$ACTIVE_LIBS" >> $$MK; \ done; \ echo "$$OUT: $$OBJS" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(DEBUG_FLAGS) -o $$OUT $$OBJS $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_DEBUG_FLAGS -o $$OUT $$OBJS $$ACTIVE_LIBS" >> $$MK; \ $(MAKE) -f $$MK "$$OUT" -fast: +build: + @if [ -z "$$C_VENV_ACTIVE" ]; then \ + echo "Error: Virtual environment not active."; \ + echo "Please run: '. config/activate' (or 'source config/activate') before building."; \ + exit 1; \ + fi @mkdir -p config output/obj_release @PROJ_NAME=$$(basename "$$(pwd)"); \ VERS=$$(cat config/version 2>/dev/null || echo "_00.000.00.0000"); \ OUT="output/$${PROJ_NAME}$${VERS}"; \ - MK="config/fast.mk"; \ + MK="config/build.mk"; \ + ACTIVE_CC=$${CC:-c99}; \ + ACTIVE_LIBS=$${LIBS:-}; \ + ACTIVE_CFLAGS=$${CFLAGS:-}; \ + ACTIVE_RELEASE_FLAGS=$${RELEASE_FLAGS:-}; \ echo ".POSIX:" > $$MK; \ - HEADERS=$$(find includes -type f -name '*.h' | tr '\n' ' '); \ OBJS=""; \ - for SRC in $$(find source_code -type f -name '*.c'); do \ + SRCS=$$(find source_code -type f -name '*.c' 2>/dev/null); \ + for SRC in $$SRCS; do \ OBJ="output/obj_release/$${SRC}.o"; \ OBJS="$$OBJS $$OBJ"; \ - echo "$$OBJ: $$SRC $$HEADERS" >> $$MK; \ + echo "$$OBJ: $$SRC" >> $$MK; \ echo " @mkdir -p $$(dirname $$OBJ)" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(RELEASE_FLAGS) -I includes -c $$SRC -o $$OBJ $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_RELEASE_FLAGS -I includes -c $$SRC -o $$OBJ $$ACTIVE_LIBS" >> $$MK; \ done; \ echo "$$OUT: $$OBJS" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(RELEASE_FLAGS) -o $$OUT $$OBJS $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_RELEASE_FLAGS -o $$OUT $$OBJS $$ACTIVE_LIBS" >> $$MK; \ $(MAKE) -f $$MK "$$OUT" release: + @if [ -z "$$C_VENV_ACTIVE" ]; then \ + echo "Error: Virtual environment not active."; \ + echo "Please run: '. config/activate' (or 'source config/activate') before building."; \ + exit 1; \ + fi @mkdir -p config output/obj_release @DATE_STR=$$(date +_%y.%j.%H.%M%S); \ echo "$$DATE_STR" > config/version; \ @@ -84,16 +188,20 @@ release: VERS=$$(cat config/version 2>/dev/null); \ OUT="output/$${PROJ_NAME}$${VERS}"; \ MK="config/release.mk"; \ + ACTIVE_CC=$${CC:-c99}; \ + ACTIVE_LIBS=$${LIBS:-}; \ + ACTIVE_CFLAGS=$${CFLAGS:-}; \ + ACTIVE_RELEASE_FLAGS=$${RELEASE_FLAGS:-}; \ echo ".POSIX:" > $$MK; \ - HEADERS=$$(find includes -type f -name '*.h' | tr '\n' ' '); \ OBJS=""; \ - for SRC in $$(find source_code -type f -name '*.c'); do \ + SRCS=$$(find source_code -type f -name '*.c' 2>/dev/null); \ + for SRC in $$SRCS; do \ OBJ="output/obj_release/$${SRC}.o"; \ OBJS="$$OBJS $$OBJ"; \ - echo "$$OBJ: $$SRC $$HEADERS" >> $$MK; \ + echo "$$OBJ: $$SRC" >> $$MK; \ echo " @mkdir -p $$(dirname $$OBJ)" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(RELEASE_FLAGS) -I includes -c $$SRC -o $$OBJ $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_RELEASE_FLAGS -I includes -c $$SRC -o $$OBJ $$ACTIVE_LIBS" >> $$MK; \ done; \ echo "$$OUT: $$OBJS" >> $$MK; \ - echo " $(CC) $(CFLAGS) $(RELEASE_FLAGS) -o $$OUT $$OBJS $(LIBS)" >> $$MK; \ + echo " $$ACTIVE_CC $$ACTIVE_CFLAGS $$ACTIVE_RELEASE_FLAGS -o $$OUT $$OBJS $$ACTIVE_LIBS" >> $$MK; \ $(MAKE) -f $$MK "$$OUT"