diff options
Diffstat (limited to 'build.bat')
| -rw-r--r-- | build.bat | 139 |
1 files changed, 84 insertions, 55 deletions
| @@ -1,49 +1,96 @@ | |||
| 1 | @echo off | 1 | @echo off |
| 2 | 2 | ||
| 3 | if [%1]==[/d] ( | 3 | SET DEBUG=0 |
| 4 | if "%1"=="/d" ( | ||
| 4 | SET DEBUG=1 | 5 | SET DEBUG=1 |
| 5 | shift | 6 | shift |
| 6 | ) else ( | ||
| 7 | SET DEBUG=0 | ||
| 8 | ) | 7 | ) |
| 8 | if "%1"=="test" (SET DEBUG=1) | ||
| 9 | 9 | ||
| 10 | SET CC=clang | 10 | :: Detect architecture, or use user-specified one |
| 11 | SET CXX=clang++ | 11 | if "%ARCH%"=="" goto :detect_arch |
| 12 | if "%ARCH%"=="PORTABLE" goto :arch_done | ||
| 13 | if "%ARCH%"=="AVX2" goto :arch_done | ||
| 14 | if "%ARCH%"=="NEON" goto :arch_done | ||
| 15 | |||
| 16 | echo Unsupported architecture '%ARCH%' | ||
| 17 | exit /b 1 | ||
| 18 | |||
| 19 | :detect_arch | ||
| 20 | if "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( | ||
| 21 | SET ARCH=AVX2 | ||
| 22 | ) else if "%PROCESSOR_ARCHITECTURE%"=="ARM64" ( | ||
| 23 | SET ARCH=NEON | ||
| 24 | ) else ( | ||
| 25 | SET ARCH=PORTABLE | ||
| 26 | ) | ||
| 27 | :arch_done | ||
| 28 | |||
| 29 | :: Default value for maximum number of threads | ||
| 12 | SET THREADS=16 | 30 | SET THREADS=16 |
| 13 | SET SANITIZE= | ||
| 14 | 31 | ||
| 15 | SET ARCH=PORTABLE | 32 | :: Detect Python libraries path |
| 16 | clang -march=native -dM -E - < NUL | findstr /C:"__AVX2__" >NUL 2>&1 | 33 | for /f "delims=" %%i in ('python -c "import sys; print(sys.base_prefix)"') do set PYPATH=%%i |
| 17 | if %ERRORLEVEL% EQU 0 ( | 34 | SET PYINCLUDE=%PYPATH%\include |
| 18 | SET ARCH=AVX2 | 35 | SET PYLIBS=%PYPATH%\libs |
| 19 | SET ARCHOPTS=-mavx2 | ||
| 20 | goto :ArchDone | ||
| 21 | ) | ||
| 22 | clang -march=native -dM -E - < NUL | findstr /C:"__ARM_NEON" >NUL 2>&1 | ||
| 23 | if %ERRORLEVEL% EQU 0 ( | ||
| 24 | SET ARCH=NEON | ||
| 25 | goto :ArchDone | ||
| 26 | ) | ||
| 27 | :ArchDone | ||
| 28 | 36 | ||
| 37 | :: Select compiler from possibly user-set %CC% variable | ||
| 38 | :: Currently we only support clang and MSVC | ||
| 39 | if "%CC%"=="" goto :set_msvc | ||
| 40 | if /I "%CC%"=="cl" goto :set_msvc | ||
| 41 | if /I "%CC%"=="msvc" goto :set_msvc | ||
| 42 | if /I "%CC%"=="clang" goto :set_clang | ||
| 29 | 43 | ||
| 30 | SET DFLAGS=-g3 -DDEBUG | 44 | echo Unsupported compiler '%CC%' |
| 31 | SET WARNINGS=-Wno-deprecated-declarations | 45 | exit /b 1 |
| 32 | SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH% | ||
| 33 | SET OFLAGS=-O3 | ||
| 34 | 46 | ||
| 35 | SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES% | 47 | :set_msvc |
| 48 | SET CC=cl | ||
| 49 | SET CXX=cl | ||
| 36 | 50 | ||
| 37 | SET STACKSIZE=-Wl,-stack:16777216 | 51 | SET DFLAGS=/Zi /DDEBUG |
| 38 | SET LFLAGS=%STACKSIZE% | 52 | SET WARNINGS=/wd4996 |
| 53 | SET VARIABLES=/DTHREADS=%THREADS% /D%ARCH% | ||
| 54 | SET OFLAGS=/O2 | ||
| 39 | 55 | ||
| 40 | :: Python libraries - change to match your local installation | 56 | if %DEBUG%==1 (SET ODFLAGS=%DFLAGS%) else (SET ODFLAGS=%OFLAGS%) |
| 41 | for /f "delims=" %%i in ('python -c "import sys; print(sys.base_prefix)"') do set PYPATH=%%i | 57 | if "%ARCH%"=="AVX2" (SET ARCHOPTS=/arch:AVX2) else (SET ARCHOPTS=) |
| 42 | ::SET PYPATH=%userprofile%\AppData\Local\Programs\Python\Python313 | ||
| 43 | 58 | ||
| 44 | SET PYINCLUDE=%PYPATH%\include | 59 | SET CFLAGS=/std:c11 /experimental:c11atomics %ARCHOPTS% %WARNINGS% %VARIABLES% |
| 45 | SET PYLIBS=%PYPATH%\libs | 60 | SET LFLAGS=/F 16777216 |
| 61 | |||
| 62 | SET CC_NISSY=%CC% %CFLAGS% %ODFLAGS% /c src\nissy.c | ||
| 63 | SET CC_SHELL=%CC% %CFLAGS% %ODFALGS% %LFLAGS% nissy.o shell\shell.c /Fe:run.exe | ||
| 64 | SET CC_PYTHON=%CC% %CFLAGS% %LFLAGS% /I"%PYINCLUDE%" /LD /Fe:python\nissy.pyd python\nissy_module.c nissy.o /link /LIBPATH:"%PYLIBS%" python3.lib | ||
| 65 | SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtest.exe nissy.o | ||
| 66 | SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtool.exe nissy.o | ||
| 67 | SET CC_CXX=%CXX% %ODFLAGS% /std:c++20 /Fe:runcpp.exe cpp\nissy.cpp nissy.o | ||
| 68 | goto :compiler_done | ||
| 69 | |||
| 70 | :set_clang | ||
| 71 | SET CC=clang | ||
| 72 | SET CXX=clang++ | ||
| 73 | |||
| 74 | SET DFLAGS=-g3 -DDEBUG | ||
| 75 | SET WARNINGS=-Wno-deprecated-declarations | ||
| 76 | SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH% | ||
| 77 | SET OFLAGS=-O3 | ||
| 78 | |||
| 79 | if %DEBUG%==1 (SET ODFLAGS=%DFLAGS%) else (SET ODFLAGS=%OFLAGS%) | ||
| 80 | if "%ARCH%"=="AVX2" (SET ARCHOPTS=-mavx2) else (SET ARCHOPTS=) | ||
| 81 | |||
| 82 | SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES% | ||
| 83 | SET LFLAGS=-Wl,-stack:16777216 | ||
| 84 | |||
| 85 | SET CC_NISSY=%CC% %CFLAGS% %ODFLAGS% -c src\nissy.c | ||
| 86 | SET CC_SHELL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o shell\shell.c -o run.exe | ||
| 87 | SET CC_PYTHON=%CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 python\nissy_module.c nissy.o -o python\nissy.pyd | ||
| 88 | SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtest.exe nissy.o | ||
| 89 | SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtool.exe nissy.o | ||
| 90 | SET CC_CXX=%CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o | ||
| 91 | :compiler_done | ||
| 46 | 92 | ||
| 93 | :: Select compilation target from command line argument | ||
| 47 | SET TARGET=%1 | 94 | SET TARGET=%1 |
| 48 | if not defined TARGET SET TARGET=nissy | 95 | if not defined TARGET SET TARGET=nissy |
| 49 | SET EXPR=%2 | 96 | SET EXPR=%2 |
| @@ -53,7 +100,6 @@ for %%a in (nissy python shell test config help clean tool cpp solvetest) do ( | |||
| 53 | exit /b | 100 | exit /b |
| 54 | ) | 101 | ) |
| 55 | ) | 102 | ) |
| 56 | |||
| 57 | echo Target '%TARGET%' unavailable, run 'build help' for info | 103 | echo Target '%TARGET%' unavailable, run 'build help' for info |
| 58 | exit /b 1 | 104 | exit /b 1 |
| 59 | 105 | ||
| @@ -98,32 +144,26 @@ exit /b | |||
| 98 | exit /b | 144 | exit /b |
| 99 | 145 | ||
| 100 | :build_nissy | 146 | :build_nissy |
| 101 | call:odflags | ||
| 102 | @echo on | 147 | @echo on |
| 103 | %CC% %CFLAGS% %ODFLAGS% -c src\nissy.c || exit /b 1 | 148 | %CC_NISSY% || exit /b 1 |
| 104 | @echo off | 149 | @echo off |
| 105 | exit /b | 150 | exit /b |
| 106 | 151 | ||
| 107 | :build_shell | 152 | :build_shell |
| 108 | call:build_nissy || exit /b 1 | 153 | call:build_nissy || exit /b 1 |
| 109 | call:odflags | ||
| 110 | @echo on | 154 | @echo on |
| 111 | %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o shell\shell.c -o run.exe ^ | 155 | %CC_SHELL% || exit /b 1 |
| 112 | || exit /b 1 | ||
| 113 | @echo off | 156 | @echo off |
| 114 | exit /b | 157 | exit /b |
| 115 | 158 | ||
| 116 | :build_python | 159 | :build_python |
| 117 | call:build_nissy || exit /b 1 | 160 | call:build_nissy || exit /b 1 |
| 118 | call:odflags | ||
| 119 | @echo on | 161 | @echo on |
| 120 | %CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 ^ | 162 | %CC_PYTHON% || exit /b 1 |
| 121 | python\nissy_module.c nissy.o -o python\nissy.pyd || exit /b 1 | ||
| 122 | @echo off | 163 | @echo off |
| 123 | exit /b | 164 | exit /b |
| 124 | 165 | ||
| 125 | :build_test | 166 | :build_test |
| 126 | SET DEBUG=1 | ||
| 127 | call:build_nissy || exit /b 1 | 167 | call:build_nissy || exit /b 1 |
| 128 | if not defined EXPR ( | 168 | if not defined EXPR ( |
| 129 | SET WILDCARD=* | 169 | SET WILDCARD=* |
| @@ -174,8 +214,7 @@ exit /b | |||
| 174 | ) | 214 | ) |
| 175 | call:build_nissy || exit /b 1 | 215 | call:build_nissy || exit /b 1 |
| 176 | @echo on | 216 | @echo on |
| 177 | %CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o %EXPR% ^ | 217 | %CC_CXX% %EXPR% || exit /b 1 |
| 178 | || exit /b 1 | ||
| 179 | runcpp | 218 | runcpp |
| 180 | @echo off | 219 | @echo off |
| 181 | exit /b | 220 | exit /b |
| @@ -189,8 +228,7 @@ exit /b | |||
| 189 | exit /b | 228 | exit /b |
| 190 | 229 | ||
| 191 | :build_single_test | 230 | :build_single_test |
| 192 | call:odflags | 231 | %CC_TEST% %1\*.c || exit /b 1 |
| 193 | %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o %1\*.c -o runtest.exe || exit /b 1 | ||
| 194 | set error=0 | 232 | set error=0 |
| 195 | for %%c in ( %1\*.in ) do ( | 233 | for %%c in ( %1\*.in ) do ( |
| 196 | if %error%==1 exit /b 1 | 234 | if %error%==1 exit /b 1 |
| @@ -213,21 +251,12 @@ exit /b | |||
| 213 | 251 | ||
| 214 | :build_single_tool | 252 | :build_single_tool |
| 215 | @echo on | 253 | @echo on |
| 216 | %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o tools\%toolname%\*.c ^ | 254 | %CC_TOOL% tools\%toolname%\*.c || exit /b 1 |
| 217 | -o runtool.exe || exit /b 1 | ||
| 218 | @echo off | 255 | @echo off |
| 219 | runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1 | 256 | runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1 |
| 220 | @echo. | 257 | @echo. |
| 221 | @echo (On Windows, the output of a tool is not saved to any file.) | 258 | @echo (On Windows, the output of a tool is not saved to any file.) |
| 222 | exit /b | 259 | exit /b |
| 223 | 260 | ||
| 224 | :odflags | ||
| 225 | if %DEBUG%==1 ( | ||
| 226 | SET ODFLAGS=%DFLAGS% | ||
| 227 | ) else ( | ||
| 228 | SET ODFLAGS=%OFLAGS% | ||
| 229 | ) | ||
| 230 | exit /b | ||
| 231 | |||
| 232 | :error | 261 | :error |
| 233 | exit /b 1 \ No newline at end of file | 262 | exit /b 1 \ No newline at end of file |
