#!/bin/sh -e # This file is dedicated to the public domain. case "`uname -s`" in # weird people using Windows Bash might type ./compile, help them out :) *NT*) # msys2 or busybox-w32 echo "You're on Windows, idiot! Running compile.bat for you.">&2 exec cmd /c compile.bat ;; esac case "`uname -r`" in *Microsoft*) echo "NOTE: building inside WSL. Use compile.bat to build for Windows!">&2 esac mkdir -p .build/include : "${CC:=clang --target=-i686-pc-linux-gnu}" : "${HOSTCC:=clang}" warnings="-Wall -pedantic -Wno-parentheses -Wno-missing-braces \ -Wno-gnu-zero-variadic-macro-arguments -Werror=implicit-function-declaration \ -Werror=vla" dbg=0 if [ "$dbg" = 1 ]; then cflags="-O0 -g3" ldflags="-O0 -g3" else cflags="-O2 -fvisibility=hidden" ldflags="-O2 -s" fi objs= cc() { _bn="`basename "$1"`" objs="$objs .build/${_bn%%.c}.o" _mn=" -DMODULE_NAME=${_bn%%.c}" # ugly annoying special case if [ "$_mn" = " -DMODULE_NAME=con_" ]; then _mn=" -DMODULE_NAME=con" elif [ "$_mn" = "-DMODULE_NAME=sst" ]; then _mn=; fi # note: using typeof and bool from C23 - see detailed comment in compile.bat $CC -c -flto -fpic -fno-ident $cflags $warnings -I.build/include \ -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64$_mn \ -Dtypeof=__typeof -include stdbool.h -o ".build/${_bn%%.c}.o" "src/$1" } ld() { $CC -shared -flto -fpic -fuse-ld=lld $ldflags -L.build -ldl \ -ltier0 -lvstdlib -o sst.so$objs } src="\ ac.c alias.c autojump.c bind.c chunklets/fastspin.c chunklets/msg.c con_.c crypto.c democustom.c demorec.c engineapi.c ent.c errmsg.c extmalloc.c fastfwd.c fixes.c fov.c gamedata.c gameinfo.c gameserver.c hexcolour.c hook.c hud.c kvsys.c l4dmm.c l4dreset.c l4dwarp.c nosleep.c portalcolours.c sst.c xhair.c x86.c" if [ "$dbg" = 1 ]; then src="$src \ dbg.c udis86.c" fi $HOSTCC -O2 -fuse-ld=lld $warnings -D_FILE_OFFSET_BITS=64 -include stdbool.h \ -o .build/codegen src/build/codegen.c src/build/cmeta.c $HOSTCC -O2 -fuse-ld=lld $warnings -D_FILE_OFFSET_BITS=64 -include stdbool.h \ -o .build/mkgamedata src/build/mkgamedata.c src/kv.c $HOSTCC -O2 -fuse-ld=lld $warnings -D_FILE_OFFSET_BITS=64 -include stdbool.h \ -o .build/mkentprops src/build/mkentprops.c src/kv.c .build/codegen `for s in $src; do echo "src/$s"; done` .build/mkgamedata gamedata/engine.kv gamedata/gamelib.kv gamedata/inputsystem.kv \ gamedata/matchmaking.kv gamedata/vgui2.kv gamedata/vguimatsurface.kv .build/mkentprops gamedata/entprops.kv for s in $src; do cc "$s"; done $CC -shared -fpic -fuse-ld=lld -O0 -w -o .build/libtier0.so src/stubs/tier0.c $CC -shared -fpic -fuse-ld=lld -O0 -w -o .build/libvstdlib.so src/stubs/vstdlib.c ld $HOSTCC -O2 -g3 -include test/test.h -o .build/bitbuf.test test/bitbuf.test.c .build/bitbuf.test # skipping this test on linux for now, since inline hooks aren't compiled in #$HOSTCC -m32 -O2 -g3 -include test/test.h -o .build/hook.test test/hook.test.c #.build/hook.test $HOSTCC -O2 -g3 -include test/test.h -o .build/kv.test test/kv.test.c .build/kv.test $HOSTCC -O2 -g3 -include test/test.h -o .build/x86.test test/x86.test.c .build/x86.test # vi: sw=4 tw=4 noet tw=80 cc=80