summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-17 17:37:22 +0800
committerKonAki <konaki@anokonaki.org>2026-10-17 17:37:22 +0800
commit39f9944e9fde1dbeb3576f7fea16c0f70ef05b8a (patch)
tree27fc93f4b5c975774df0443199882b77c9bf2e2e
parent958e3fff1c68ffdb3fa12d054bb95c5f92e5eded (diff)
build.sh and Makefile only start build.c
-rw-r--r--.gitignore4
-rw-r--r--Makefile152
-rwxr-xr-xbuild.sh165
3 files changed, 20 insertions, 301 deletions
diff --git a/.gitignore b/.gitignore
index 99b7055..0e3f46b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,7 @@ obj/
build
build.exe
build.exe.old
+build
+build.exe
+build.exe.old
+obj/
diff --git a/Makefile b/Makefile
index 48739ef..6b3b171 100644
--- a/Makefile
+++ b/Makefile
@@ -1,147 +1,13 @@
-PROGRAM = konengine
-SRCDIR = src
-KONDIR = kon
-EXTDIR = ext
+# the real build is build.c, this is for those who type make. all it needs is a C compiler.
+# make ARGS="-d -m font,ui" run is ./build -d -m font,ui run
-OBJDIR ?= obj
-EXE ?=
-MODEFLAGS ?= -O2 -DNDEBUG
-DEFS ?=
-LDLIBS ?= -lm
-MODOBJS ?=
+ARGS =
-WARN = -std=c99 -Wall -Wextra -Wpedantic
-KONFLAGS = $(WARN) $(MODEFLAGS) $(DEFS) -I$(KONDIR) -I$(EXTDIR)
-EXTFLAGS = -std=gnu99 -w $(MODEFLAGS) $(DEFS) -I$(EXTDIR)
-COMPILE = @mkdir -p $(OBJDIR); echo "\# compile $@"; $(CC) $(KONFLAGS) -c
-COMPILEEXT = @mkdir -p $(OBJDIR); echo "\# compile $@"; $(CC) $(EXTFLAGS) -c
+all: build
+ ./build $(ARGS) all
-ASSETDIR ?= assets
-PACKFLAGS ?=
+run tools pack examples clean: build
+ ./build $(ARGS) $@
-BIN = $(OBJDIR)/$(PROGRAM)$(EXE)
-PACKER = $(OBJDIR)/konpack$(EXE)
-MODELER = $(OBJDIR)/konmodel$(EXE)
-MZSURVEY = $(OBJDIR)/mzsurvey$(EXE)
-MZSCRIPT = $(OBJDIR)/mzscript$(EXE)
-KONS2C = $(OBJDIR)/kons2c$(EXE)
-MZMAP = $(OBJDIR)/mzmap$(EXE)
-MZDATA = $(OBJDIR)/mzdata$(EXE)
-EXAMPLES = modelview sound ui platform dialog script corridor hills sectorview
-EXAMPLEBINS = $(EXAMPLES:%=$(OBJDIR)/%$(EXE))
-PACKFILE = $(OBJDIR)/data.kpk
-CORE = $(OBJDIR)/engine.o $(OBJDIR)/konwinlib.o $(OBJDIR)/konsofren.o \
- $(OBJDIR)/kontime.o $(OBJDIR)/koninput.o $(OBJDIR)/konprogram.o
-OBJS = $(CORE) $(MODOBJS)
-
-all: $(BIN)
-
-$(BIN): $(OBJS)
- @echo "# link $@"
- @$(CC) -o $@ $(OBJS) $(LDLIBS)
-
-$(OBJDIR)/engine.o: $(SRCDIR)/engine.c $(KONDIR)/*.h
- $(COMPILE) $(SRCDIR)/engine.c -o $@
-
-$(OBJDIR)/konwinlib.o: $(SRCDIR)/impl/konwinlib.c $(KONDIR)/konwinlib.h
- $(COMPILE) $(SRCDIR)/impl/konwinlib.c -o $@
-
-$(OBJDIR)/konsofren.o: $(SRCDIR)/impl/konsofren.c $(KONDIR)/konsofren.h
- $(COMPILE) $(SRCDIR)/impl/konsofren.c -o $@
-
-$(OBJDIR)/kontime.o: $(SRCDIR)/impl/kontime.c $(KONDIR)/kontime.h
- $(COMPILE) $(SRCDIR)/impl/kontime.c -o $@
-
-$(OBJDIR)/koninput.o: $(SRCDIR)/impl/koninput.c $(KONDIR)/koninput.h $(KONDIR)/konwinlib.h
- $(COMPILE) $(SRCDIR)/impl/koninput.c -o $@
-
-$(OBJDIR)/konfont.o: $(SRCDIR)/impl/konfont.c $(KONDIR)/konfont.h $(KONDIR)/konsofren.h $(EXTDIR)/stb_truetype.h
- $(COMPILE) $(SRCDIR)/impl/konfont.c -o $@
-
-$(OBJDIR)/konsector.o: $(SRCDIR)/impl/konsector.c $(KONDIR)/konsector.h $(KONDIR)/konsofren.h $(KONDIR)/konmath.h
- $(COMPILE) $(SRCDIR)/impl/konsector.c -o $@
-
-$(OBJDIR)/kontoml.o: $(SRCDIR)/impl/kontoml.c $(KONDIR)/kontoml.h
- $(COMPILE) $(SRCDIR)/impl/kontoml.c -o $@
-
-# modules with a .c next to their header are normal modules, the single header libs go through src/impl
-$(OBJDIR)/%.o: $(KONDIR)/%.c $(KONDIR)/*.h $(EXTDIR)/*.h
- $(COMPILE) $< -o $@
-
-$(OBJDIR)/stb_image.o: $(SRCDIR)/impl/stb_image.c $(EXTDIR)/stb_image.h
- $(COMPILEEXT) $(SRCDIR)/impl/stb_image.c -o $@
-
-$(OBJDIR)/miniaudio.o: $(SRCDIR)/impl/miniaudio.c $(EXTDIR)/miniaudio.h
- $(COMPILEEXT) $(SRCDIR)/impl/miniaudio.c -o $@
-
-# only built when ext/stb_vorbis.c exists, build.sh checks
-$(OBJDIR)/stb_vorbis.o: $(EXTDIR)/stb_vorbis.c
- $(COMPILEEXT) $(EXTDIR)/stb_vorbis.c -o $@
-
-tools: $(PACKER) $(MODELER) $(MZSURVEY) $(MZSCRIPT) $(KONS2C) $(MZMAP) $(MZDATA)
-
-# every example is its own program, built from the same modules as the engine without engine.c
-examples: $(EXAMPLEBINS)
-
-$(OBJDIR)/%.o: examples/%.c $(KONDIR)/*.h
- $(COMPILE) $< -o $@
-
-$(EXAMPLEBINS): $(OBJDIR)/%$(EXE): $(OBJDIR)/%.o $(filter-out $(OBJDIR)/engine.o,$(OBJS))
- @echo "# link $@"
- @$(CC) -o $@ $^ $(LDLIBS)
-
-$(PACKER): tools/konpack.c $(KONDIR)/konpack.c $(KONDIR)/konpack.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(KONFLAGS) -DKONPACK_WRITER -o $@ tools/konpack.c $(KONDIR)/konpack.c
-
-# the converter is built without DEFS, it only needs the loader and the glTF reader
-TOOLFLAGS = $(WARN) $(MODEFLAGS) -I$(KONDIR) -I$(EXTDIR)
-
-$(OBJDIR)/cgltf.o: tools/cgltf.c $(EXTDIR)/cgltf.h
- @mkdir -p $(OBJDIR)
- @echo "# compile $@"
- @$(CC) -std=gnu99 -w $(MODEFLAGS) -I$(EXTDIR) -c tools/cgltf.c -o $@
-
-$(MODELER): tools/konmodel.c $(OBJDIR)/cgltf.o $(KONDIR)/konmodel.c $(KONDIR)/konmodel.h $(KONDIR)/konassets.c $(KONDIR)/konpack.c $(SRCDIR)/impl/konsofren.c
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -DKONSOFREN_3D -DKONMODEL_WRITER -o $@ tools/konmodel.c $(KONDIR)/konmodel.c $(KONDIR)/konassets.c $(KONDIR)/konpack.c $(SRCDIR)/impl/konsofren.c $(OBJDIR)/cgltf.o -lm
-
-# converters. they only read other programs' data, the engine is not linked in
-$(MZSURVEY): tools/mzsurvey.c $(KONDIR)/konjson.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -o $@ tools/mzsurvey.c
-
-$(MZSCRIPT): tools/mzscript.c tools/konscriptc.h $(KONDIR)/konjson.h $(KONDIR)/konscript.c $(KONDIR)/konscript.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -Itools -o $@ tools/mzscript.c $(KONDIR)/konscript.c
-
-$(KONS2C): tools/kons2c.c tools/konscriptc.h $(KONDIR)/konscript.c $(KONDIR)/konscript.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -Itools -o $@ tools/kons2c.c $(KONDIR)/konscript.c
-
-$(MZMAP): tools/mzmap.c $(KONDIR)/konjson.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -o $@ tools/mzmap.c
-
-# the database converter checks the damage formulas with the battle module's own parser
-$(MZDATA): tools/mzdata.c $(KONDIR)/konjson.h $(KONDIR)/konrmdata.h $(KONDIR)/konparty.h $(KONDIR)/konsave.h $(KONDIR)/konbattle.c $(KONDIR)/konbattle.h
- @mkdir -p $(OBJDIR)
- @echo "# link $@"
- @$(CC) $(TOOLFLAGS) -o $@ tools/mzdata.c $(KONDIR)/konbattle.c -lm
-
-pack: $(PACKER)
- @find $(ASSETDIR) -type f | sort > $(OBJDIR)/assets.lst
- $(PACKER) -c $(PACKFILE) $(PACKFLAGS) -b $(ASSETDIR) -l $(OBJDIR)/assets.lst
-
-run: $(BIN)
- ./$(BIN)
-
-clean:
- rm -f $(OBJDIR)/*.o $(BIN) $(PACKER) $(MODELER) $(MZSURVEY) $(MZSCRIPT) $(KONS2C) $(MZMAP) $(MZDATA) $(EXAMPLEBINS) $(PACKFILE) $(OBJDIR)/assets.lst
-
-.PHONY: all run clean tools pack examples
+build: build.c kon/konbuild.h
+ $(CC) -DKON_CC='"$(CC)"' -o build build.c
diff --git a/build.sh b/build.sh
index 034e300..de35a20 100755
--- a/build.sh
+++ b/build.sh
@@ -1,165 +1,14 @@
#!/bin/sh
+# the real build is build.c. this makes sure there is a build program and runs it with what you gave it,
+# so ./build.sh does the same as ./build. the compiler it is made with is the one it builds the engine with
set -eu
cd "$(dirname "$0")"
-platform=native
-mode=release
-objdir=obj
-modules=
-developer=0
-
-usage()
-{
- echo "usage: build.sh [-d] [-D] [-p platform] [-m module,...] [-o objdir] [target ...]"
- echo "modules: font toml tile pack ui debug assets image audio mic sound model 2d fx particles picture rm rmmap rmtile rmdraw rmfield rmplugin rmdata script battle party save stage textbox platformer rpg 3d sector world"
- echo "platforms: native linux bsd windows"
- echo "targets: all run clean tools pack examples"
- exit 1
-}
-
-while getopts dDm:o:p: opt; do
- case $opt in
- d) mode=debug ;;
- D) developer=1 ;;
- m) modules="$modules $(echo "$OPTARG" | tr ',' ' ')" ;;
- o) objdir=$OPTARG ;;
- p) platform=$OPTARG ;;
- *) usage ;;
- esac
-done
-shift $((OPTIND - 1))
-
-if [ "$platform" = native ]; then
- case $(uname -s) in
- Linux) platform=linux ;;
- MINGW*|MSYS*|CYGWIN*) platform=windows ;;
- *) platform=bsd ;;
- esac
-fi
-
-EXE=
-DEFS=
-case $platform in
-linux|bsd)
- LDLIBS="-lX11 -lXext -lXrandr -lm"
- DEFS="-D_POSIX_C_SOURCE=200809L"
- # the BSDs keep X11 out of the default paths
- case $(uname -s) in
- NetBSD) x11=/usr/X11R7 ;;
- OpenBSD) x11=/usr/X11R6 ;;
- FreeBSD|DragonFly) x11=/usr/local ;;
- *) x11= ;;
- esac
- if [ -n "$x11" ]; then
- DEFS="$DEFS -I$x11/include"
- LDLIBS="-L$x11/lib -Wl,-R$x11/lib $LDLIBS"
- fi
- ;;
-windows)
- CC=${CC:-x86_64-w64-mingw32-gcc}
- LDLIBS="-lgdi32 -lm"
- EXE=.exe
- ;;
-*)
- echo "build.sh: unknown platform '$platform'" >&2
- usage
- ;;
-esac
-
-if [ $mode = debug ]; then
- MODEFLAGS="-g -O1 -DKON_DEBUG"
- developer=1
-else
- MODEFLAGS="-O2 -DNDEBUG"
-fi
-[ $developer = 1 ] && MODEFLAGS="$MODEFLAGS -DKON_DEVELOPER"
-
-MODOBJS=
-
-addobj()
-{
- case " $MODOBJS " in
- *" $objdir/$1.o "*) ;;
- *) MODOBJS="$MODOBJS $objdir/$1.o" ;;
- esac
-}
-
-case " $modules " in
-*" sound "*)
- case " $modules " in
- *" audio "*) ;;
- *) modules="$modules audio" ;;
- esac
- ;;
-esac
-
-for m in $modules; do
- DEFS="$DEFS -DKON_MODULE_$(echo "$m" | tr 'a-z' 'A-Z')"
- case $m in
- font|toml|tile|pack|ui|debug|2d|fx|particles|picture|sound|rm|rmmap|rmtile|rmdraw|rmfield|rmplugin|rmdata|script|battle|party|save|stage|textbox|platformer|rpg|3d|sector|world) addobj "kon$m" ;;
- assets) addobj konassets ;;
- model) addobj konmodel; addobj konassets ;;
- image) addobj stb_image ;;
- audio|mic)
- addobj miniaudio
- addobj "kon$m"
- # ogg only works when ext/stb_vorbis.c is there
- if [ "$m" = audio ] && [ -f ext/stb_vorbis.c ]; then
- DEFS="$DEFS -DKON_VORBIS"
- addobj stb_vorbis
- fi
- case $platform in
- linux) LDLIBS="$LDLIBS -lpthread -ldl" ;;
- bsd) LDLIBS="$LDLIBS -lpthread" ;;
- esac
- ;;
- *) echo "build.sh: unknown module '$m'" >&2; usage ;;
- esac
-done
-
-need()
-{
- case " $DEFS " in
- *" -DKON_MODULE_$(echo "$1" | tr 'a-z' 'A-Z') "*) ;;
- *) DEFS="$DEFS -DKON_MODULE_$(echo "$1" | tr 'a-z' 'A-Z')" ;;
- esac
- addobj "kon$1"
-}
-
-# modules that use other modules
-case " $modules " in *" debug "*) need font; need assets ;; esac
-case " $modules " in *" ui "*) need font ;; esac
-case " $modules " in *" world "*) need 3d; need sector; need tile ;; esac
-case " $modules " in *" platformer "*|*" rpg "*) need tile ;; esac
-case " $modules " in *" stage "*|*" fx "*|*" picture "*) need 2d ;; esac
-case " $modules " in *" textbox "*) need 2d; need font ;; esac
-case " $modules " in *" 3d "*) need tile ;; esac
-case " $modules " in *" model "*) need assets ;; esac
-case " $modules " in *" party "*) need battle; need save ;; esac
-case " $modules " in *" rmdraw "*) need rmmap; need rmtile ;; esac
-case " $modules " in *" rmfield "*) need rmmap ;; esac
-case " $modules " in *" rmdata "*) need battle; need party; need save ;; esac
-case " $DEFS " in *" -DKON_MODULE_ASSETS "*) need pack ;; esac
-
-# the 3D renderer is only compiled when a module that draws in 3D is picked
-case " $DEFS " in
-*" -DKON_MODULE_3D "*|*" -DKON_MODULE_MODEL "*|*" -DKON_MODULE_SECTOR "*) DEFS="$DEFS -DKONSOFREN_3D" ;;
-esac
-
-case " $modules " in
-*" debug "*) [ $developer = 1 ] || echo "note: debug module does nothing without -d or -D" ;;
-esac
-
-OBJDIR=$objdir
-export CC EXE LDLIBS MODEFLAGS DEFS OBJDIR MODOBJS
-
-mkdir -p "$OBJDIR"
-flags="$MODEFLAGS $DEFS $LDLIBS $MODOBJS ${CC:-cc}"
-if [ "$(cat "$OBJDIR/.flags" 2>/dev/null)" != "$flags" ]; then
- rm -f "$OBJDIR"/*.o
- echo "$flags" > "$OBJDIR/.flags"
+cc=${CC:-cc}
+if [ ! -x build ]; then
+ echo "build.sh: making the build program with $cc"
+ $cc -DKON_CC="\"$cc\"" -o build build.c
fi
-echo "===> platform $platform, $mode build, modules:${modules:- none}"
-exec ${MAKE:-make} ${*:-all}
+exec ./build "$@"