#!/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 rmmap 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|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}