blt
blt copied to clipboard
Support building with Ninja using MSVC
When compiling using MSVC and Ninja the compiler flags are not correctly set cause the tool fails to identify the compiler. This can be avoided by extending the identification mechanism for compiler in SetCompilerOptions.cmake, e.g. also checking for MSVC compiler ID.
Thanks for posting this @Destranix.
We typically use the blt_append_custom_compiler_flag()
macro to set flags for a specific compiler family, e.g. MSVC
and MSVC_INTEL
on Windows. Are these providing the wrong flags somewhere?
A specific example/reproducer would help us better understand the problem. E.g. which flags are wrong? Can you please provide more information about the errors that you're seeing and/or the desired behavior?
The following links might be helpful:
- API documentation for
blt_append_custom_compiler_flag
: https://llnl-blt.readthedocs.io/en/develop/api/utility.html#blt-append-custom-compiler-flag - Code that checks for different compiler families on Windows: https://github.com/LLNL/blt/blob/8c229991e65e7a9603c621b47cb3ba158bb7468c/cmake/SetupCompilerOptions.cmake#L19-L25
"Are these providing the wrong flags somewhere?"
Yes. Compiling e.g. SAMRAI I got a "/Wextra"-Flag and others.
"A specific example/reproducer would help us better understand the problem." Here a Build-File I used (Please note, that some platformspecific settings, especially the path, have to be adjusted):
@echo off
setlocal
cd /d %~dp0
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set arch_command_length=32 || set arch_command_length=64
echo "%PROCESSOR_ARCHITECTURE%" | find /i "arm" > NUL && goto ARM || goto AMD
:ARM
IF %arch_command_length% == 32 (
set arch_string=x86_arm
set arch_command_length_string=x86
) ELSE (
set arch_string=amd64_arm64
set arch_command_length_string=x64
)
goto VC_VARC_INIT
:AMD
IF %arch_command_length% == 32 (
set arch_string=x86
set arch_command_length_string=x86
) ELSE (
set arch_string=amd64
set arch_command_length_string=x64
)
goto VC_VARC_INIT
:VC_VARC_INIT
call vcvarsall.bat %arch_string% -vcvars_ver=
call D:\My_Programs\Fortran\setvars.bat
set compiler_path=%VCToolsInstallDir%\bin\Host%arch_command_length_string%\%arch_command_length_string%\cl.exe
set linker_path=%VCToolsInstallDir%\bin\Host%arch_command_length_string%\%arch_command_length_string%\link.exe
set archiver_path=%VCToolsInstallDir%\bin\Host%arch_command_length_string%\%arch_command_length_string%\lib.exe
call "%DevEnvDir%\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DENABLE_TOOLS=ON -DENABLE_OPENMP=ON -DCMAKE_AR:FILEPATH="%archiver_path%" -DCMAKE_LINKER:FILEPATH="%linker_path%" -DCMAKE_INSTALL_PREFIX:PATH="%CD%\out\install" -DCMAKE_CXX_COMPILER:FILEPATH="%compiler_path%" -DCMAKE_C_COMPILER:FILEPATH="%compiler_path%" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_MAKE_PROGRAM="%DevEnvDir%\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" "D:\Destranix\Documents\00Uni\Simulation\SAMARAI-Builds\SAMRAI"
call "%DevEnvDir%\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" --build . --config Release
"Can you please provide more information about the errors that you're seeing and/or the desired behavior?" Telling me, that the flag "/Wextra" is unkown and throwing an error, failing to compile.
I worked around the Issue by checking for compiler ID "MSVC" and setting the "COMPILER_FAMILY_IS_MSVC" flag accordingly.