@echo off if [%1]==[/d] ( SET DEBUG=1 shift ) else ( SET DEBUG=0 ) SET CC=clang SET CXX=clang++ SET ARCH=PORTABLE SET THREADS=1 SET SANITIZE= :: TODO depends on ARCH variable SET ARCHOPTS= :: TODO depends on SANITIZE variable SET DFLAGS=-g3 -DDEBUG SET WARNINGS=-Wno-deprecated-declarations SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH% SET OFLAGS=-O3 SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES% SET STACKSIZE=-Wl,-stack:16777216 SET LFLAGS=%STACKSIZE% :: Python libraries - change to match your local installation SET PYPATH=%userprofile%\AppData\Local\Programs\Python\Python313 SET PYINCLUDE=%PYPATH%\include SET PYLIBS=%PYPATH%\libs SET TARGET=%1 if not defined TARGET SET TARGET=nissy SET EXPR=%2 for %%a in (nissy python shell test config help clean tool cpp solvetest) do ( if %TARGET%==%%a ( call:build_%TARGET% %* exit /b ) ) echo Target '%TARGET%' unavailable, run 'build help' for info exit /b 1 :build_help echo *** Warning: support for building nissy on Windows is incomplete *** echo. echo Build system for nissy. Usage: echo. echo build [/d] [TARGET] echo. echo Possible values for TARGET (defaults to 'nissy' if unspecified): echo. echo nissy Build the nissy.o object file. echo python Build the Python module for nissy. echo shell Build the basic nissy shell (./run). echo cpp FILE Build and run the given C++ FILE. echo test [EXPR] Build and run unit tests. If EXPR is provided, only the echo tests whose name contains EXPR are run. The /d option is echo is always implied. echo tool EXPR Run the 'tool' matching the given EXPR. echo solvetest Build nissy and run a collection of tools for testing" echo various solvers. echo help Show this help message. echo config Show build configuration and exit. echo clean Remove all build files. echo. echo The /d option activates debug mode (slower, used for testing). echo Tests are automatically built in debug mode even without /d. echo For more on build configurations, see the comments in build.bat. exit /b :build_config echo Compiler: %CC% echo Architecture: %ARCH% echo Max threads: %THREADS% echo Optimization flags: %OFLAGS% echo Debug flags: %DFLAGS% exit /b :build_nissy call:odflags @echo on %CC% %CFLAGS% %ODFLAGS% -c src\nissy.c || exit /b 1 @echo off exit /b :build_shell call:build_nissy || exit /b 1 call:odflags @echo on %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o shell\shell.c -o run.exe ^ || exit /b 1 @echo off exit /b :build_python call:build_nissy || exit /b 1 call:odflags @echo on %CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 ^ python\nissy_module.c nissy.o -o python\nissy.pyd || exit /b 1 @echo off exit /b :build_test SET DEBUG=1 call:build_nissy || exit /b 1 if not defined EXPR ( SET WILDCARD=* ) else ( SET WILDCARD=*%EXPR%* ) for /d %%d in ( test\%WILDCARD% ) do ( if exist %%d\* ( call:build_single_test %%d || exit /b 1 ) ) exit /b :build_clean @echo on del *.o *.so *.a *.ilk *.pdb *.exe @echo off exit /b :build_tool if not defined EXPR ( @echo Please provide a valid EXPR to select a tool exit /b 1 ) set toolname= for /d %%d in ( tools\*%EXPR%* ) do ( set toolname=%%~nd ) if [%toolname%]==[] ( @echo Expression '%EXPR%' does not match any tool exit /b 1 ) call:build_nissy || exit /b 1 call:build_single_tool %* exit /b :build_cpp if not defined EXPR ( @echo Please provide a valid C++ source file. exit /b 1 ) if not exist %EXPR% ( @echo File %EXPR% does not exist. exit /b 1 ) call:build_nissy || exit /b 1 @echo on %CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o %EXPR% ^ || exit /b 1 runcpp @echo off exit /b :build_solvetest call:build_nissy || exit /b 1 for /d %%d in ( tools\*solvetest* ) do ( set toolname=%%~nd call:build_single_tool ) exit /b :build_single_test call:odflags %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o %1\*.c -o runtest.exe || exit /b 1 set error=0 for %%c in ( %1\*.in ) do ( if %error%==1 exit /b 1 @echo | set /p v="%1\%%~nc: " runtest < %%c > test\last.out 2> test\last.err FC /a %1\%%~nc.out test\last.out > test\last.fc.out if ERRORLEVEL 1 ( @echo Test failed! Different output: type test\last.fc.out @echo stderr: type test\last.err goto :error ) else ( @echo ok ) ) if %error%==1 exit /b 1 del runtest.* exit /b :build_single_tool @echo on %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o tools\%toolname%\*.c ^ -o runtool.exe || exit /b 1 @echo off runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1 @echo. @echo (On Windows, the output of a tool is not saved to any file.) exit /b :odflags if %DEBUG%==1 ( SET ODFLAGS=%DFLAGS% ) else ( SET ODFLAGS=%OFLAGS% ) exit /b :error exit /b 1