diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2026-04-06 15:55:33 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2026-04-06 15:55:33 +0200 |
| commit | fc41f7917531693680b5baf71ffe38c47333fe84 (patch) | |
| tree | a6e62232e05e7779034c5f9d1bf743b6f1c198e3 /build.bat | |
| parent | fe534f1497da6447153064d7bba00243000f803b (diff) | |
| download | nissy-core-fc41f7917531693680b5baf71ffe38c47333fe84.tar.gz nissy-core-fc41f7917531693680b5baf71ffe38c47333fe84.zip | |
Make the project build with Microsoft's broken C compiler.
MSVC is not fully C11-compliant, even when compiling with /std:c11.
Some changes were needed to make the codebase compatible. Notably, the
notation a[static N] and a[n] for function parameters of array type is
not supported, so that had to be hidden behind a macro. Atomic types
are also an experimental feature, apparently, but at least they work
with the correct compiler flag.
One thing that MSVC does well, however, is warning on integer conversions
on /W4 level. I am not sure if Clang and GCC have something similar,
so I took this chance to fix some of these.
Diffstat (limited to 'build.bat')
| -rw-r--r-- | build.bat | 146 |
1 files changed, 89 insertions, 57 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=/W4 /wd4100 /wd4324 /wd4505 /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 /nologo %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.obj 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.obj /link /LIBPATH:"%PYLIBS%" python3.lib | ||
| 65 | SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtest.exe nissy.obj | ||
| 66 | SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtool.exe nissy.obj | ||
| 67 | SET CC_CXX=%CXX% /EHsc /nologo %ARCHOPTS% %ODFLAGS% %LFLAGS% /std:c++20 /Fe:runcpp.exe nissy_c.obj cpp\nissy.cpp | ||
| 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=-Wall -Wextra -Wno-unused-function -Wno-unused-parameter -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 -o nissy.obj | ||
| 86 | SET CC_SHELL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.obj shell\shell.c -o run.exe | ||
| 87 | SET CC_PYTHON=%CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 python\nissy_module.c nissy.obj -o python\nissy.pyd | ||
| 88 | SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtest.exe nissy.obj | ||
| 89 | SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtool.exe nissy.obj | ||
| 90 | SET CC_CXX=%CXX% %ARCHOPTS% %ODFLAGS% %LFLAGS% -std=c++20 -o runcpp.exe nissy_c.obj cpp\nissy.cpp | ||
| 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 | ||
| @@ -66,7 +112,7 @@ exit /b 1 | |||
| 66 | echo. | 112 | echo. |
| 67 | echo Possible values for TARGET (defaults to 'nissy' if unspecified): | 113 | echo Possible values for TARGET (defaults to 'nissy' if unspecified): |
| 68 | echo. | 114 | echo. |
| 69 | echo nissy Build the nissy.o object file. | 115 | echo nissy Build the nissy.obj object file. |
| 70 | echo python Build the Python module for nissy. | 116 | echo python Build the Python module for nissy. |
| 71 | echo NOTE: Python development headers must be installed in | 117 | echo NOTE: Python development headers must be installed in |
| 72 | echo order to build the Python module. The path of these | 118 | echo order to build the Python module. The path of these |
| @@ -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=* |
| @@ -139,7 +179,7 @@ exit /b | |||
| 139 | 179 | ||
| 140 | :build_clean | 180 | :build_clean |
| 141 | @echo on | 181 | @echo on |
| 142 | del *.o *.so *.a *.ilk *.pdb *.exe | 182 | del *.o *.obj *.so *.a *.ilk *.pdb *.exe |
| 143 | @echo off | 183 | @echo off |
| 144 | exit /b | 184 | exit /b |
| 145 | 185 | ||
| @@ -173,9 +213,11 @@ exit /b | |||
| 173 | exit /b 1 | 213 | exit /b 1 |
| 174 | ) | 214 | ) |
| 175 | call:build_nissy || exit /b 1 | 215 | call:build_nissy || exit /b 1 |
| 216 | copy nissy.obj nissy_c.obj | ||
| 176 | @echo on | 217 | @echo on |
| 177 | %CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o %EXPR% ^ | 218 | %CC_CXX% %EXPR% || exit /b 1 |
| 178 | || exit /b 1 | 219 | del nissy.obj |
| 220 | copy nissy_c.obj nissy.obj | ||
| 179 | runcpp | 221 | runcpp |
| 180 | @echo off | 222 | @echo off |
| 181 | exit /b | 223 | exit /b |
| @@ -189,8 +231,7 @@ exit /b | |||
| 189 | exit /b | 231 | exit /b |
| 190 | 232 | ||
| 191 | :build_single_test | 233 | :build_single_test |
| 192 | call:odflags | 234 | %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 | 235 | set error=0 |
| 195 | for %%c in ( %1\*.in ) do ( | 236 | for %%c in ( %1\*.in ) do ( |
| 196 | if %error%==1 exit /b 1 | 237 | if %error%==1 exit /b 1 |
| @@ -213,21 +254,12 @@ exit /b | |||
| 213 | 254 | ||
| 214 | :build_single_tool | 255 | :build_single_tool |
| 215 | @echo on | 256 | @echo on |
| 216 | %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o tools\%toolname%\*.c ^ | 257 | %CC_TOOL% tools\%toolname%\*.c || exit /b 1 |
| 217 | -o runtool.exe || exit /b 1 | ||
| 218 | @echo off | 258 | @echo off |
| 219 | runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1 | 259 | runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1 |
| 220 | @echo. | 260 | @echo. |
| 221 | @echo (On Windows, the output of a tool is not saved to any file.) | 261 | @echo (On Windows, the output of a tool is not saved to any file.) |
| 222 | exit /b | 262 | exit /b |
| 223 | 263 | ||
| 224 | :odflags | ||
| 225 | if %DEBUG%==1 ( | ||
| 226 | SET ODFLAGS=%DFLAGS% | ||
| 227 | ) else ( | ||
| 228 | SET ODFLAGS=%OFLAGS% | ||
| 229 | ) | ||
| 230 | exit /b | ||
| 231 | |||
| 232 | :error | 264 | :error |
| 233 | exit /b 1 \ No newline at end of file | 265 | exit /b 1 \ No newline at end of file |
