configure.ac enforces C17 and Linux/x86_64, refuses in-tree configure; Makefile.am builds libc.a plus crt0.o; the driver Makefile dispatches out-of-tree builds into bin/release (-O2) and bin/debug (-O0 -g). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <[email protected]>
62 lines
1.9 KiB
Makefile
62 lines
1.9 KiB
Makefile
# Driver Makefile — nulsl-libc
|
|
#
|
|
# This is the HAND-WRITTEN top-level makefile (committed to git). It never
|
|
# runs the autotools machinery in-tree; instead it drives two out-of-tree
|
|
# builds, one per bin/ directory, exactly as the Null Linux guidelines want:
|
|
#
|
|
# make release -> ./configure CFLAGS='-O2' into bin/release/
|
|
# make debug -> ./configure CFLAGS='-O0 -g' into bin/debug/
|
|
#
|
|
# Run `./autogen.sh` once after cloning (or just run `make release` — it
|
|
# regenerates the configure script itself when needed).
|
|
#
|
|
# Never run `./configure` at the repository root: configure.ac refuses it.
|
|
|
|
.PHONY: all release debug bench check clean distclean compile_commands
|
|
|
|
all: release
|
|
|
|
# --- bootstrapping ---------------------------------------------------------
|
|
|
|
# Regenerates configure (and friends) when autogen.sh is newer.
|
|
configure: autogen.sh
|
|
./autogen.sh
|
|
|
|
# --- builds ----------------------------------------------------------------
|
|
|
|
# Release is ALWAYS -O2 (project guideline #4).
|
|
bin/release/Makefile: configure
|
|
@mkdir -p bin/release
|
|
@cd bin/release && ../../configure CFLAGS='-O2'
|
|
|
|
bin/debug/Makefile: configure
|
|
@mkdir -p bin/debug
|
|
@cd bin/debug && ../../configure CFLAGS='-O0 -g'
|
|
|
|
release: bin/release/Makefile
|
|
$(MAKE) -C bin/release
|
|
|
|
debug: bin/debug/Makefile
|
|
$(MAKE) -C bin/debug
|
|
|
|
# --- developer conveniences -------------------------------------------------
|
|
|
|
bench: release
|
|
$(MAKE) -C bin/release bench
|
|
|
|
check: release
|
|
$(MAKE) -C bin/release check
|
|
|
|
# LSP support: compile_commands.json for clangd (requires `bear`).
|
|
compile_commands: release
|
|
@command -v bear >/dev/null 2>&1 || { \
|
|
echo "error: 'bear' is not installed (sudo pacman -S bear, apt install bear, ...)"; exit 1; }
|
|
@cd bin/release && bear --output ../../compile_commands.json -- $(MAKE) clean all
|
|
|
|
clean:
|
|
@test ! -f bin/release/Makefile || $(MAKE) -C bin/release clean
|
|
@test ! -f bin/debug/Makefile || $(MAKE) -C bin/debug clean
|
|
|
|
distclean: clean
|
|
rm -rf bin/release bin/debug
|