From fc41f7917531693680b5baf71ffe38c47333fe84 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 6 Apr 2026 15:55:33 +0200 Subject: 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. --- build.bat | 148 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 90 insertions(+), 58 deletions(-) (limited to 'build.bat') diff --git a/build.bat b/build.bat index 9f9f5f1..3459f6e 100644 --- a/build.bat +++ b/build.bat @@ -1,49 +1,96 @@ @echo off -if [%1]==[/d] ( +SET DEBUG=0 +if "%1"=="/d" ( SET DEBUG=1 shift -) else ( - SET DEBUG=0 ) +if "%1"=="test" (SET DEBUG=1) -SET CC=clang -SET CXX=clang++ -SET THREADS=16 -SET SANITIZE= - -SET ARCH=PORTABLE -clang -march=native -dM -E - < NUL | findstr /C:"__AVX2__" >NUL 2>&1 -if %ERRORLEVEL% EQU 0 ( - SET ARCH=AVX2 - SET ARCHOPTS=-mavx2 - goto :ArchDone -) -clang -march=native -dM -E - < NUL | findstr /C:"__ARM_NEON" >NUL 2>&1 -if %ERRORLEVEL% EQU 0 ( - SET ARCH=NEON - goto :ArchDone -) -:ArchDone - +:: Detect architecture, or use user-specified one +if "%ARCH%"=="" goto :detect_arch +if "%ARCH%"=="PORTABLE" goto :arch_done +if "%ARCH%"=="AVX2" goto :arch_done +if "%ARCH%"=="NEON" goto :arch_done -SET DFLAGS=-g3 -DDEBUG -SET WARNINGS=-Wno-deprecated-declarations -SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH% -SET OFLAGS=-O3 +echo Unsupported architecture '%ARCH%' +exit /b 1 -SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES% +:detect_arch + if "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( + SET ARCH=AVX2 + ) else if "%PROCESSOR_ARCHITECTURE%"=="ARM64" ( + SET ARCH=NEON + ) else ( + SET ARCH=PORTABLE + ) +:arch_done -SET STACKSIZE=-Wl,-stack:16777216 -SET LFLAGS=%STACKSIZE% +:: Default value for maximum number of threads +SET THREADS=16 -:: Python libraries - change to match your local installation +:: Detect Python libraries path for /f "delims=" %%i in ('python -c "import sys; print(sys.base_prefix)"') do set PYPATH=%%i -::SET PYPATH=%userprofile%\AppData\Local\Programs\Python\Python313 - SET PYINCLUDE=%PYPATH%\include SET PYLIBS=%PYPATH%\libs +:: Select compiler from possibly user-set %CC% variable +:: Currently we only support clang and MSVC +if "%CC%"=="" goto :set_msvc +if /I "%CC%"=="cl" goto :set_msvc +if /I "%CC%"=="msvc" goto :set_msvc +if /I "%CC%"=="clang" goto :set_clang + +echo Unsupported compiler '%CC%' +exit /b 1 + +:set_msvc + SET CC=cl + SET CXX=cl + + SET DFLAGS=/Zi /DDEBUG + SET WARNINGS=/W4 /wd4100 /wd4324 /wd4505 /wd4996 + SET VARIABLES=/DTHREADS=%THREADS% /D%ARCH% + SET OFLAGS=/O2 + + if %DEBUG%==1 (SET ODFLAGS=%DFLAGS%) else (SET ODFLAGS=%OFLAGS%) + if "%ARCH%"=="AVX2" (SET ARCHOPTS=/arch:AVX2) else (SET ARCHOPTS=) + + SET CFLAGS=/std:c11 /experimental:c11atomics /nologo %ARCHOPTS% %WARNINGS% %VARIABLES% + SET LFLAGS=/F 16777216 + + SET CC_NISSY=%CC% %CFLAGS% %ODFLAGS% /c src\nissy.c + SET CC_SHELL=%CC% %CFLAGS% %ODFALGS% %LFLAGS% nissy.obj shell\shell.c /Fe:run.exe + SET CC_PYTHON=%CC% %CFLAGS% %LFLAGS% /I"%PYINCLUDE%" /LD /Fe:python\nissy.pyd python\nissy_module.c nissy.obj /link /LIBPATH:"%PYLIBS%" python3.lib + SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtest.exe nissy.obj + SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% /Fe:runtool.exe nissy.obj + SET CC_CXX=%CXX% /EHsc /nologo %ARCHOPTS% %ODFLAGS% %LFLAGS% /std:c++20 /Fe:runcpp.exe nissy_c.obj cpp\nissy.cpp +goto :compiler_done + +:set_clang + SET CC=clang + SET CXX=clang++ + + SET DFLAGS=-g3 -DDEBUG + SET WARNINGS=-Wall -Wextra -Wno-unused-function -Wno-unused-parameter -Wno-deprecated-declarations + SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH% + SET OFLAGS=-O3 + + if %DEBUG%==1 (SET ODFLAGS=%DFLAGS%) else (SET ODFLAGS=%OFLAGS%) + if "%ARCH%"=="AVX2" (SET ARCHOPTS=-mavx2) else (SET ARCHOPTS=) + + SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES% + SET LFLAGS=-Wl,-stack:16777216 + + SET CC_NISSY=%CC% %CFLAGS% %ODFLAGS% -c src\nissy.c -o nissy.obj + SET CC_SHELL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.obj shell\shell.c -o run.exe + SET CC_PYTHON=%CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 python\nissy_module.c nissy.obj -o python\nissy.pyd + SET CC_TEST=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtest.exe nissy.obj + SET CC_TOOL=%CC% %CFLAGS% %ODFLAGS% %LFLAGS% -o runtool.exe nissy.obj + SET CC_CXX=%CXX% %ARCHOPTS% %ODFLAGS% %LFLAGS% -std=c++20 -o runcpp.exe nissy_c.obj cpp\nissy.cpp +:compiler_done + +:: Select compilation target from command line argument SET TARGET=%1 if not defined TARGET SET TARGET=nissy SET EXPR=%2 @@ -53,7 +100,6 @@ for %%a in (nissy python shell test config help clean tool cpp solvetest) do ( exit /b ) ) - echo Target '%TARGET%' unavailable, run 'build help' for info exit /b 1 @@ -66,7 +112,7 @@ exit /b 1 echo. echo Possible values for TARGET (defaults to 'nissy' if unspecified): echo. - echo nissy Build the nissy.o object file. + echo nissy Build the nissy.obj object file. echo python Build the Python module for nissy. echo NOTE: Python development headers must be installed in echo order to build the Python module. The path of these @@ -98,32 +144,26 @@ exit /b exit /b :build_nissy - call:odflags @echo on - %CC% %CFLAGS% %ODFLAGS% -c src\nissy.c || exit /b 1 + %CC_NISSY% || 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 + %CC_SHELL% || 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 + %CC_PYTHON% || exit /b 1 @echo off exit /b :build_test - SET DEBUG=1 call:build_nissy || exit /b 1 if not defined EXPR ( SET WILDCARD=* @@ -139,7 +179,7 @@ exit /b :build_clean @echo on - del *.o *.so *.a *.ilk *.pdb *.exe + del *.o *.obj *.so *.a *.ilk *.pdb *.exe @echo off exit /b @@ -173,9 +213,11 @@ exit /b exit /b 1 ) call:build_nissy || exit /b 1 + copy nissy.obj nissy_c.obj @echo on - %CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o %EXPR% ^ - || exit /b 1 + %CC_CXX% %EXPR% || exit /b 1 + del nissy.obj + copy nissy_c.obj nissy.obj runcpp @echo off exit /b @@ -189,8 +231,7 @@ exit /b exit /b :build_single_test - call:odflags - %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o %1\*.c -o runtest.exe || exit /b 1 + %CC_TEST% %1\*.c || exit /b 1 set error=0 for %%c in ( %1\*.in ) do ( if %error%==1 exit /b 1 @@ -213,21 +254,12 @@ exit /b :build_single_tool @echo on - %CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o tools\%toolname%\*.c ^ - -o runtool.exe || exit /b 1 + %CC_TOOL% tools\%toolname%\*.c || 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 \ No newline at end of file -- cgit v1.3