# Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
-src="fishladder.c"
-target="fishladder"
-lib="-I. -L./lib -L./"
-libs="-lGL -lglfw -lX11 -lXxf86vm -lXrandr -lm -lpthread -lXi -ldl"
-steam_part="-l:steam/libsteam_api.so"
-flags="-fsanitize=address -ggdb3 -Wno-unused-function"
-build_dir="build.linux"
-steam_api="libsteam_api.so"
+cmd_lib_dir="-I. -L./lib -L./"
+cmd_release=false
+cmd_defines=""
+cmd_target="fishladder"
+
+# Util
+# ===========================================
+error(){
+ echo -e "\033[1;31mError:\e[0m $@"
+ exit 1
+}
+
+warning(){
+ echo -e "\033[1;33mWarning:\e[0m $@"
+}
+
+success(){
+ echo -e "\033[1;32mSuccess:\e[0m $@"
+}
+
+logit(){
+ echo -e "\033[0;37m$@\e[0m"
+}
+
+# Platforms
+# ===========================================
+
+target_os_windows(){
+ target_ext=".exe"
+ target_compiler="i686-w64-mingw32-gcc"
+ target_libs="-lglfw3 -lopengl32 -lm -mwindows"
+ target_dir="build.win32"
+ target_steam_api="steam_api.dll"
+ if [ $cmd_release = true ]; then
+ target_opts="-O3"
+ else
+ target_opts="-ggdb3"
+ fi
+}
+
+target_os_linux(){
+ target_ext=""
+ target_compiler="gcc"
+ target_libs="-lGL -lglfw -lX11 -lXxf86vm -lXrandr -lm -lpthread -lXi -ldl"
+ target_dir="build.linux"
+ target_steam_api="libsteam_api.so"
+ if [ $cmd_release = true ]; then
+ target_opts="-O3"
+ else
+ target_opts="-fsanitize=address -ggdb3"
+ fi
+}
+
+compile_x(){
+ cmd_setup="$target_compiler -Wall -Wstrict-aliasing=3 -Wno-unused-function $cmd_lib_dir"
+ cmd_targets="$1 gl/glad.c -o $2$target_ext"
+ cmd_final="$target_libs -Wl,-rpath=./ $cmd_defines"
+ cmd="$cmd_setup $target_opts $cmd_targets $cmd_final"
+
+ echo "Compile -> $2$target_ext:"
+ logit " $cmd"
+ $cmd
+
+ if [ $? -ne 0 ]; then
+ error "compiler signaled fail"
+ exit 1
+ fi
-if [[ "$OSTYPE" != "linux-gnu"* ]]; then
- echo "Operating system is not GNU/Linux, windows will be assumed."
+ success "$2$target_ext built"
+ echo ""
+}
- target="fishladder.exe"
- libs="-lglfw3 -lopengl32 -lm -mwindows"
- flags="-ggdb3 -Wno-unused-function"
- build_dir="build.win32"
- steam_api="steam_api.dll"
-fi
+compile_main(){
+ echo ""
+ echo "compile_main()"
+ mkdir -p $target_dir
+
+ compile_x fishladder.c $target_dir/$cmd_target
+
+ echo "Setting up build structure"
+
+ # Setup build folder
+ mkdir $target_dir/cfg -p
+ mkdir $target_dir/textures -p
+ mkdir $target_dir/sound -p
+ mkdir $target_dir/maps -p
+ mkdir $target_dir/sav -p
+
+ # Copy libraries
+ cp steam/$target_steam_api $target_dir/$target_steam_api
-run_after=false
-do_build=true
-compile_tools=false
-#compile_models=false
+ # Clear and copy assets
+ rm -r $target_dir/textures
+ rm -r $target_dir/sound
+ rm -r $target_dir/maps
+ cp -r .temp_textures $target_dir
+ mv $target_dir/.temp_textures $target_dir/textures
+ cp -r sound $target_dir
+ cp -r maps $target_dir
+
+ success "Build made: $target_dir"
+}
+
+compile_tools(){
+ # These should only be compiled for native platform
+ echo ""
+ echo "compile_tools()"
+ mkdir tools -p
+
+ compile_x fontcomp.c tools/fontcomp
+ compile_x texsheet.c tools/texsheet
+ compile_x qoiconv.c tools/qoiconv
+}
+
+compile_assets(){
+ echo ""
+ echo "compile_assets()"
+ [[ -d .temp_textures ]] && rm -r .temp_textures
+ mkdir .temp_textures
+
+ # Convert all png to qoi
+ echo "Compile textures:"
+ for f in textures/*.png;
+ do logit " qoi: $f";
+ ./tools/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi"
+ done
+
+ # Autocombine textures
+ echo " [combine]:"
+
+ auto_combine=""
+ cd textures_combine
+ for f in *.png;
+ do logit " combine: $f";
+ auto_combine="$auto_combine $f"
+ done
+ ../tools/texsheet$taget_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine
+ cd ..
+
+ # Compile font file
+ echo ""
+ echo "Compile fonts:"
+ ./tools/fontcomp$target_ext fonts/vg_font.png vg/vg_pxfont.h
+}
+
+# ==============================================================
+# Compile process
+
+if [[ "$OSTYPE" != "linux-gnu"* ]]; then
+ echo "Host: Microsoft Windows (implied)"
+ host_is_linux=false
+ target_os_windows
+else
+ echo "Host: GNU/Linux"
+ host_is_linux=true
+ target_os_linux
+fi
+
+# Main compile loop
while (( "$#" )); do
case $1 in
-r|--release)
- flags="-O3 -Wno-unused-function"
- echo "Release mode"
- ;;
- -p|--play)
- run_after=true
- echo "& Run"
+ cmd_release=true
+ echo " + Release Mode"
;;
-s|--no-steam)
- steam_part=""
- defines="-DNO_STEAM"
- echo "no-steam"
- ;;
- -n|--nobuild)
- do_build=false
- echo "no-build"
+ cmd_defines="-DVG_NO_STEAM"
+ echo " + Disable steam"
;;
-t|--tools)
- compile_tools=true
- echo "build-tools"
+ compile_tools
;;
- #-m|--models)
- # compile_models=true
- # echo "build-models"
- #;;
+ -a|-assets)
+ compile_assets
+ ;;
+ --build-linux)
+ target_os_linux
+ compile_main
+ ;;
+ --build-windows)
+ target_os_windows
+ compile_main
+
+ # Extra glfw.dll copy step
+ cp glfw/glfw3.dll $target_dir/glfw3.dll
+ ;;
+ -p|--play)
+ if [ $host_is_linux ]; then
+ target_os_linux
+ else
+ target_os_windows
+ fi
+
+ echo ""
+ logit "======= exec: $target_dir/$cmd_target$target_ext ======="
+ echo ""
+
+ cd $target_dir
+ ./$cmd_target
+ cd ./../
+ ;;
*)
echo "Unkown param: $1"
exit 1
shift
done
-# Tools
-if [ "$compile_tools" = true ]; then
- echo "Building tools"
- mkdir tools -p
- gcc -Wall -Wstrict-aliasing=3 $lib $flags mdlcomp.c gl/glad.c -o tools/mdlcomp $libs $steam_part -Wl,-rpath=./ $defines
- gcc -Wall -Wstrict-aliasing=3 $lib $flags fontcomp.c gl/glad.c -o tools/fontcomp $libs $steam_part -Wl,-rpath=./ $defines
- gcc -Wall -Wstrict-aliasing=3 $lib $flags texsheet.c gl/glad.c -o tools/texsheet $libs $steam_part -Wl,-rpath=./ $defines
- gcc $lib qoiconv.c -std=c99 -O3 -o tools/qoiconv
-fi
-
-# Resources
-mkdir _temp_textures
-# Convert all png to qoi
-echo "Compiling textures"
-for f in textures/*.png;
- do echo "-> qoi: $f";
- ./tools/qoiconv $f ./_temp_textures/"$(basename "$f" .png).qoi"
-done
-
-# Autocombine textures
-auto_combine=""
-cd textures_combine
-for f in *.png;
- do echo "[combine] $f";
- auto_combine="$auto_combine $f"
-done
-../tools/texsheet ../_temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine
-cd ..
-
-# Compile font file
-./tools/fontcomp fonts/vg_font.png vg/vg_pxfont.h
-
-# Main build
-if [ "$do_build" = true ]; then
- gcc -Wall -Wstrict-aliasing=3 $lib $flags $src gl/glad.c -o $target $libs $steam_part -Wl,-rpath=./ $defines
-
- if [ $? -ne 0 ]; then
- echo "GCC build failed"
- exit 1
- fi
-
- echo "Build succeeded"
-fi
-
-mkdir $build_dir/cfg -p
-mkdir $build_dir/textures -p
-mkdir $build_dir/sound -p
-mkdir $build_dir/maps -p
-mkdir $build_dir/sav -p
-
-cp $target $build_dir/$target
-cp ./steam/$steam_api $build_dir/$steam_api
-rm -r $build_dir/textures
-mv ./_temp_textures/ $build_dir/textures
-cp -r ./sound/ $build_dir
-cp -r ./maps/ $build_dir
-
-if [ "$run_after" = true ]; then
- echo "Playing"
-
- cd $build_dir
- ./$target
- cd ./../
-fi
+# Cleanup
+logit "cleaning up..."