From b431c9b75514f34a384aa179b7027bc26261ba1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Wed, 4 Sep 2024 09:59:25 +0200 Subject: [PATCH] small fixes --- MAKE.bat | 2181 ++++++++++++++++++++------------------- demos/06-material.c | 2 +- demos/09-shadows.c | 2 +- demos/99-fpstest.c | 2 +- depot | 2 +- engine/joint/v4k.h | 2 +- engine/split/v4k_cook.c | 2 +- engine/v4k.c | 2 +- misc/llm.txt | 7 + 9 files changed, 1105 insertions(+), 1097 deletions(-) create mode 100644 misc/llm.txt diff --git a/MAKE.bat b/MAKE.bat index 09bf97a..8e0bbaa 100644 --- a/MAKE.bat +++ b/MAKE.bat @@ -1,1090 +1,1091 @@ -@echo off -setlocal enableDelayedExpansion -cd /d "%~dp0" - -rem echo Args: %* - -rem show help -if "%1"=="-?" goto showhelp -if "%1"=="-h" goto showhelp -if "%1"=="help" ( - :showhelp - echo %0 ; compile everything: `make dll dev` alias - echo %0 [help] ; show this screen - echo %0 [docs] ; generate tools/docs/docs.html file - echo %0 [cook] ; cook .zipfiles with tools/cook.ini cookbook - echo %0 [build_cook] ; build cook tool in release mode - echo %0 [sync] ; sync/reset repo to latest - echo %0 [fwk_prep] ; prepare files for fwk PR - echo %0 [fwk] ; update fwk-mirror fork - echo %0 [lua] ; execute lua script with v4k - echo %0 [html5] ; build HTML5 demo - echo %0 [web] ; run Python webserver in html5 dir - echo %0 [pull] ; pull changes from origin - echo %0 [push] ; prepare for commit, stage changes and commit them - echo %0 [dstat] ; show depot changes - echo %0 [dpush] ; push depot changes - echo %0 [depot] ; sync depot changes - echo %0 [fuse] ; fuse all binaries and cooked zipfiles found together - echo %0 [git] ; prepare for commit - echo %0 [vps] ; upload the release to VPS - echo %0 [tidy] ; clean up temp files - echo %0 [bind] ; generate lua bindings - echo %0 [checkmem] ; check untracked allocators in V4K - echo %0 [test] ; run autotests - echo %0 [todo] ; check for @fixme and @todo - echo %0 [leak] ; check for @leak - echo %0 [v4web] ; sync v4 website - echo %0 [swap] ; toggle #line directives on/off - echo %0 [split^|join] ; engine/v4k* ^>split^> engine/split/* or engine/split/* ^>join^> engine/v4k* - echo %0 [3rd] ; join 3rd parties together - echo %0 [lua] ; execute lua script with v4k - echo %0 [amalgamation] ; combine engine/v4k* into a single-header file - echo %0 [prep] ; combine split files into a single-header file, ready for use - echo %0 [sln] ; generate a xcode/gmake/ninja/visual studio solution - echo %0 [addons[ names ] ] ; specify list of addons you want to compile with the engine - echo %0 [cl^|tcc^|cc^|gcc^|clang^|clang-cl] [dbg^|dev^|rel^|ret] [static^|dll] [nov4k^|nodemos^|editor] [vis] [-- args] - echo cl \ - echo tcc ^| - echo cc ^| select compiler. must be accessible in PATH - echo gcc ^| (will be autodetected when no option is provided^) - echo clang ^| - echo clang-cl / - echo dbg \ debug build: [x] ASAN [x] poison [x] asserts [x] profiler [x] symbols [ ] zero optimizations - echo dev ^| develop build: [ ] ASAN [x] poison [x] asserts [x] profiler [x] symbols [*] some optimizations (default^) - echo rel / release build: [ ] ASAN [ ] poison [ ] asserts [ ] profiler [x] symbols (cl,clang-cl only^) [x] many optimizations - echo static \ link v4k as static library - echo dll / link v4k as dynamic library (dll^) (default^) - echo nov4k \ do not compile framework - echo demos ^| do compile demos - echo editor / do compile editor - echo run ^| run compiled .exe - echo vis ^> visualize invokation cmdline. - echo args ^> after `--` separator is found, pass all remaining arguments to compiler as-is - echo run_args ^> after `//` separator is found, pass all remaining arguments to runtime exe as-is - echo. - exit /b -) - -rem sync repo to latest -if "%1"=="sync" ( - call MAKE.bat tidy - git reset --hard origin/main - exit /b -) - -rem cook asset files -if "%1"=="cook" ( - rem generate cooker twice: use multi-threaded version if available (cl). then cook. - rem call tools\tcc tools\cook.c -Iengine engine\v4k.c - rem cl tools\cook.c -Iengine engine\v4k.c - rem cook - tools\cook - - exit /b -) -if "%1"=="build_cook" ( - pushd tools - cl cook.c -I..\engine /openmp /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG - popd - - exit /b -) -rem generate bindings -if "%1"=="bind" ( - rem luajit - tools\luajit tools\luajit_make_bindings.lua > v4k.lua - move /y v4k.lua bind - - exit /b -) - -if "%1"=="lua" ( - pushd bind - luajit "..\%2" - popd - exit /b -) - -rem generate documentation -if "%1"=="docs" ( - rem set symbols... - git describe --tags --abbrev=0 > info.obj - set /p VERSION= info.obj - set /p GIT_REVISION= info.obj - set /p GIT_BRANCH= info.obj - set /p LAST_MODIFIED= changelog.txt - - rem ...and generate docs - rem cl tools\docs\docs.c engine\v4k.c -Iengine /Od /DNDEBUG %2 - tools\docs engine\v4k.h --excluded=3rd_glad.h,v4k.h,v4k_compat.h, > v4k.html - move /y v4k.html engine\ - del changelog.txt - del info.obj - - exit /b -) -rem generate single-header distribution -if "%1"=="amalgamation" ( -echo // This file is intended to be consumed by a compiler. Do not read. > v4k.h -echo // **Browse to any of the sources in engine/split/ folder instead** >> v4k.h -echo // ---------------------------------------------------------------- >> v4k.h -echo // #define V4K_IMPLEMENTATION early in **one** C file to unroll the >> v4k.h -echo // implementation. The symbol must be defined in a C (not C++^) file>> v4k.h -echo // ---------------------------------------------------------------- >> v4k.h -echo #pragma once >> v4k.h -type engine\split\3rd_icon_md.h >> v4k.h -type engine\split\3rd_glad.h >> v4k.h -type engine\v4k.h >> v4k.h -echo #ifdef V4K_IMPLEMENTATION >> v4k.h -echo #define V4K_3RD >> v4k.h -type engine\v4k >> v4k.h -type engine\v4k.c >> v4k.h -echo #endif // V4K_IMPLEMENTATION >> v4k.h -move /y v4k.h engine\joint -exit /b -) - -rem generate prior files to a git release -if "%1"=="git" ( - rem call make.bat dll - call make.bat prep - call make.bat bind - rem call make.bat docs - - rem call make.bat amalgamation - rem call make.bat split - -rem rd /q /s engine\split -rem md engine\split -rem move /y v4k_*.? engine\split\ -rem move /y 3rd_*.? engine\split\ - - call make.bat tidy - git add engine/split - git add engine/joint - git add engine/v4k - git add engine/v4k.* - git add MAKE.bat - git add bind/v4k.lua - git status - - exit /b -) - -if "%1"=="pull" ( - git pull - exit /b -) - -if "%1"=="depot" ( - pushd depot\ - git pull - popd - git submodule update --remote --merge depot/ - exit /b -) - -if "%1"=="dstat" ( - pushd depot - git status - popd - exit /b -) - -if "%1"=="dpush" ( - pushd depot - git add . > NUL 2>&1 - if "%2"=="auto" ( - git commit -m "asset update" > NUL 2>&1 - git push > NUL 2>&1 - ) else ( - git commit > NUL 2>&1 - git diff --quiet --exit-code --cached - if !ERRORLEVEL! neq 0 ( - echo Commit was cancelled or failed - exit /b %ERRORLEVEL% - ) - if not "%2"=="local" ( - git push > NUL 2>&1 - ) - ) - - popd - git add depot - - @REM if not "%2"=="noroot" ( - @REM git stash - @REM git add depot - @REM git commit -m "sync depot" - @REM if not "%3"=="local" ( - @REM git pull - @REM git push - @REM ) - @REM git stash pop - @REM ) - - exit /b -) - -if "%1"=="push" ( - call make.bat tidy - - @REM if "%2"=="dp" ( - call MAKE.bat dpush auto - @REM ) - - call make.bat git - - git diff --quiet --exit-code - if !ERRORLEVEL! neq 0 ( - echo There are uncommitted changes. Please commit or stash them before pushing. - exit /b 1 - ) - - git status | findstr /C:"Changes to be committed:" > nul - if !ERRORLEVEL! equ 0 ( - echo There are staged changes. Proceeding with push. - ) else ( - git status | findstr /C:"Your branch is up to date with" > nul - if !ERRORLEVEL! equ 0 ( - echo Your branch is already up to date. No need to push. - exit /b 0 - ) - ) - - git status - rem git add . - git commit - git diff --quiet --exit-code --cached - if !ERRORLEVEL! neq 0 ( - echo Commit was cancelled or failed - exit /b %ERRORLEVEL% - ) - - @REM sync depot - git stash > NUL 2>&1 - git add depot > NUL 2>&1 - git commit -m "sync depot" > NUL 2>&1 - git stash pop > NUL 2>&1 - - @REM sync website - git stash > NUL 2>&1 - git add website > NUL 2>&1 - git commit -m "sync website" > NUL 2>&1 - git stash pop > NUL 2>&1 - - if not "%2"=="local" ( - git push - ) - call make.bat vps - call make.bat tidy - - exit /b -) - -if "%1"=="prep" ( - call make.bat join - call make.bat amalgamation - exit /b -) - -rem shortcuts for split & join amalgamation scripts -if "%1"=="split" ( - call tools\split.bat - exit /b -) -if "%1"=="join" ( - call tools\join.bat - exit /b -) -if "%1"=="3rd" ( - call tools\join_3rd.bat - exit /b -) -if "%1"=="swap" ( - echo Swapping #line on v4k.h - call tools\linswap engine\v4k.h - echo Swapping #line on v4k.c - call tools\linswap engine\v4k.c - exit /b -) - -rem fuse binaries and zipfiles -if "%1"=="fuse" ( - setlocal enableDelayedExpansion - if "%2"=="cook" ( - del *.zip 2> nul 1> nul & tools\cook --cook-jobs=1 - ) - for %%i in (*.exe) do set "var=%%i" && if not "!var:~0,6!"=="fused_" ( copy /y !var! fused_!var! 2>nul 1>nul & tools\ark fused_!var! *.zip ) - endlocal - exit /b -) - -rem run autotests -if "%1"=="test" ( - call TEST.bat - exit /b %errorlevel% -) - -rem check memory api calls -if "%1"=="checkmem" ( - findstr /RNC:"[^_xv]realloc[(]" engine\split\v4k* - findstr /RNC:"[^_xv]REALLOC[(]" engine\split\v4k* - findstr /RNC:"[^_xv]MALLOC[(]" engine\split\v4k* - findstr /RNC:"[^_xv]xrealloc[(]" engine\split\v4k* - findstr /RNC:"[^_xv]malloc[(]" engine\split\v4k* - findstr /RNC:"[^_xv]free[(]" engine\split\v4k* - findstr /RNC:"[^_xv]calloc[(]" engine\split\v4k* - findstr /RNC:"[^_xv]strdup[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_init[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_resize[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_reserve[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_push[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_push_front[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_free[(]" engine\split\v4k* - findstr /RNC:"[^_xv]array_free[(]" engine\split\v4k* - findstr /RNC:"[^_xv]set_init[(]" engine\split\v4k* - findstr /RNC:"[^_xv]set_insert[(]" engine\split\v4k* - findstr /RNC:"[^_xv]map_init[(]" engine\split\v4k* - findstr /RNC:"[^_xv]map_insert[(]" engine\split\v4k* - exit /b -) - -if "%1"=="todo" ( - findstr /RNC:"[^_xv]@todo" engine\split\v4k* - findstr /RNC:"[^_xv]@fixme" engine\split\v4k* - exit /b -) - -if "%1"=="leak" ( - findstr /RNC:"[^_xv]@leak" engine\split\v4k* - exit /b -) - -if "%1"=="v4web" ( - pushd website\ - git pull origin main - git add . - git commit -m "website update" - git push origin main - popd - @REM git stash - @REM git add website - @REM git commit -m "sync website" - @REM git pull - @REM git push - @REM git stash pop - exit /b -) - -if "%1"=="html5" ( - pushd demos\html5 - call make.bat %2 - popd - exit /b -) - -if "%1"=="web" ( - python demos\html5\host.py --directory demos\html5 --bind 127.0.0.1 8000 - exit /b -) - -if "%1"=="vps" ( - call make.bat docs - tools\pscp -4 -batch -i %USERPROFILE%\.ssh\putty.ppk -P 22 -l app engine\v4k.html 192.168.1.21:/home/v4k/htdocs/v4k.dev/index.html - @REM tools\pscp -4 -batch -i %USERPROFILE%\.ssh\putty.ppk -P 22 -l app engine\joint\v4k.h 192.168.1.21:/home/v4k/htdocs/v4k.dev/v4k.h - exit /b -) - -if "%1"=="fwk" ( - pushd ..\fwk-mirror - git fetch - git reset --hard origin/main - popd - call MAKE.bat fwk_prep - copy/y ..\fwk-mirror\engine\fwk.h _fwk\engine\fwk.h - copy/y ..\fwk-mirror\engine\fwk.c _fwk\engine\fwk.c - copy/y ..\fwk-mirror\engine\fwk _fwk\engine\fwk - copy/y ..\fwk-mirror\engine\split\*.inl _fwk\engine\split\ - copy/y ..\fwk-mirror\engine\art\shaders\* _fwk\engine\art\shaders\ - copy/y ..\fwk-mirror\engine\art\fx\* _fwk\engine\art\fx\ - copy/y ..\fwk-mirror\demos\art\fx\* _fwk\demos\art\fx\ - copy/y ..\fwk-mirror\tools\*.c _fwk\tools\ - copy/y ..\fwk-mirror\demos\*.c _fwk\demos\ - rem copy/y ..\fwk-mirror\engine\split\3rd_*.c _fwk\engine\split\ - call MAKE.bat fwk_back - - exit /b -) - -if "%1"=="fwk_prep" ( - if not exist "_fwk" mkdir "_fwk" - if not exist "_fwk\demos" mkdir "_fwk\demos" - if not exist "_fwk\demos\art" mkdir "_fwk\demos\art" - if not exist "_fwk\demos\art\fx" mkdir "_fwk\demos\art\fx" - if not exist "_fwk\tools" mkdir "_fwk\tools" - if not exist "_fwk\tools\editor" mkdir "_fwk\tools\editor" - if not exist "_fwk\engine" mkdir "_fwk\engine" - if not exist "_fwk\engine\art" mkdir "_fwk\engine\art" - if not exist "_fwk\engine\art\shaders" mkdir "_fwk\engine\art\shaders" - if not exist "_fwk\engine\art\fx" mkdir "_fwk\engine\art\fx" - if not exist "_fwk\engine\split" mkdir "_fwk\engine\split" - setlocal enabledelayedexpansion - xcopy /y "*" "_fwk" - xcopy /y "engine\split\3rd_*" "_fwk\engine\split" - xcopy /y "engine\art\shaders\*" "_fwk\engine\art\shaders" - xcopy /y "engine\art\fx\*" "_fwk\engine\art\fx" - xcopy /y "demos" "_fwk\demos" - xcopy /y "demos\art\fx" "_fwk\demos\art\fx" - copy /y "engine\editor.c" "_fwk\engine\editor.c" - copy /y "engine\v4k.c" "_fwk\engine\fwk.c" - copy /y "engine\v4k.h" "_fwk\engine\fwk.h" - copy /y "engine\v4k" "_fwk\engine\fwk" - rem xcopy /y/E "tools "_fwk\tools" - for %%f in ("engine\split\v4k*") do ( - set "filename=%%~nf" - set "newname=fwk!filename:v4k=!%%~xf" - echo Copying and renaming "%%f" to "_fwk\engine\split\!newname!" - copy "%%f" "_fwk\engine\split\!newname!" - ) - for %%f in (_fwk\engine\split\*) do ( - set "filename=%%~nxf" - if /i not "!filename:~0,4!"=="3rd_" ( - echo Processing: %%f - tools\fwkren.exe %%f from - ) else ( - echo Skipping %%f - ) - ) - for %%f in (_fwk\demos\*.c) do ( - set "filename=%%~nxf" - echo Processing: %%f - tools\fwkren.exe %%f from - ) - rem for %%f in (_fwk\tools\*) do ( - rem set "filename=%%~nxf" - rem echo Processing: %%f - rem tools\fwkren.exe %%f from - rem ) - rem for %%f in (_fwk\tools\editor\*.c) do ( - rem set "filename=%%~nxf" - rem echo Processing: %%f - rem tools\fwkren.exe %%f from - rem ) - - rem tools\fwkren.exe tools\cook.ini from - - echo All done. - endlocal - exit /b -) - -if "%1"=="fwk_back" ( - if not exist "_fwk" exit /b - setlocal enabledelayedexpansion - - xcopy /y "_fwk" "." - xcopy /y "_fwk\engine\split\3rd_*" "engine\split" - xcopy /y "_fwk\engine\art\shaders\*" "engine\art\shaders" - del "demos\*.c" - xcopy /y "_fwk\demos" "demos" - xcopy /y "_fwk\engine\editor.c" "engine\editor.c" - copy /y "_fwk\engine\fwk.c" "engine\v4k.c" - copy /y "_fwk\engine\fwk.h" "engine\v4k.h" - copy /y "_fwk\engine\fwk" "engine\v4k" - tools\fwkren.exe "engine\editor.c" to - tools\fwkren.exe "engine\v4k.c" to - tools\fwkren.exe "engine\v4k.h" to - tools\fwkren.exe "engine\v4k" to - tools\fwkren.exe "hello.c" to - - rem xcopy /y/E "_fwk\tools "tools" - for %%f in ("_fwk\engine\split\fwk*") do ( - set "filename=%%~nf" - set "newname=v4k!filename:fwk=!%%~xf" - echo Copying and renaming "%%f" to "engine\split\!newname!" - copy "%%f" "engine\split\!newname!" - ) - for %%f in (engine\split\*) do ( - set "filename=%%~nxf" - if /i not "!filename:~0,4!"=="3rd_" ( - echo Processing: %%f - tools\fwkren.exe %%f to - ) else ( - echo Skipping %%f - ) - ) - for %%f in (demos\*.c) do ( - set "filename=%%~nxf" - echo Processing: %%f - tools\fwkren.exe %%f to - ) - rem for %%f in (tools\*.c) do ( - rem set "filename=%%~nxf" - rem echo Processing: %%f - rem tools\fwkren.exe %%f to - rem ) - rem for %%f in (tools\editor\*.c) do ( - rem set "filename=%%~nxf" - rem echo Processing: %%f - rem tools\fwkren.exe %%f to - rem ) - - rem tools\fwkren.exe tools\cook.ini to - - rem call make.bat join - rem call make.bat amalgamation - - echo All done. - endlocal - exit /b -) - -if "%1"=="fwk_mir" ( - rd/q/s _fwk - rd/q/s ..\_fwk - mkdir ..\_fwk - setlocal enabledelayedexpansion - xcopy /y/E "*" "..\_fwk" - move "..\_fwk" _fwk - for %%f in ("engine\split\v4k*") do ( - set "filename=%%~nf" - set "newname=fwk!filename:v4k=!%%~xf" - echo Copying and renaming "%%f" to "_fwk\engine\split\!newname!" - copy "%%f" "_fwk\engine\split\!newname!" - ) - for %%f in (_fwk\engine\split\*) do ( - set "filename=%%~nxf" - if /i not "!filename:~0,4!"=="3rd_" ( - echo Processing: %%f - tools\fwkren.exe %%f from - ) else ( - echo Skipping %%f - ) - ) - for %%f in (_fwk\demos\*.c) do ( - set "filename=%%~nxf" - echo Processing: %%f - tools\fwkren.exe %%f from - ) - for %%f in (_fwk\tools\*) do ( - set "filename=%%~nxf" - echo Processing: %%f - tools\fwkren.exe %%f from - ) - for %%f in (_fwk\tools\editor\*.c) do ( - set "filename=%%~nxf" - echo Processing: %%f - tools\fwkren.exe %%f from - ) - - tools\fwkren.exe _fwk\tools\cook.ini from - tools\fwkren.exe _fwk\engine\v4k.c from - tools\fwkren.exe _fwk\engine\v4k.h from - move _fwk\engine\v4k.h _fwk\engine\fwk.h - move _fwk\engine\v4k.c _fwk\engine\fwk.c - - echo All done. - endlocal - exit /b -) - -rem tidy environment -if "%1"=="tidy" ( - call demos\html5\make.bat tidy > nul 2> nul - move /y ??-*.png demos > nul 2> nul - move /y ??-*.c demos > nul 2> nul - del bind\v4k.dll > nul 2> nul - del bind\*.zip > nul 2> nul - del .temp*.* > nul 2> nul - del *.zip > nul 2> nul - del *.mem > nul 2> nul - del *.exp > nul 2> nul - del *.exe.manifest > nul 2> nul - del tools\*.exp > nul 2> nul - del *.lib > nul 2> nul - del *.tmp > nul 2> nul - del *.exe > nul 2> nul - del *.log > nul 2> nul - del *.obj > nul 2> nul - del tools\*.obj > nul 2> nul - del *.o > nul 2> nul - del *.a > nul 2> nul - del *.pdb > nul 2> nul - del *.ilk > nul 2> nul - del *.png > nul 2> nul - del *.mp4 > nul 2> nul - del *.def > nul 2> nul - del *.dll > nul 2> nul - del *.ini > nul 2> nul - del *.csv > nul 2> nul - del 3rd_*.* > nul 2> nul - del v4k_*.* > nul 2> nul - del v4k.html > nul 2> nul - del changelog.txt > nul 2> nul - del steam_appid.txt > nul 2> nul -rem del ??-*.* > nul 2> nul - del temp_*.* > nul 2> nul - rd /q /s .vs > nul 2> nul - rd /q /s _debug > nul 2> nul - rd /q /s _devel > nul 2> nul - rd /q /s _release > nul 2> nul - rd /q /s _fwk > nul 2> nul - rd /q /s _cache > nul 2> nul - rd /q /s _deploy > nul 2> nul - rd /q /s tests\out > nul 2> nul - rd /q /s tests\diff > nul 2> nul -rem rd /q /s _project > nul 2> nul - del tcc.bat > nul 2> nul - del sh.bat > nul 2> nul - exit /b -) - -@REM join split files together before we compile -setlocal -call make.bat prep -endlocal - -set cc=%cc% -set dll=dll -set build=dev -set args=-Iengine -set run_args= -set other= -set v4k=yes -set hello=no -set demos=no -set lab=no -set editor=no -set vis=no -set proj=no -set rc=0 -set run=no -set addons= -set addons_names= -set addons_includes= - -if "%1"=="addons[" ( - rem plugins are always included in form "//plugin.h" - set "addon_includes=-Iplugins %addon_includes%" - shift && goto parse_addons -:parse_addons - if "%1"=="]" ( - shift - ) else ( - set "addon_names=%1 %addon_names%" - - rem depot folder - if exist "depot\deps\%1" ( - set "addon_includes=-Idepot\deps\%1 %addon_includes%" - if exist "depot\deps\%1\%1.cpp" ( - set "addons=depot\deps\%1\%1.cpp %addons%" - ) else ( - set "addons=depot\deps\%1\%1.c %addons%" - ) - if exist "depot\deps\%1\include" ( - set "addon_includes=-Idepot\deps\%1\include %addon_includes%" - ) - ) - if exist "plugins\%1" ( - rem set "addon_includes=-Iplugins\%1 %addon_includes%" - if exist "plugins\%1\%1.cpp" ( - set "addons=plugins\%1\%1.cpp %addons%" - ) else ( - set "addons=plugins\%1\%1.c %addons%" - ) - if exist "plugins\%1\plugin.cpp" ( - set "addons=plugins\%1\plugin.cpp %addons%" - ) else ( - set "addons=plugins\%1\plugin.c %addons%" - ) - if exist "plugins\%1\include" ( - set "addon_includes=-Iplugins\%1\include %addon_includes%" - ) - ) - shift && goto parse_addons - ) -) - -:parse_args - if "%1"=="--" shift && goto parse_compiler_args - if "%1"=="//" shift && goto parse_runtime_args - - if "%1"=="dll" set "dll=%1" && goto loop - if "%1"=="static" set "dll=%1" && goto loop - - if "%1"=="dbg" set "build=%1" && goto loop - if "%1"=="dev" set "build=%1" && goto loop - if "%1"=="rel" set "build=%1" && goto loop - if "%1"=="ret" set "build=%1" && goto loop - - if "%1"=="debug" set "build=dbg" && goto loop - if "%1"=="devel" set "build=dev" && goto loop - if "%1"=="develop" set "build=dev" && goto loop - if "%1"=="developer" set "build=dev" && goto loop - if "%1"=="development" set "build=dev" && goto loop - if "%1"=="release" set "build=rel" && goto loop - - if "%1"=="vis" set "vis=yes" && goto loop - - if "%1"=="nov4k" set "v4k=no" && goto loop - if "%1"=="nodemos" set "demos=no" && goto loop - if "%1"=="demos" set "demos=yes" && set "hello=no" && goto loop - if "%1"=="lab" set "lab=yes" && set "hello=no" && goto loop - if "%1"=="noeditor" set "editor=no" && goto loop - if "%1"=="hello" set "hello=yes" && goto loop - if "%1"=="editor" set "editor=yes" && set "v4k=yes" && set "hello=no"&& goto loop - if "%1"=="run" set "run=yes" && goto loop - if "%1"=="all" set "v4k=yes" && set "demos=yes" && set "lab=yes" && set "hello=yes" && goto loop - - if "%1"=="tcc" set "cc=%1" && goto loop - if "%1"=="cl" set "cc=%1" && goto loop - if "%1"=="vc" set "cc=cl" && goto loop - if "%1"=="cc" set "cc=%1" && goto loop - if "%1"=="gcc" set "cc=%1" && goto loop - if "%1"=="clang" set "cc=%1" && goto loop - if "%1"=="clang-cl" set "cc=%1" && goto loop - - if "%1"=="proj" set "proj=yes" && goto loop - - if not "%1"=="" set "other=!other! %1" && set "editor=no" && set "demos=no" - -:loop - if not "%1"=="" shift && goto parse_args - -:parse_compiler_args - if not "%1"=="" set "compiler_flag=%1" && set "compiler_flag=!compiler_flag::==!" && set "args=!args! !compiler_flag!" && shift && goto parse_compiler_args - -:parse_runtime_args - if not "%1"=="" set "run_args=!run_args! %1" && shift && goto parse_runtime_args - -set vs=00 -rem detect setup -if "!cc!"=="" ( - set cc=cl - where cl /q - if not %ERRORLEVEL%==0 ( - echo Detecting VS 2022/2019/2017/2015/2013 x64 ... - if exist "%VS170COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%VS170COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=22" - ) else if exist "%VS160COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%VS160COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=19" - ) else if exist "%VS150COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%VS150COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=17" - ) else if exist "%VS140COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" ( - @call "%VS140COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" > nul && set "vs=15" - ) else if exist "%VS120COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" ( - @call "%VS120COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" > nul && set "vs=13" - ) else if exist "%ProgramFiles%/microsoft visual studio/2022/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%ProgramFiles%/microsoft visual studio/2022/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=22" - ) else if exist "%ProgramFiles(x86)%/microsoft visual studio/2019/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%ProgramFiles(x86)%/microsoft visual studio/2019/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=19" - ) else if exist "%ProgramFiles(x86)%/microsoft visual studio/2017/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( - @call "%ProgramFiles(x86)%/microsoft visual studio/2017/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=17" - ) else ( - echo Detecting Mingw64 ... - set cc=gcc - where /q gcc.exe || ( echo Detecting TCC ... && set "cc=tcc" ) - ) - ) -) - -rem solution. @todo: lin/osx -if "!proj!"=="yes" if not "%vs%"=="00" pushd tools && premake5 vs20%vs% & popd -if "!proj!"=="yes" if "%vs%"=="00" pushd tools && premake5 vs2013 & popd -if "!proj!"=="yes" pushd tools && premake5 ninja & popd -if "!proj!"=="yes" pushd tools && premake5 gmake & popd & exit /b - -rem --- pipeline -rem cl tools/ass2iqe.c /Fetools/ass2iqe.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG assimp.lib -rem cl tools/iqe2iqm.cpp /Fetools/iqe2iqm.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG -rem cl tools/mid2wav.c /Fetools/mid2wav.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG -rem cl tools/xml2json.c /Fetools/xml2json.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG -rem --- pipeline -rem gcc tools/ass2iqe.c -o tools/ass2iqe.exe -w -lassimp -rem gcc tools/iqe2iqm.cpp -o tools/iqe2iqm.exe -w -lstdc++ -rem gcc tools/mid2wav.c -o tools/mid2wav.exe -w -rem gcc tools/xml2json.c -o tools/xml2json.exe -w -rem --- different strategies for release builds -rem 4.6s 6.9MiB (default) -rem 33.7s 6.6MiB /Ox /Oy /MT /DNDEBUG -rem 35.8s 5.3MiB /O2 /Oy /MT /DNDEBUG -rem 17.9s 4.6MiB /O1 /MT /DNDEBUG /GL /GF /arch:AVX2 -rem 17.8s 4.6MiB /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /arch:AVX2 -rem 18.8s 4.6MiB /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /link /OPT:ICF /LTCG -rem 18.0s 4.6MiB /openmp /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG - -if "!cc!"=="cl" ( - - if "!dll!"=="static" ( - set export=/c - set import=v4k.obj - ) else ( - set export=/DAPI=EXPORT /LD - set import=/DAPI=IMPORT v4k.lib - ) - - if "!build!"=="ret" ( - set args=-DENABLE_RETAIL -Dmain=WinMain !args! - set args=/nologo /Zi /MT /DNDEBUG=3 !args! /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG - ) - if "!build!"=="rel" ( - set args=/nologo /Zi /MT /openmp /DNDEBUG=2 !args! /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG - ) - if "!build!"=="dev" ( - set args=/nologo /Zi /MT /openmp /DNDEBUG=1 !args! && REM /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 - ) - if "!build!"=="dbg" ( - set args=/nologo /Zi /MT /DEBUG !args! /Od /fsanitize=address - rem make -- /RTC1, or make -- /Zi /fsanitize=address /DEBUG - ) - - set o=/Fe: - set echo=REM - -) else if "!cc!"=="clang-cl" ( - - if "!dll!"=="static" ( - set export=/c - set import=v4k.obj - ) else ( - set export=/DAPI=EXPORT /LD - set import=/DAPI=IMPORT v4k.lib - ) - - set warnings_fwkc=-Wno-deprecated-declarations -Wno-tautological-constant-out-of-range-compare - set warnings_demos=-Wno-empty-body -Wno-format-security -Wno-pointer-sign - set warnings=!warnings_fwkc! !warnings_demos! - - if "!build!"=="ret" ( - set args=-DENABLE_RETAIL -Dmain=WinMain !args! - set args=!warnings! /nologo /Zi /MT /DNDEBUG=3 !args! /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 - ) - if "!build!"=="rel" ( - set args=!warnings! /nologo /Zi /MT /openmp /DNDEBUG=2 !args! /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 - ) - if "!build!"=="dev" ( - set args=!warnings! /nologo /Zi /MT /openmp /DNDEBUG=1 !args! && REM /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 - ) - if "!build!"=="dbg" ( - set args=!warnings! /nologo /Zi /MT /DEBUG !args! /Od /fsanitize=address - ) - - set o=-o - set echo=echo - -) else if "!cc!"=="tcc" ( - - if "!dll!"=="static" ( - set export=-c - set import=v4k.o - ) else ( - set export=-DAPI=EXPORT -shared - set import=-DAPI=IMPORT v4k.def - ) - - if "!build!"=="ret" ( - set args=-DENABLE_RETAIL -Dmain=WinMain !args! - set args=-O3 -DNDEBUG=3 !args! - ) - if "!build!"=="rel" ( - set args=-O2 -DNDEBUG=2 !args! - ) - if "!build!"=="dev" ( - set args=-O1 -DNDEBUG=1 -g !args! - ) - if "!build!"=="dbg" ( - set args=-O0 -g !args! - ) - - set o=-o - set echo=echo - -) else ( rem if "!cc!"=="gcc" or "clang" - - set libs=-lws2_32 -lgdi32 -lwinmm -ldbghelp -lole32 -lshell32 -lcomdlg32 - - if "!dll!"=="static" ( - set export=-c - set import=v4k.o -Wl,--allow-multiple-definition - ) else ( - set export=-DAPI=EXPORT -shared -o v4k.dll -Wl,--out-implib,v4k.a - set import=-DAPI=IMPORT v4k.a - ) - - set args=-Wno-implicit-function-declaration !libs! !args! - - if "!build!"=="ret" ( - set args=-DENABLE_RETAIL !args! - set args=-O3 -DNDEBUG=3 !args! - ) - if "!build!"=="rel" ( - rem @todo see: https://stackoverflow.com/questions/866721/how-to-generate-gcc-debug-symbol-outside-the-build-target - set args=-O2 -DNDEBUG=2 !args! - ) - if "!build!"=="dev" ( - set args=-O1 -DNDEBUG=1 -g !args! - ) - if "!build!"=="dbg" ( - set args=-O0 -g !args! - ) - - set o=-o - set echo=echo -) - -echo build=!build!, type=!dll!, cc=!cc!, other=!other!, args=!args! -echo import=!import!, export=!export! -echo addons=!addon_names! - -rem set BUILD_VERSION symbol -git describe --tags --abbrev=0 > info.obj -set /p VERSION= info.obj -set /p GIT_REVISION= info.obj -set /p GIT_BRANCH= info.obj -set /p GIT_TAG= info.obj -set /p LAST_MODIFIED= info.obj -set /p GIT_HASH=nul find "V4K_IMPLEMENTATION" !other! && ( - set import= - set v4k=no - ) -) - -rem framework -if "!v4k!"=="yes" ( - tools\file2hash engine\v4k.c engine\v4k.h engine\v4k engine\joint\v4k.h !addons! -- !build! !import! !export! !args! !dll! > nul - set cache=_cache\.!errorlevel! - md _cache 2>nul >nul - - if not exist "!cache!" ( - !echo! v4k && !cc! engine\v4k.c !addons! -DADDON !addon_includes! !export! !args! || set rc=1 - if not "!rc!"=="1" ( - if "!dll!"=="dll" copy /y v4k.dll bind\v4k.dll > nul - - rem cache for `make rel` cl:48s->25s, tcc:3.3s->1.8s - echo. > !cache! - if exist v4k.o copy /y v4k.o !cache!.o 2>nul >nul - if exist v4k.obj copy /y v4k.obj !cache!.obj 2>nul >nul - if exist v4k.lib copy /y v4k.lib !cache!.lib 2>nul >nul - if exist v4k.dll copy /y v4k.dll !cache!.dll 2>nul >nul - if exist v4k.def copy /y v4k.def !cache!.def 2>nul >nul - if exist v4k.pdb copy /y v4k.pdb !cache!.pdb 2>nul >nul - ) - ) else ( - rem cached. do not compile... - echo v4k.c ^(cached^) - if "!dll!"=="dll" copy /y !cache!.dll bind\v4k.dll > nul || set rc=1 - - if exist !cache!.o copy /y !cache!.o v4k.o 2>nul >nul - if exist !cache!.obj copy /y !cache!.obj v4k.obj 2>nul >nul - if exist !cache!.lib copy /y !cache!.lib v4k.lib 2>nul >nul - if exist !cache!.dll copy /y !cache!.dll v4k.dll 2>nul >nul - if exist !cache!.def copy /y !cache!.def v4k.def 2>nul >nul - if exist !cache!.pdb copy /y !cache!.pdb v4k.pdb 2>nul >nul - ) -) - - -rem editor -if "!editor!"=="yes" ( -set edit=-DCOOK_ON_DEMAND -rem set edit=-DUI_LESSER_SPACING -DUI_ICONS_SMALL !edit! -!echo! editor && !cc! !o! editor.exe engine\editor.c engine\v4k.c !addon_includes! !edit! -Iengine/joint !args! || set rc=1 - -rem if "!cc!"=="cl" ( -rem set plug_export=/LD -rem ) else if "!cc!"=="clang-cl" ( -rem set plug_export=/LD -rem ) else ( -rem set plug_export=-shared -rem ) - -rem for %%f in ("workbench\plugins\*.c") do ( -rem !echo! %%~nf && !cc! !o! %%~nf.dll %%f -Iworkbench !plug_export! !args! !import! || set rc=1 -rem ) - -rem !echo! workbench && !cc! !o! workbench.exe workbench\workbench.c -Iworkbench !args! !import! || set rc=1 -) - -rem demos -if "!demos!"=="yes" ( - for %%f in ("demos\??-*") do ( - set "fname=%%~nf" - echo !fname!| findstr /R "^[0-9][0-9]-" >nul && ( - if not "!fname:~0,2!"=="99" ( - set limport=!import! - >nul find "V4K_IMPLEMENTATION" "demos\!fname!.c" && ( - set limport= - ) - !echo! !fname! && !cc! !o! !fname!.exe "demos\!fname!.c" !addon_includes! !limport! !args! || set rc=1 - ) - ) - ) -) - - -rem lab -if "!lab!"=="yes" ( - for %%f in ("demos\99-*") do ( - set limport=!import! - >nul find "V4K_IMPLEMENTATION" demos\%%~nf.c && ( - set limport= - ) - !echo! %%~nf && !cc! !o! %%~nf.exe demos\%%~nf.c !addon_includes! !limport! !args! || set rc=1 - ) -) - -rem hello -if "!hello!"=="yes" ( -!echo! hello && !cc! !o! hello.exe hello.c !addon_includes! !args! || set rc=1 -) - -rem user-defined apps -if not "!other!"=="" ( - if "!vis!"=="yes" echo !cc! !other! !import! !args! - rem if "!cc!"=="cl" ( - rem if "!build!"=="rel" ( - rem set "import=!import! engine\v4k_win32_rel_glue.c" - rem set "args=!args! /SUBSYSTEM:WINDOWS" - rem ) - rem ) - for /f "tokens=*" %%a in ("%other%") do set exename=%%~na.exe - del !exename! >NUL - !echo! !other! && !cc! !other! !addon_includes! !import! !args! || set rc=1 -) - -if "!run!"=="yes" ( - if "!rc!"=="1" ( - echo build failed. skipping run! - ) else ( - set exename=hello.exe - if not "!other!"=="" ( - for /f "tokens=*" %%a in ("!other!") do set exename=%%~na.exe - ) - echo run !exename! !run_args! - !exename! !run_args! || set rc=1 - ) -) - -rem PAUSE only if double-clicked from Windows explorer -rem (((echo.%cmdcmdline%)|%WINDIR%\system32\find.exe /I "%~0")>nul)&&pause - -cmd /c exit !rc! +@echo off +setlocal enableDelayedExpansion +cd /d "%~dp0" + +rem echo Args: %* + +rem show help +if "%1"=="-?" goto showhelp +if "%1"=="-h" goto showhelp +if "%1"=="help" ( + :showhelp + echo %0 ; compile everything: `make dll dev` alias + echo %0 [help] ; show this screen + echo %0 [docs] ; generate tools/docs/docs.html file + echo %0 [cook] ; cook .zipfiles with tools/cook.ini cookbook + echo %0 [build_cook] ; build cook tool in release mode + echo %0 [sync] ; sync/reset repo to latest + echo %0 [fwk_prep] ; prepare files for fwk PR + echo %0 [fwk] ; update fwk-mirror fork + echo %0 [lua] ; execute lua script with v4k + echo %0 [html5] ; build HTML5 demo + echo %0 [web] ; run Python webserver in html5 dir + echo %0 [pull] ; pull changes from origin + echo %0 [push] ; prepare for commit, stage changes and commit them + echo %0 [dstat] ; show depot changes + echo %0 [dpush] ; push depot changes + echo %0 [depot] ; sync depot changes + echo %0 [fuse] ; fuse all binaries and cooked zipfiles found together + echo %0 [git] ; prepare for commit + echo %0 [vps] ; upload the release to VPS + echo %0 [tidy] ; clean up temp files + echo %0 [bind] ; generate lua bindings + echo %0 [checkmem] ; check untracked allocators in V4K + echo %0 [test] ; run autotests + echo %0 [todo] ; check for @fixme and @todo + echo %0 [leak] ; check for @leak + echo %0 [v4web] ; sync v4 website + echo %0 [swap] ; toggle #line directives on/off + echo %0 [split^|join] ; engine/v4k* ^>split^> engine/split/* or engine/split/* ^>join^> engine/v4k* + echo %0 [3rd] ; join 3rd parties together + echo %0 [lua] ; execute lua script with v4k + echo %0 [amalgamation] ; combine engine/v4k* into a single-header file + echo %0 [prep] ; combine split files into a single-header file, ready for use + echo %0 [sln] ; generate a xcode/gmake/ninja/visual studio solution + echo %0 [addons[ names ] ] ; specify list of addons you want to compile with the engine + echo %0 [cl^|tcc^|cc^|gcc^|clang^|clang-cl] [dbg^|dev^|rel^|ret] [static^|dll] [nov4k^|nodemos^|editor] [vis] [-- args] + echo cl \ + echo tcc ^| + echo cc ^| select compiler. must be accessible in PATH + echo gcc ^| (will be autodetected when no option is provided^) + echo clang ^| + echo clang-cl / + echo dbg \ debug build: [x] ASAN [x] poison [x] asserts [x] profiler [x] symbols [ ] zero optimizations + echo dev ^| develop build: [ ] ASAN [x] poison [x] asserts [x] profiler [x] symbols [*] some optimizations (default^) + echo rel / release build: [ ] ASAN [ ] poison [ ] asserts [ ] profiler [x] symbols (cl,clang-cl only^) [x] many optimizations + echo static \ link v4k as static library + echo dll / link v4k as dynamic library (dll^) (default^) + echo nov4k \ do not compile framework + echo demos ^| do compile demos + echo editor / do compile editor + echo run ^| run compiled .exe + echo vis ^> visualize invokation cmdline. + echo args ^> after `--` separator is found, pass all remaining arguments to compiler as-is + echo run_args ^> after `//` separator is found, pass all remaining arguments to runtime exe as-is + echo. + exit /b +) + +rem sync repo to latest +if "%1"=="sync" ( + call MAKE.bat tidy + git reset --hard origin/main + exit /b +) + +rem cook asset files +if "%1"=="cook" ( + rem generate cooker twice: use multi-threaded version if available (cl). then cook. + rem call tools\tcc tools\cook.c -Iengine engine\v4k.c + rem cl tools\cook.c -Iengine engine\v4k.c + rem cook + tools\cook + + exit /b +) +if "%1"=="build_cook" ( + pushd tools + cl cook.c -I..\engine /openmp /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG + popd + + exit /b +) +rem generate bindings +if "%1"=="bind" ( + rem luajit + tools\luajit tools\luajit_make_bindings.lua > v4k.lua + move /y v4k.lua bind + + exit /b +) + +if "%1"=="lua" ( + pushd bind + luajit "..\%2" + popd + exit /b +) + +rem generate documentation +if "%1"=="docs" ( + rem set symbols... + git describe --tags --abbrev=0 > info.obj + set /p VERSION= info.obj + set /p GIT_REVISION= info.obj + set /p GIT_BRANCH= info.obj + set /p LAST_MODIFIED= changelog.txt + + rem ...and generate docs + rem cl tools\docs\docs.c engine\v4k.c -Iengine /Od /DNDEBUG %2 + tools\docs engine\v4k.h --excluded=3rd_glad.h,v4k.h,v4k_compat.h, > v4k.html + move /y v4k.html engine\ + del changelog.txt + del info.obj + + exit /b +) +rem generate single-header distribution +if "%1"=="amalgamation" ( +echo // This file is intended to be consumed by a compiler. Do not read. > v4k.h +echo // **Browse to any of the sources in engine/split/ folder instead** >> v4k.h +echo // ---------------------------------------------------------------- >> v4k.h +echo // #define V4K_IMPLEMENTATION early in **one** C file to unroll the >> v4k.h +echo // implementation. The symbol must be defined in a C (not C++^) file>> v4k.h +echo // ---------------------------------------------------------------- >> v4k.h +echo #pragma once >> v4k.h +type engine\split\3rd_icon_md.h >> v4k.h +type engine\split\3rd_glad.h >> v4k.h +type engine\v4k.h >> v4k.h +echo #ifdef V4K_IMPLEMENTATION >> v4k.h +echo #define V4K_3RD >> v4k.h +type engine\v4k >> v4k.h +type engine\v4k.c >> v4k.h +echo #endif // V4K_IMPLEMENTATION >> v4k.h +move /y v4k.h engine\joint +exit /b +) + +rem generate prior files to a git release +if "%1"=="git" ( + rem call make.bat dll + call make.bat prep + call make.bat bind + rem call make.bat docs + + rem call make.bat amalgamation + rem call make.bat split + +rem rd /q /s engine\split +rem md engine\split +rem move /y v4k_*.? engine\split\ +rem move /y 3rd_*.? engine\split\ + + call make.bat tidy + git add engine/split + git add engine/joint + git add engine/v4k + git add engine/v4k.* + git add MAKE.bat + git add bind/v4k.lua + git status + + exit /b +) + +if "%1"=="pull" ( + git pull + exit /b +) + +if "%1"=="depot" ( + pushd depot\ + git pull + popd + git submodule update --remote --merge depot/ + exit /b +) + +if "%1"=="dstat" ( + pushd depot + git status + popd + exit /b +) + +if "%1"=="dpush" ( + pushd depot + git add . > NUL 2>&1 + if "%2"=="auto" ( + git commit -m "asset update" > NUL 2>&1 + git push > NUL 2>&1 + ) else ( + git commit > NUL 2>&1 + git diff --quiet --exit-code --cached + if !ERRORLEVEL! neq 0 ( + echo Commit was cancelled or failed + exit /b %ERRORLEVEL% + ) + if not "%2"=="local" ( + git push > NUL 2>&1 + ) + ) + + popd + git add depot + + @REM if not "%2"=="noroot" ( + @REM git stash + @REM git add depot + @REM git commit -m "sync depot" + @REM if not "%3"=="local" ( + @REM git pull + @REM git push + @REM ) + @REM git stash pop + @REM ) + + exit /b +) + +if "%1"=="push" ( + call make.bat tidy + + @REM if "%2"=="dp" ( + call MAKE.bat dpush auto + @REM ) + + call make.bat git + git add . + + git diff --quiet --exit-code + if !ERRORLEVEL! neq 0 ( + echo There are uncommitted changes. Please commit or stash them before pushing. + exit /b 1 + ) + + git status | findstr /C:"Changes to be committed:" > nul + if !ERRORLEVEL! equ 0 ( + echo There are staged changes. Proceeding with push. + ) else ( + git status | findstr /C:"Your branch is up to date with" > nul + if !ERRORLEVEL! equ 0 ( + echo Your branch is already up to date. No need to push. + exit /b 0 + ) + ) + + git status + rem git add . + git commit + git diff --quiet --exit-code --cached + if !ERRORLEVEL! neq 0 ( + echo Commit was cancelled or failed + exit /b %ERRORLEVEL% + ) + + @REM sync depot + git stash > NUL 2>&1 + git add depot > NUL 2>&1 + git commit -m "sync depot" > NUL 2>&1 + git stash pop > NUL 2>&1 + + @REM sync website + git stash > NUL 2>&1 + git add website > NUL 2>&1 + git commit -m "sync website" > NUL 2>&1 + git stash pop > NUL 2>&1 + + if not "%2"=="local" ( + git push + ) + call make.bat vps + call make.bat tidy + + exit /b +) + +if "%1"=="prep" ( + call make.bat join + call make.bat amalgamation + exit /b +) + +rem shortcuts for split & join amalgamation scripts +if "%1"=="split" ( + call tools\split.bat + exit /b +) +if "%1"=="join" ( + call tools\join.bat + exit /b +) +if "%1"=="3rd" ( + call tools\join_3rd.bat + exit /b +) +if "%1"=="swap" ( + echo Swapping #line on v4k.h + call tools\linswap engine\v4k.h + echo Swapping #line on v4k.c + call tools\linswap engine\v4k.c + exit /b +) + +rem fuse binaries and zipfiles +if "%1"=="fuse" ( + setlocal enableDelayedExpansion + if "%2"=="cook" ( + del *.zip 2> nul 1> nul & tools\cook --cook-jobs=1 + ) + for %%i in (*.exe) do set "var=%%i" && if not "!var:~0,6!"=="fused_" ( copy /y !var! fused_!var! 2>nul 1>nul & tools\ark fused_!var! *.zip ) + endlocal + exit /b +) + +rem run autotests +if "%1"=="test" ( + call TEST.bat + exit /b %errorlevel% +) + +rem check memory api calls +if "%1"=="checkmem" ( + findstr /RNC:"[^_xv]realloc[(]" engine\split\v4k* + findstr /RNC:"[^_xv]REALLOC[(]" engine\split\v4k* + findstr /RNC:"[^_xv]MALLOC[(]" engine\split\v4k* + findstr /RNC:"[^_xv]xrealloc[(]" engine\split\v4k* + findstr /RNC:"[^_xv]malloc[(]" engine\split\v4k* + findstr /RNC:"[^_xv]free[(]" engine\split\v4k* + findstr /RNC:"[^_xv]calloc[(]" engine\split\v4k* + findstr /RNC:"[^_xv]strdup[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_init[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_resize[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_reserve[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_push[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_push_front[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_free[(]" engine\split\v4k* + findstr /RNC:"[^_xv]array_free[(]" engine\split\v4k* + findstr /RNC:"[^_xv]set_init[(]" engine\split\v4k* + findstr /RNC:"[^_xv]set_insert[(]" engine\split\v4k* + findstr /RNC:"[^_xv]map_init[(]" engine\split\v4k* + findstr /RNC:"[^_xv]map_insert[(]" engine\split\v4k* + exit /b +) + +if "%1"=="todo" ( + findstr /RNC:"[^_xv]@todo" engine\split\v4k* + findstr /RNC:"[^_xv]@fixme" engine\split\v4k* + exit /b +) + +if "%1"=="leak" ( + findstr /RNC:"[^_xv]@leak" engine\split\v4k* + exit /b +) + +if "%1"=="v4web" ( + pushd website\ + git pull origin main + git add . + git commit -m "website update" + git push origin main + popd + @REM git stash + @REM git add website + @REM git commit -m "sync website" + @REM git pull + @REM git push + @REM git stash pop + exit /b +) + +if "%1"=="html5" ( + pushd demos\html5 + call make.bat %2 + popd + exit /b +) + +if "%1"=="web" ( + python demos\html5\host.py --directory demos\html5 --bind 127.0.0.1 8000 + exit /b +) + +if "%1"=="vps" ( + call make.bat docs + tools\pscp -4 -batch -i %USERPROFILE%\.ssh\putty.ppk -P 22 -l app engine\v4k.html 192.168.1.21:/home/v4k/htdocs/v4k.dev/index.html + @REM tools\pscp -4 -batch -i %USERPROFILE%\.ssh\putty.ppk -P 22 -l app engine\joint\v4k.h 192.168.1.21:/home/v4k/htdocs/v4k.dev/v4k.h + exit /b +) + +if "%1"=="fwk" ( + pushd ..\fwk-mirror + git fetch + git reset --hard origin/main + popd + call MAKE.bat fwk_prep + copy/y ..\fwk-mirror\engine\fwk.h _fwk\engine\fwk.h + copy/y ..\fwk-mirror\engine\fwk.c _fwk\engine\fwk.c + copy/y ..\fwk-mirror\engine\fwk _fwk\engine\fwk + copy/y ..\fwk-mirror\engine\split\*.inl _fwk\engine\split\ + copy/y ..\fwk-mirror\engine\art\shaders\* _fwk\engine\art\shaders\ + copy/y ..\fwk-mirror\engine\art\fx\* _fwk\engine\art\fx\ + copy/y ..\fwk-mirror\demos\art\fx\* _fwk\demos\art\fx\ + copy/y ..\fwk-mirror\tools\*.c _fwk\tools\ + copy/y ..\fwk-mirror\demos\*.c _fwk\demos\ + rem copy/y ..\fwk-mirror\engine\split\3rd_*.c _fwk\engine\split\ + call MAKE.bat fwk_back + + exit /b +) + +if "%1"=="fwk_prep" ( + if not exist "_fwk" mkdir "_fwk" + if not exist "_fwk\demos" mkdir "_fwk\demos" + if not exist "_fwk\demos\art" mkdir "_fwk\demos\art" + if not exist "_fwk\demos\art\fx" mkdir "_fwk\demos\art\fx" + if not exist "_fwk\tools" mkdir "_fwk\tools" + if not exist "_fwk\tools\editor" mkdir "_fwk\tools\editor" + if not exist "_fwk\engine" mkdir "_fwk\engine" + if not exist "_fwk\engine\art" mkdir "_fwk\engine\art" + if not exist "_fwk\engine\art\shaders" mkdir "_fwk\engine\art\shaders" + if not exist "_fwk\engine\art\fx" mkdir "_fwk\engine\art\fx" + if not exist "_fwk\engine\split" mkdir "_fwk\engine\split" + setlocal enabledelayedexpansion + xcopy /y "*" "_fwk" + xcopy /y "engine\split\3rd_*" "_fwk\engine\split" + xcopy /y "engine\art\shaders\*" "_fwk\engine\art\shaders" + xcopy /y "engine\art\fx\*" "_fwk\engine\art\fx" + xcopy /y "demos" "_fwk\demos" + xcopy /y "demos\art\fx" "_fwk\demos\art\fx" + copy /y "engine\editor.c" "_fwk\engine\editor.c" + copy /y "engine\v4k.c" "_fwk\engine\fwk.c" + copy /y "engine\v4k.h" "_fwk\engine\fwk.h" + copy /y "engine\v4k" "_fwk\engine\fwk" + rem xcopy /y/E "tools "_fwk\tools" + for %%f in ("engine\split\v4k*") do ( + set "filename=%%~nf" + set "newname=fwk!filename:v4k=!%%~xf" + echo Copying and renaming "%%f" to "_fwk\engine\split\!newname!" + copy "%%f" "_fwk\engine\split\!newname!" + ) + for %%f in (_fwk\engine\split\*) do ( + set "filename=%%~nxf" + if /i not "!filename:~0,4!"=="3rd_" ( + echo Processing: %%f + tools\fwkren.exe %%f from + ) else ( + echo Skipping %%f + ) + ) + for %%f in (_fwk\demos\*.c) do ( + set "filename=%%~nxf" + echo Processing: %%f + tools\fwkren.exe %%f from + ) + rem for %%f in (_fwk\tools\*) do ( + rem set "filename=%%~nxf" + rem echo Processing: %%f + rem tools\fwkren.exe %%f from + rem ) + rem for %%f in (_fwk\tools\editor\*.c) do ( + rem set "filename=%%~nxf" + rem echo Processing: %%f + rem tools\fwkren.exe %%f from + rem ) + + rem tools\fwkren.exe tools\cook.ini from + + echo All done. + endlocal + exit /b +) + +if "%1"=="fwk_back" ( + if not exist "_fwk" exit /b + setlocal enabledelayedexpansion + + xcopy /y "_fwk" "." + xcopy /y "_fwk\engine\split\3rd_*" "engine\split" + xcopy /y "_fwk\engine\art\shaders\*" "engine\art\shaders" + del "demos\*.c" + xcopy /y "_fwk\demos" "demos" + xcopy /y "_fwk\engine\editor.c" "engine\editor.c" + copy /y "_fwk\engine\fwk.c" "engine\v4k.c" + copy /y "_fwk\engine\fwk.h" "engine\v4k.h" + copy /y "_fwk\engine\fwk" "engine\v4k" + tools\fwkren.exe "engine\editor.c" to + tools\fwkren.exe "engine\v4k.c" to + tools\fwkren.exe "engine\v4k.h" to + tools\fwkren.exe "engine\v4k" to + tools\fwkren.exe "hello.c" to + + rem xcopy /y/E "_fwk\tools "tools" + for %%f in ("_fwk\engine\split\fwk*") do ( + set "filename=%%~nf" + set "newname=v4k!filename:fwk=!%%~xf" + echo Copying and renaming "%%f" to "engine\split\!newname!" + copy "%%f" "engine\split\!newname!" + ) + for %%f in (engine\split\*) do ( + set "filename=%%~nxf" + if /i not "!filename:~0,4!"=="3rd_" ( + echo Processing: %%f + tools\fwkren.exe %%f to + ) else ( + echo Skipping %%f + ) + ) + for %%f in (demos\*.c) do ( + set "filename=%%~nxf" + echo Processing: %%f + tools\fwkren.exe %%f to + ) + rem for %%f in (tools\*.c) do ( + rem set "filename=%%~nxf" + rem echo Processing: %%f + rem tools\fwkren.exe %%f to + rem ) + rem for %%f in (tools\editor\*.c) do ( + rem set "filename=%%~nxf" + rem echo Processing: %%f + rem tools\fwkren.exe %%f to + rem ) + + rem tools\fwkren.exe tools\cook.ini to + + rem call make.bat join + rem call make.bat amalgamation + + echo All done. + endlocal + exit /b +) + +if "%1"=="fwk_mir" ( + rd/q/s _fwk + rd/q/s ..\_fwk + mkdir ..\_fwk + setlocal enabledelayedexpansion + xcopy /y/E "*" "..\_fwk" + move "..\_fwk" _fwk + for %%f in ("engine\split\v4k*") do ( + set "filename=%%~nf" + set "newname=fwk!filename:v4k=!%%~xf" + echo Copying and renaming "%%f" to "_fwk\engine\split\!newname!" + copy "%%f" "_fwk\engine\split\!newname!" + ) + for %%f in (_fwk\engine\split\*) do ( + set "filename=%%~nxf" + if /i not "!filename:~0,4!"=="3rd_" ( + echo Processing: %%f + tools\fwkren.exe %%f from + ) else ( + echo Skipping %%f + ) + ) + for %%f in (_fwk\demos\*.c) do ( + set "filename=%%~nxf" + echo Processing: %%f + tools\fwkren.exe %%f from + ) + for %%f in (_fwk\tools\*) do ( + set "filename=%%~nxf" + echo Processing: %%f + tools\fwkren.exe %%f from + ) + for %%f in (_fwk\tools\editor\*.c) do ( + set "filename=%%~nxf" + echo Processing: %%f + tools\fwkren.exe %%f from + ) + + tools\fwkren.exe _fwk\tools\cook.ini from + tools\fwkren.exe _fwk\engine\v4k.c from + tools\fwkren.exe _fwk\engine\v4k.h from + move _fwk\engine\v4k.h _fwk\engine\fwk.h + move _fwk\engine\v4k.c _fwk\engine\fwk.c + + echo All done. + endlocal + exit /b +) + +rem tidy environment +if "%1"=="tidy" ( + call demos\html5\make.bat tidy > nul 2> nul + move /y ??-*.png demos > nul 2> nul + move /y ??-*.c demos > nul 2> nul + del bind\v4k.dll > nul 2> nul + del bind\*.zip > nul 2> nul + del .temp*.* > nul 2> nul + del *.zip > nul 2> nul + del *.mem > nul 2> nul + del *.exp > nul 2> nul + del *.exe.manifest > nul 2> nul + del tools\*.exp > nul 2> nul + del *.lib > nul 2> nul + del *.tmp > nul 2> nul + del *.exe > nul 2> nul + del *.log > nul 2> nul + del *.obj > nul 2> nul + del tools\*.obj > nul 2> nul + del *.o > nul 2> nul + del *.a > nul 2> nul + del *.pdb > nul 2> nul + del *.ilk > nul 2> nul + del *.png > nul 2> nul + del *.mp4 > nul 2> nul + del *.def > nul 2> nul + del *.dll > nul 2> nul + del *.ini > nul 2> nul + del *.csv > nul 2> nul + del 3rd_*.* > nul 2> nul + del v4k_*.* > nul 2> nul + del v4k.html > nul 2> nul + del changelog.txt > nul 2> nul + del steam_appid.txt > nul 2> nul +rem del ??-*.* > nul 2> nul + del temp_*.* > nul 2> nul + rd /q /s .vs > nul 2> nul + rd /q /s _debug > nul 2> nul + rd /q /s _devel > nul 2> nul + rd /q /s _release > nul 2> nul + rd /q /s _fwk > nul 2> nul + rd /q /s _cache > nul 2> nul + rd /q /s _deploy > nul 2> nul + rd /q /s tests\out > nul 2> nul + rd /q /s tests\diff > nul 2> nul +rem rd /q /s _project > nul 2> nul + del tcc.bat > nul 2> nul + del sh.bat > nul 2> nul + exit /b +) + +@REM join split files together before we compile +setlocal +call make.bat prep +endlocal + +set cc=%cc% +set dll=dll +set build=dev +set args=-Iengine +set run_args= +set other= +set v4k=yes +set hello=no +set demos=no +set lab=no +set editor=no +set vis=no +set proj=no +set rc=0 +set run=no +set addons= +set addons_names= +set addons_includes= + +if "%1"=="addons[" ( + rem plugins are always included in form "//plugin.h" + set "addon_includes=-Iplugins %addon_includes%" + shift && goto parse_addons +:parse_addons + if "%1"=="]" ( + shift + ) else ( + set "addon_names=%1 %addon_names%" + + rem depot folder + if exist "depot\deps\%1" ( + set "addon_includes=-Idepot\deps\%1 %addon_includes%" + if exist "depot\deps\%1\%1.cpp" ( + set "addons=depot\deps\%1\%1.cpp %addons%" + ) else ( + set "addons=depot\deps\%1\%1.c %addons%" + ) + if exist "depot\deps\%1\include" ( + set "addon_includes=-Idepot\deps\%1\include %addon_includes%" + ) + ) + if exist "plugins\%1" ( + rem set "addon_includes=-Iplugins\%1 %addon_includes%" + if exist "plugins\%1\%1.cpp" ( + set "addons=plugins\%1\%1.cpp %addons%" + ) else ( + set "addons=plugins\%1\%1.c %addons%" + ) + if exist "plugins\%1\plugin.cpp" ( + set "addons=plugins\%1\plugin.cpp %addons%" + ) else ( + set "addons=plugins\%1\plugin.c %addons%" + ) + if exist "plugins\%1\include" ( + set "addon_includes=-Iplugins\%1\include %addon_includes%" + ) + ) + shift && goto parse_addons + ) +) + +:parse_args + if "%1"=="--" shift && goto parse_compiler_args + if "%1"=="//" shift && goto parse_runtime_args + + if "%1"=="dll" set "dll=%1" && goto loop + if "%1"=="static" set "dll=%1" && goto loop + + if "%1"=="dbg" set "build=%1" && goto loop + if "%1"=="dev" set "build=%1" && goto loop + if "%1"=="rel" set "build=%1" && goto loop + if "%1"=="ret" set "build=%1" && goto loop + + if "%1"=="debug" set "build=dbg" && goto loop + if "%1"=="devel" set "build=dev" && goto loop + if "%1"=="develop" set "build=dev" && goto loop + if "%1"=="developer" set "build=dev" && goto loop + if "%1"=="development" set "build=dev" && goto loop + if "%1"=="release" set "build=rel" && goto loop + + if "%1"=="vis" set "vis=yes" && goto loop + + if "%1"=="nov4k" set "v4k=no" && goto loop + if "%1"=="nodemos" set "demos=no" && goto loop + if "%1"=="demos" set "demos=yes" && set "hello=no" && goto loop + if "%1"=="lab" set "lab=yes" && set "hello=no" && goto loop + if "%1"=="noeditor" set "editor=no" && goto loop + if "%1"=="hello" set "hello=yes" && goto loop + if "%1"=="editor" set "editor=yes" && set "v4k=yes" && set "hello=no"&& goto loop + if "%1"=="run" set "run=yes" && goto loop + if "%1"=="all" set "v4k=yes" && set "demos=yes" && set "lab=yes" && set "hello=yes" && goto loop + + if "%1"=="tcc" set "cc=%1" && goto loop + if "%1"=="cl" set "cc=%1" && goto loop + if "%1"=="vc" set "cc=cl" && goto loop + if "%1"=="cc" set "cc=%1" && goto loop + if "%1"=="gcc" set "cc=%1" && goto loop + if "%1"=="clang" set "cc=%1" && goto loop + if "%1"=="clang-cl" set "cc=%1" && goto loop + + if "%1"=="proj" set "proj=yes" && goto loop + + if not "%1"=="" set "other=!other! %1" && set "editor=no" && set "demos=no" + +:loop + if not "%1"=="" shift && goto parse_args + +:parse_compiler_args + if not "%1"=="" set "compiler_flag=%1" && set "compiler_flag=!compiler_flag::==!" && set "args=!args! !compiler_flag!" && shift && goto parse_compiler_args + +:parse_runtime_args + if not "%1"=="" set "run_args=!run_args! %1" && shift && goto parse_runtime_args + +set vs=00 +rem detect setup +if "!cc!"=="" ( + set cc=cl + where cl /q + if not %ERRORLEVEL%==0 ( + echo Detecting VS 2022/2019/2017/2015/2013 x64 ... + if exist "%VS170COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%VS170COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=22" + ) else if exist "%VS160COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%VS160COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=19" + ) else if exist "%VS150COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%VS150COMNTOOLS%/../../VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=17" + ) else if exist "%VS140COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" ( + @call "%VS140COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" > nul && set "vs=15" + ) else if exist "%VS120COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" ( + @call "%VS120COMNTOOLS%/../../VC/bin/x86_amd64/vcvarsx86_amd64.bat" > nul && set "vs=13" + ) else if exist "%ProgramFiles%/microsoft visual studio/2022/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%ProgramFiles%/microsoft visual studio/2022/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=22" + ) else if exist "%ProgramFiles(x86)%/microsoft visual studio/2019/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%ProgramFiles(x86)%/microsoft visual studio/2019/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=19" + ) else if exist "%ProgramFiles(x86)%/microsoft visual studio/2017/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" ( + @call "%ProgramFiles(x86)%/microsoft visual studio/2017/community/VC/Auxiliary/Build/vcvarsx86_amd64.bat" > nul && set "vs=17" + ) else ( + echo Detecting Mingw64 ... + set cc=gcc + where /q gcc.exe || ( echo Detecting TCC ... && set "cc=tcc" ) + ) + ) +) + +rem solution. @todo: lin/osx +if "!proj!"=="yes" if not "%vs%"=="00" pushd tools && premake5 vs20%vs% & popd +if "!proj!"=="yes" if "%vs%"=="00" pushd tools && premake5 vs2013 & popd +if "!proj!"=="yes" pushd tools && premake5 ninja & popd +if "!proj!"=="yes" pushd tools && premake5 gmake & popd & exit /b + +rem --- pipeline +rem cl tools/ass2iqe.c /Fetools/ass2iqe.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG assimp.lib +rem cl tools/iqe2iqm.cpp /Fetools/iqe2iqm.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG +rem cl tools/mid2wav.c /Fetools/mid2wav.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG +rem cl tools/xml2json.c /Fetools/xml2json.exe /nologo /openmp /O2 /Oy /MT /DNDEBUG +rem --- pipeline +rem gcc tools/ass2iqe.c -o tools/ass2iqe.exe -w -lassimp +rem gcc tools/iqe2iqm.cpp -o tools/iqe2iqm.exe -w -lstdc++ +rem gcc tools/mid2wav.c -o tools/mid2wav.exe -w +rem gcc tools/xml2json.c -o tools/xml2json.exe -w +rem --- different strategies for release builds +rem 4.6s 6.9MiB (default) +rem 33.7s 6.6MiB /Ox /Oy /MT /DNDEBUG +rem 35.8s 5.3MiB /O2 /Oy /MT /DNDEBUG +rem 17.9s 4.6MiB /O1 /MT /DNDEBUG /GL /GF /arch:AVX2 +rem 17.8s 4.6MiB /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /arch:AVX2 +rem 18.8s 4.6MiB /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /link /OPT:ICF /LTCG +rem 18.0s 4.6MiB /openmp /Os /Ox /O2 /Oy /MT /DNDEBUG /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG + +if "!cc!"=="cl" ( + + if "!dll!"=="static" ( + set export=/c + set import=v4k.obj + ) else ( + set export=/DAPI=EXPORT /LD + set import=/DAPI=IMPORT v4k.lib + ) + + if "!build!"=="ret" ( + set args=-DENABLE_RETAIL -Dmain=WinMain !args! + set args=/nologo /Zi /MT /DNDEBUG=3 !args! /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG + ) + if "!build!"=="rel" ( + set args=/nologo /Zi /MT /openmp /DNDEBUG=2 !args! /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 /link /OPT:ICF /LTCG + ) + if "!build!"=="dev" ( + set args=/nologo /Zi /MT /openmp /DNDEBUG=1 !args! && REM /Os /Ox /O2 /Oy /GL /GF /Gw /arch:AVX2 + ) + if "!build!"=="dbg" ( + set args=/nologo /Zi /MT /DEBUG !args! /Od /fsanitize=address + rem make -- /RTC1, or make -- /Zi /fsanitize=address /DEBUG + ) + + set o=/Fe: + set echo=REM + +) else if "!cc!"=="clang-cl" ( + + if "!dll!"=="static" ( + set export=/c + set import=v4k.obj + ) else ( + set export=/DAPI=EXPORT /LD + set import=/DAPI=IMPORT v4k.lib + ) + + set warnings_fwkc=-Wno-deprecated-declarations -Wno-tautological-constant-out-of-range-compare + set warnings_demos=-Wno-empty-body -Wno-format-security -Wno-pointer-sign + set warnings=!warnings_fwkc! !warnings_demos! + + if "!build!"=="ret" ( + set args=-DENABLE_RETAIL -Dmain=WinMain !args! + set args=!warnings! /nologo /Zi /MT /DNDEBUG=3 !args! /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 + ) + if "!build!"=="rel" ( + set args=!warnings! /nologo /Zi /MT /openmp /DNDEBUG=2 !args! /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 + ) + if "!build!"=="dev" ( + set args=!warnings! /nologo /Zi /MT /openmp /DNDEBUG=1 !args! && REM /Os /Ox /O2 /Oy /GF /Gw /arch:AVX2 + ) + if "!build!"=="dbg" ( + set args=!warnings! /nologo /Zi /MT /DEBUG !args! /Od /fsanitize=address + ) + + set o=-o + set echo=echo + +) else if "!cc!"=="tcc" ( + + if "!dll!"=="static" ( + set export=-c + set import=v4k.o + ) else ( + set export=-DAPI=EXPORT -shared + set import=-DAPI=IMPORT v4k.def + ) + + if "!build!"=="ret" ( + set args=-DENABLE_RETAIL -Dmain=WinMain !args! + set args=-O3 -DNDEBUG=3 !args! + ) + if "!build!"=="rel" ( + set args=-O2 -DNDEBUG=2 !args! + ) + if "!build!"=="dev" ( + set args=-O1 -DNDEBUG=1 -g !args! + ) + if "!build!"=="dbg" ( + set args=-O0 -g !args! + ) + + set o=-o + set echo=echo + +) else ( rem if "!cc!"=="gcc" or "clang" + + set libs=-lws2_32 -lgdi32 -lwinmm -ldbghelp -lole32 -lshell32 -lcomdlg32 + + if "!dll!"=="static" ( + set export=-c + set import=v4k.o -Wl,--allow-multiple-definition + ) else ( + set export=-DAPI=EXPORT -shared -o v4k.dll -Wl,--out-implib,v4k.a + set import=-DAPI=IMPORT v4k.a + ) + + set args=-Wno-implicit-function-declaration !libs! !args! + + if "!build!"=="ret" ( + set args=-DENABLE_RETAIL !args! + set args=-O3 -DNDEBUG=3 !args! + ) + if "!build!"=="rel" ( + rem @todo see: https://stackoverflow.com/questions/866721/how-to-generate-gcc-debug-symbol-outside-the-build-target + set args=-O2 -DNDEBUG=2 !args! + ) + if "!build!"=="dev" ( + set args=-O1 -DNDEBUG=1 -g !args! + ) + if "!build!"=="dbg" ( + set args=-O0 -g !args! + ) + + set o=-o + set echo=echo +) + +echo build=!build!, type=!dll!, cc=!cc!, other=!other!, args=!args! +echo import=!import!, export=!export! +echo addons=!addon_names! + +rem set BUILD_VERSION symbol +git describe --tags --abbrev=0 > info.obj +set /p VERSION= info.obj +set /p GIT_REVISION= info.obj +set /p GIT_BRANCH= info.obj +set /p GIT_TAG= info.obj +set /p LAST_MODIFIED= info.obj +set /p GIT_HASH=nul find "V4K_IMPLEMENTATION" !other! && ( + set import= + set v4k=no + ) +) + +rem framework +if "!v4k!"=="yes" ( + tools\file2hash engine\v4k.c engine\v4k.h engine\v4k engine\joint\v4k.h !addons! -- !build! !import! !export! !args! !dll! > nul + set cache=_cache\.!errorlevel! + md _cache 2>nul >nul + + if not exist "!cache!" ( + !echo! v4k && !cc! engine\v4k.c !addons! -DADDON !addon_includes! !export! !args! || set rc=1 + if not "!rc!"=="1" ( + if "!dll!"=="dll" copy /y v4k.dll bind\v4k.dll > nul + + rem cache for `make rel` cl:48s->25s, tcc:3.3s->1.8s + echo. > !cache! + if exist v4k.o copy /y v4k.o !cache!.o 2>nul >nul + if exist v4k.obj copy /y v4k.obj !cache!.obj 2>nul >nul + if exist v4k.lib copy /y v4k.lib !cache!.lib 2>nul >nul + if exist v4k.dll copy /y v4k.dll !cache!.dll 2>nul >nul + if exist v4k.def copy /y v4k.def !cache!.def 2>nul >nul + if exist v4k.pdb copy /y v4k.pdb !cache!.pdb 2>nul >nul + ) + ) else ( + rem cached. do not compile... + echo v4k.c ^(cached^) + if "!dll!"=="dll" copy /y !cache!.dll bind\v4k.dll > nul || set rc=1 + + if exist !cache!.o copy /y !cache!.o v4k.o 2>nul >nul + if exist !cache!.obj copy /y !cache!.obj v4k.obj 2>nul >nul + if exist !cache!.lib copy /y !cache!.lib v4k.lib 2>nul >nul + if exist !cache!.dll copy /y !cache!.dll v4k.dll 2>nul >nul + if exist !cache!.def copy /y !cache!.def v4k.def 2>nul >nul + if exist !cache!.pdb copy /y !cache!.pdb v4k.pdb 2>nul >nul + ) +) + + +rem editor +if "!editor!"=="yes" ( +set edit=-DCOOK_ON_DEMAND +rem set edit=-DUI_LESSER_SPACING -DUI_ICONS_SMALL !edit! +!echo! editor && !cc! !o! editor.exe engine\editor.c engine\v4k.c !addon_includes! !edit! -Iengine/joint !args! || set rc=1 + +rem if "!cc!"=="cl" ( +rem set plug_export=/LD +rem ) else if "!cc!"=="clang-cl" ( +rem set plug_export=/LD +rem ) else ( +rem set plug_export=-shared +rem ) + +rem for %%f in ("workbench\plugins\*.c") do ( +rem !echo! %%~nf && !cc! !o! %%~nf.dll %%f -Iworkbench !plug_export! !args! !import! || set rc=1 +rem ) + +rem !echo! workbench && !cc! !o! workbench.exe workbench\workbench.c -Iworkbench !args! !import! || set rc=1 +) + +rem demos +if "!demos!"=="yes" ( + for %%f in ("demos\??-*") do ( + set "fname=%%~nf" + echo !fname!| findstr /R "^[0-9][0-9]-" >nul && ( + if not "!fname:~0,2!"=="99" ( + set limport=!import! + >nul find "V4K_IMPLEMENTATION" "demos\!fname!.c" && ( + set limport= + ) + !echo! !fname! && !cc! !o! !fname!.exe "demos\!fname!.c" !addon_includes! !limport! !args! || set rc=1 + ) + ) + ) +) + + +rem lab +if "!lab!"=="yes" ( + for %%f in ("demos\99-*") do ( + set limport=!import! + >nul find "V4K_IMPLEMENTATION" demos\%%~nf.c && ( + set limport= + ) + !echo! %%~nf && !cc! !o! %%~nf.exe demos\%%~nf.c !addon_includes! !limport! !args! || set rc=1 + ) +) + +rem hello +if "!hello!"=="yes" ( +!echo! hello && !cc! !o! hello.exe hello.c !addon_includes! !args! || set rc=1 +) + +rem user-defined apps +if not "!other!"=="" ( + if "!vis!"=="yes" echo !cc! !other! !import! !args! + rem if "!cc!"=="cl" ( + rem if "!build!"=="rel" ( + rem set "import=!import! engine\v4k_win32_rel_glue.c" + rem set "args=!args! /SUBSYSTEM:WINDOWS" + rem ) + rem ) + for /f "tokens=*" %%a in ("%other%") do set exename=%%~na.exe + del !exename! >NUL + !echo! !other! && !cc! !other! !addon_includes! !import! !args! || set rc=1 +) + +if "!run!"=="yes" ( + if "!rc!"=="1" ( + echo build failed. skipping run! + ) else ( + set exename=hello.exe + if not "!other!"=="" ( + for /f "tokens=*" %%a in ("!other!") do set exename=%%~na.exe + ) + echo run !exename! !run_args! + !exename! !run_args! || set rc=1 + ) +) + +rem PAUSE only if double-clicked from Windows explorer +rem (((echo.%cmdcmdline%)|%WINDIR%\system32\find.exe /I "%~0")>nul)&&pause + +cmd /c exit !rc! diff --git a/demos/06-material.c b/demos/06-material.c index f75ee33..826f994 100644 --- a/demos/06-material.c +++ b/demos/06-material.c @@ -81,7 +81,7 @@ int main() { object_model(obj4, m3); object_scale(obj4, vec3(3,3,3)); object_move(obj4, vec3(-10+6*3,0,-10)); - object_pivot(obj4, vec3(0,0,180)); + object_pivot(obj4, vec3(0,180,180)); // spawn object5 (shadertoy) object_t* obj5 = scene_spawn(); diff --git a/demos/09-shadows.c b/demos/09-shadows.c index 2c01325..30bb2a9 100644 --- a/demos/09-shadows.c +++ b/demos/09-shadows.c @@ -19,7 +19,7 @@ const char *OBJ_MDLS[] = { int main(int argc, char** argv) { window_create(85, WINDOW_MSAA8); - window_fps_unlock(); + // window_fps_unlock(); camera_t cam = camera(); { cam.position = vec3(0, 7.5, 15); diff --git a/demos/99-fpstest.c b/demos/99-fpstest.c index a67ac79..d605a97 100644 --- a/demos/99-fpstest.c +++ b/demos/99-fpstest.c @@ -23,7 +23,7 @@ static double smooth_delta() { average += time_samples[i]; average /= NUM_SAMPLES; - time = min(time, average); + time = minf(time, average); return time; } diff --git a/depot b/depot index 6d764dd..c20552e 160000 --- a/depot +++ b/depot @@ -1 +1 @@ -Subproject commit 6d764dd6019192b1efbf1018bc685bb2a8e495c3 +Subproject commit c20552ebf8466f6b97692e58e321fbcbde1a89c7 diff --git a/engine/joint/v4k.h b/engine/joint/v4k.h index f7e7c46..af0f3c6 100644 --- a/engine/joint/v4k.h +++ b/engine/joint/v4k.h @@ -371241,7 +371241,7 @@ static cook_worker jobs[JOBS_MAX] = {0}; static volatile bool cook_cancelable = false, cook_cancelling = false, cook_debug = false; #ifndef COOK_ON_DEMAND -#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 0), false) +#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 1), false) #endif static diff --git a/engine/split/v4k_cook.c b/engine/split/v4k_cook.c index 8d59bb4..38eb9b4 100644 --- a/engine/split/v4k_cook.c +++ b/engine/split/v4k_cook.c @@ -459,7 +459,7 @@ static cook_worker jobs[JOBS_MAX] = {0}; static volatile bool cook_cancelable = false, cook_cancelling = false, cook_debug = false; #ifndef COOK_ON_DEMAND -#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 0), false) +#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 1), false) #endif static diff --git a/engine/v4k.c b/engine/v4k.c index af3dc2f..61a5231 100644 --- a/engine/v4k.c +++ b/engine/v4k.c @@ -6268,7 +6268,7 @@ static cook_worker jobs[JOBS_MAX] = {0}; static volatile bool cook_cancelable = false, cook_cancelling = false, cook_debug = false; #ifndef COOK_ON_DEMAND -#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 0), false) +#define COOK_ON_DEMAND ifdef(cook, optioni("--cook-on-demand", 1), false) #endif static diff --git a/misc/llm.txt b/misc/llm.txt new file mode 100644 index 0000000..64209df --- /dev/null +++ b/misc/llm.txt @@ -0,0 +1,7 @@ +Whenever I say: + +# run demo +make demos\.c run + +# run dp +depot\make run