#!/bin/sh 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 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|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 " $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" fi echo "===> platform $platform, $mode build, modules:${modules:- none}" exec ${MAKE:-make} ${*:-all}