vg_root=`readlink $0`
vg_root=`dirname $vg_root`
-
-#echo "VG Root: $vg_root"
-#echo "Working dir: `pwd`"
-
-cmd_lib_dir="-I. -L$vg_root/lib -L./ -I$vg_root"
-cmd_release=false
-cmd_defines=""
-cmd_target="fishladder"
+vg_version="0.2"
+
+opt_assets=false
+opt_shaders=false
+opt_release=false
+opt_play=false
+opt_linux=false
+opt_windows=false
+opt_tools=false
+opt_recompile_mini_audio=false
+opt_steam=""
+
+target_platform_include=""
+target_standard="-std=c99"
+target_link_steam=false
+target_shaders=""
# Util
# ===========================================
echo -e "\033[0;37m$@\e[0m"
}
+titleit(){
+ echo ""
+ echo -e "\033[1;35m$@\e[0m"
+ echo "=========================="
+ echo ""
+}
+
+checkfatal(){
+ if [ $? -ne 0 ]; then
+ error "compiler signaled fail"
+ exit 1
+ fi
+}
+
# Platforms
# ===========================================
target_os_windows(){
target_ext=".exe"
target_compiler="i686-w64-mingw32-gcc"
- target_libs="-lglfw3 -lopengl32 -lm -mwindows"
+ target_libs="-lglfw3dll -lopengl32 -lm -mwindows"
+ target_libs_steam="$vg_root/dep/steam/steam_api.dll"
target_dir="build.win32"
target_steam_api="steam_api.dll"
- if [ $cmd_release = true ]; then
- target_opts="-O3"
+ target_miniaudio="$vg_root/dep/dr_soft/miniaudio_win32.o"
+ target_platform_include=""
+
+ if [ $opt_release = true ]; then
+ target_opts="-O3 -DVG_RELEASE"
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_libs="-lGL -lglfw3 -lX11 -lXxf86vm -lXrandr -lm -pthread -lXi -ldl"
+ target_libs_steam="-lsteam_api"
+ #target_platform_include="-include $vg_root/platformutils/force_link_glibc_2.23.h"
+ target_platform_include=""
target_dir="build.linux"
target_steam_api="libsteam_api.so"
- if [ $cmd_release = true ]; then
- target_opts="-O3"
+ target_miniaudio="$vg_root/dep/dr_soft/miniaudio_linux.o"
+ if [ $opt_release = true ]; then
+ target_opts="-O3 -DVG_RELEASE"
else
- target_opts="-fsanitize=address -ggdb3"
+ target_opts="-O0 -fsanitize=address -ggdb3 -fno-omit-frame-pointer"
fi
}
-compile_x(){
- cmd_setup="$target_compiler -Wall -Wstrict-aliasing=3 -Wno-unused-function $cmd_lib_dir"
- cmd_targets="$1 ${vg_root}/gl/glad.c -o $2$target_ext"
- cmd_final="$target_libs -Wl,-rpath=./ $cmd_defines"
- cmd="$cmd_setup $target_opts $cmd_targets $cmd_final"
+precompile_x(){
+ if ! [ -x "$(command -v $target_compiler)" ]; then
+ warning "Compiler $target_compiler is not installed. Skipping item"
+ return 0
+ fi
+ sources="$1"
+ output="-o $2"
+ cmd="$target_compiler $target_standard $target_opts $target_platform_include
+ -c $sources
+ $output"
- echo "Compile -> $2$target_ext:"
logit " $cmd"
$cmd
-
- if [ $? -ne 0 ]; then
- error "compiler signaled fail"
- exit 1
- fi
+ checkfatal
+ success "$2 built"
+}
+
+compile_x(){
+ if ! [ -x "$(command -v $target_compiler)" ]; then
+ warning "Compiler $target_compiler is not installed. Skipping item"
+ return 0
+ fi
+
+ include="-I. -I$vg_root/dep -I$vg_root/src"
+ libs="-L./ -L$vg_root/dep/glfw -L$vg_root/dep/steam"
+
+ steam_part=""
+ if [ "$opt_steam" != "" ]; then
+ steam_part="$opt_steam $target_libs_steam"
+ fi
+
+ warnings="-Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable"
+ sources="$1 $vg_root/dep/glad/glad.c $target_miniaudio"
+ output="-o $2$target_ext"
+
+ cmd="$target_compiler -D_REENTRANT $target_standard $target_opts $target_platform_include
+ $warnings
+ $include
+ $libs
+ $sources
+ $output
+ $target_libs $steam_part
+ -Wl,-rpath=./"
+
+ logit " $cmd\n"
+ $cmd
+
+ checkfatal
success "$2$target_ext built"
- echo ""
}
compile_main(){
- echo ""
- echo "compile_main()"
+ titleit "Main build: $target_dir"
mkdir -p $target_dir
+
+ if [ "$opt_recompile_mini_audio" == true ]; then
+ precompile_x $vg_root/dep/dr_soft/miniaudio_impl.c $target_miniaudio
+ fi
- compile_x fishladder.c $target_dir/$cmd_target
-
- echo "Setting up build structure"
+ compile_x $vg_src $target_dir/$vg_target
+ echo ""
+ logit "Setting up build structure"
# Setup build folder
mkdir $target_dir/cfg -p
mkdir $target_dir/sav -p
# Copy libraries
- cp $vg_root/steam/$target_steam_api $target_dir/$target_steam_api
-
- # 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"
+ if [ "$opt_steam" != "" ]; then
+ cp $vg_root/dep/steam/$target_steam_api $target_dir/$target_steam_api
+ fi
}
compile_tools(){
# These should only be compiled for native platform
- echo ""
- echo "compile_tools()"
- mkdir tools -p
+ titleit "Tools"
+
+ mkdir $vg_root/bin -p
- compile_x $vg_root/fontcomp.c tools/fontcomp
- compile_x $vg_root/texsheet.c tools/texsheet
- compile_x $vg_root/qoiconv.c tools/qoiconv
-}
+ steam_prev=$opt_steam
+ opt_steam=""
+
+ compile_x $vg_root/src/fontcomp.c $vg_root/bin/fontcomp
+ compile_x $vg_root/src/texsheet.c $vg_root/bin/texsheet
+ compile_x $vg_root/src/qoiconv.c $vg_root/bin/qoiconv
+ compile_x $vg_root/src/shader.c $vg_root/bin/shader
+ opt_steam=$steam_prev
+}
compile_assets(){
- echo ""
- echo "compile_assets()"
+ titleit "Assets"
[[ -d .temp_textures ]] && rm -r .temp_textures
mkdir .temp_textures
echo "Compile textures:"
for f in textures/*.png;
do logit " qoi: $f";
- ./tools/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi"
+ $vg_root/bin/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 ..
+ if [[ -d "textures_combine" ]]; then
+ echo " [combine]:"
+
+ auto_combine=""
+ cd textures_combine
+ for f in *.png;
+ do logit " combine: $f";
+ auto_combine="$auto_combine $f"
+ done
+ $vg_root/bin/texsheet$target_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine
+ cd ..
+ fi
# Compile font file
echo ""
echo "Compile fonts:"
- ./tools/fontcomp$target_ext $vg_root/fonts/vg_font.png $vg_root/vg/vg_pxfont.h
+ $vg_root/bin/fontcomp$target_ext $vg_root/src/fonts/vg_font.png $vg_root/src/vg/vg_pxfont.h
+
+ # 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
+ cp -r models $target_dir
+}
+
+compile_shaders(){
+ titleit "Shaders"
+
+ if [[ -d "shaders" ]]; then
+ cd shaders
+ $vg_root/bin/shader$target_ext $target_shaders
+ cd ..
+ fi
+}
+
+shader(){
+ target_shaders="$target_shaders $1 $2 $3"
}
# ==============================================================
# 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
+options=rptlwas
+longopts=release,build-linux,build-windows,steam,play,build-tools,assets,full,miniaudio,template
+parsed=$(getopt --options=$options --longoptions=$longopts --name "vgc" -- "$@")
+
+if [ $? -ne 0 ]; then
+ error "getopt failed"
+ exit 1
fi
-# Main compile loop
-while (( "$#" )); do
- case $1 in
- -r|--release)
- cmd_release=true
- ;;
- -s|--no-steam)
- cmd_defines="-DVG_NO_STEAM"
- ;;
- -t|--tools)
- compile_tools
- ;;
- -a|-assets)
- compile_assets
- ;;
- --build-linux)
- target_os_linux
- compile_main
- ;;
- --build-windows)
- target_os_windows
- compile_main
-
- # Extra glfw.dll copy step
- cp $vg_root/glfw/glfw3.dll $target_dir/glfw3.dll
- ;;
+eval set -- "$parsed"
+while true; do
+ case "$1" in
+ -s|--shaders)
+ opt_shaders=true
+ shift;
+ ;;
+ -a|--assets)
+ opt_assets=true
+ opt_shaders=true
+ shift;
+ ;;
+ -r|--release)
+ opt_release=true
+ shift;
+ ;;
-p|--play)
- if [ $host_is_linux ]; then
- target_os_linux
+ opt_play=true
+ shift;
+ ;;
+ -l|--build-linux)
+ opt_linux=true
+ shift;
+ ;;
+ -w|--build-windows)
+ opt_windows=true
+ shift;
+ ;;
+ -t|--build-tools)
+ opt_tools=true
+ shift;
+ ;;
+ --full)
+ opt_assets=true
+ opt_release=true
+ opt_linux=true
+ opt_windows=true
+ opt_tools=true
+ opt_steam="-DVG_STEAM"
+ opt_recompile_mini_audio=true
+ shift;
+ ;;
+ --miniaudio)
+ opt_recompile_mini_audio=true
+ shift;
+ ;;
+ --steam)
+ opt_steam="-DVG_STEAM"
+ shift;
+ ;;
+ --template)
+
+ if [ -f "main.c" ]; then error "main.c already exists";
+ elif [ -f "vg_config.h" ]; then error "vg_config.h already exists";
+ elif [ -f "vg.conf" ]; then error "vg.conf already exists";
else
- target_os_windows
+ cp $vg_root/src/template/main.c main.c
+ cp $vg_root/src/template/vg_config.h vg_config.h
+ cp $vg_root/src/template/vg.conf vg.conf
fi
- echo ""
- logit "======= exec: $target_dir/$cmd_target$target_ext ======="
- echo ""
-
- cd $target_dir
- ./$cmd_target
- cd ./../
- ;;
- *)
- echo "Unkown param: $1"
- exit 1
- ;;
- esac
- shift
+ shift;
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ error "programming error"
+ break
+ ;;
+ esac
done
-# Cleanup
-logit "cleaning up..."
+if [[ -f vg.conf ]]; then
+ source vg.conf
+else
+ error "Directory is not a VG project"
+ exit 1
+fi
+
+detect_os(){
+ if [[ "$OSTYPE" != "linux-gnu"* ]]; then
+ host_os=win32
+ target_os_windows
+ else
+ host_os=linux
+ target_os_linux
+ fi
+}
+
+detect_os
+
+titleit " vgc ver: $vg_version\n host: $host_os"
+logit " assets: $opt_assets"
+logit " shaders: $opt_shaders"
+logit " release: $opt_release"
+logit " play: $opt_play"
+logit " build-linux: $opt_linux"
+logit "build-windows: $opt_windows"
+logit " build-tools: $opt_tools"
+logit " steam: $opt_steam"
+logit " miniaudio: $opt_recompile_mini_audio"
+
+# Main build steps
+
+if [ $opt_tools = true ]; then detect_os; compile_tools; fi
+if [ $opt_assets = true ]; then compile_assets; fi
+if [ $opt_shaders = true ]; then compile_shaders; fi
+if [ $opt_linux = true ]; then target_os_linux; compile_main; fi
+if [ $opt_windows = true ]; then
+ target_os_windows
+ compile_main
+
+ cp $vg_root/dep/glfw/glfw3.dll $target_dir/glfw3.dll
+fi
+
+success "Build completed (check compiler results)"
+
+if [ $opt_play = true ]; then
+
+ if [ $host_os = linux ]; then
+ target_os_linux
+ else
+ target_os_windows
+ fi
+
+ echo ""
+ logit "======= exec: $target_dir/$vg_target$target_ext ======="
+ echo ""
+
+ cd $target_dir
+ ./$vg_target$target_ext
+ cd ./../
+
+fi