X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_compiler.sh;h=33d80575df8953dfb5110d137cd20109c513409c;hb=4d6575e40f0366f937e4ee45e0cf0a17bb9adffc;hp=7a78e8fed4a9c425b5475c44bf8a5b63d6673c4c;hpb=6836e834f8db725e08015a98401f2be97e5b9849;p=vg.git diff --git a/vg_compiler.sh b/vg_compiler.sh index 7a78e8f..33d8057 100755 --- a/vg_compiler.sh +++ b/vg_compiler.sh @@ -3,14 +3,22 @@ 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 # =========================================== @@ -31,17 +39,35 @@ logit(){ 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 @@ -50,43 +76,83 @@ target_os_windows(){ 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 @@ -96,35 +162,29 @@ compile_main(){ 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 @@ -132,88 +192,198 @@ compile_assets(){ 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