CMake v3.20.5 does not propagate Visual Studio /TP flag (regression from v3.6.1)
Hello. We're investigating updating our build system from CMake 3.6.1 to 3.20.5. One of our projects uses the /TP
parameter to compile a C project as CPP. This worked well in 3.6.1 where it was converted from CMAKE_C_FLAGS
in CMakeLists.txt
to the equivalent <CompileAs>CompileAsCpp</CompileAs>
in the .vcxproj
.
After updating to 3.20.5, I noticed that <CompileAs>
is no longer being set. This could be fine if the /TP
parameter was passed through as a compilation flag, but it too seems to be stripped.
Expected functionality (3.6.1):
C:\git\2021-06-28-cmake-bug-report\build>cmake --version
cmake version 3.6.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
C:\git\2021-06-28-cmake-bug-report\build>cmake.exe -G "Visual Studio 14" ..
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/git/2021-06-28-cmake-bug-report/build
C:\git\2021-06-28-cmake-bug-report\build>grep CompileAs Dummy.vcxproj
<CompileAs>CompileAsCpp</CompileAs>
<CompileAs>CompileAsCpp</CompileAs>
<CompileAs>CompileAsCpp</CompileAs>
<CompileAs>CompileAsCpp</CompileAs>
C:\git\2021-06-28-cmake-bug-report\build>grep "/TP" Dummy.vcxproj
C:\git\2021-06-28-cmake-bug-report\build>msbuild dummy.sln
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 6/28/2021 1:15:30 PM.
Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
Building solution configuration "Debug|Win32".
ValidateProjects:
The project "ALL_BUILD" is not selected for building in solution configuration "Debug|Win32".
Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" (1) is building "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) on node 1 (d
efault targets).
Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) is building "C:\git\2021-06-28-cmake-bug-report\build\ZERO_CHECK.vcxproj" (3) on
node 1 (default targets).
PrepareForBuild:
Creating directory "Win32\Debug\ZERO_CHECK\".
Creating directory "C:\git\2021-06-28-cmake-bug-report\build\Debug\".
Creating directory "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\".
InitializeBuildStatus:
Creating "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
CustomBuild:
Checking Build System
CMake does not need to re-run because C:/git/2021-06-28-cmake-bug-report/build/CMakeFiles/generate.stamp is up-to-date.
FinalizeBuildStatus:
Deleting file "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild".
Touching "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate".
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\ZERO_CHECK.vcxproj" (default targets).
Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) is building "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj" (4) on node
1 (default targets).
PrepareForBuild:
Creating directory "Dummy.dir\Debug\".
Creating directory "Dummy.dir\Debug\Dummy.tlog\".
InitializeBuildStatus:
Creating "Dummy.dir\Debug\Dummy.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
CustomBuild:
Building Custom Rule C:/git/2021-06-28-cmake-bug-report/CMakeLists.txt
CMake does not need to re-run because C:\git\2021-06-28-cmake-bug-report\build\CMakeFiles\generate.stamp is up-to-date.
ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe /c /I"C:\Program Files (x86)\Visual Leak Detector\include" /Zi /nologo /W1 /WX- /Od /Ob0 /O
y- /D _DEBUG /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Dummy.dir\Debug\\" /Fd"Dummy.dir\De
bug\vc140.pdb" /Gd /TP /analyze- /errorReport:queue "C:\git\2021-06-28-cmake-bug-report\dummy.c"
dummy.c
Link:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\link.exe /ERRORREPORT:QUEUE /OUT:"C:\git\2021-06-28-cmake-bug-report\build\Debug\Dummy.exe" /INCRE
MENTAL /NOLOGO /LIBPATH:"C:\Program Files (x86)\Visual Leak Detector\lib\Win32" kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32
.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:/git/2021-06-28-cmake-bug-
report/build/Debug/Dummy.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/git/2021-06-28-cmake-bug-report/build/Debug/Dummy.lib" /MACHINE:
X86 /SAFESEH /machine:X86 Dummy.dir\Debug\dummy.obj
Dummy.vcxproj -> C:\git\2021-06-28-cmake-bug-report\build\Debug\Dummy.exe
FinalizeBuildStatus:
Deleting file "Dummy.dir\Debug\Dummy.tlog\unsuccessfulbuild".
Touching "Dummy.dir\Debug\Dummy.tlog\Dummy.lastbuildstate".
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj" (default targets).
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (default targets).
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" (default targets).
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:01.13
C:\git\2021-06-28-cmake-bug-report\build>
Compare that to 3.20.5:
C:\git\2021-06-28-cmake-bug-report\build>C:\cmake-3.20.5-windows-x86_64\bin\cmake.exe --version
cmake version 3.20.5
CMake suite maintained and supported by Kitware (kitware.com/cmake).
C:\git\2021-06-28-cmake-bug-report\build>C:\cmake-3.20.5-windows-x86_64\bin\cmake.exe -G "Visual Studio 14" ..
-- Selecting Windows SDK version to target Windows 10.0.19043.
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/git/2021-06-28-cmake-bug-report/build
C:\git\2021-06-28-cmake-bug-report\build>grep CompileAs Dummy.vcxproj
C:\git\2021-06-28-cmake-bug-report\build>grep "/TP" Dummy.vcxproj
C:\git\2021-06-28-cmake-bug-report\build>msbuild dummy.sln
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 6/28/2021 1:17:31 PM.
Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
Building solution configuration "Debug|Win32".
ValidateProjects:
The project "ALL_BUILD" is not selected for building in solution configuration "Debug|Win32".
Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" (1) is building "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) on node 1 (d
efault targets).
Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) is building "C:\git\2021-06-28-cmake-bug-report\build\ZERO_CHECK.vcxproj" (3) on
node 1 (default targets).
PrepareForBuild:
Creating directory "Win32\Debug\ZERO_CHECK\".
Creating directory "C:\git\2021-06-28-cmake-bug-report\build\Debug\".
Creating directory "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\".
InitializeBuildStatus:
Creating "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
CustomBuild:
Checking Build System
FinalizeBuildStatus:
Deleting file "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild".
Touching "Win32\Debug\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate".
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\ZERO_CHECK.vcxproj" (default targets).
Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (2) is building "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj" (4) on node
1 (default targets).
PrepareForBuild:
Creating directory "Dummy.dir\Debug\".
Creating directory "Dummy.dir\Debug\Dummy.tlog\".
InitializeBuildStatus:
Creating "Dummy.dir\Debug\Dummy.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
CustomBuild:
Building Custom Rule C:/git/2021-06-28-cmake-bug-report/CMakeLists.txt
ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe /c /I"C:\Program Files (x86)\Visual Leak Detector\include" /Zi /nologo /W1 /WX- /Od /Ob0 /O
y- /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Dummy.dir\Debug\\" /Fd"Dummy.dir\Debug\vc140.
pdb" /Gd /TC /analyze- /errorReport:queue "C:\git\2021-06-28-cmake-bug-report\dummy.c"
dummy.c
C:\git\2021-06-28-cmake-bug-report\dummy.c(3): fatal error C1189: #error: "This file should be compiled as CPP (/TP)" [C:\git\2021-06-28-cmake-bug-report\buil
d\Dummy.vcxproj]
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj" (default targets) -- FAILED.
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (default targets) -- FAILED.
Done Building Project "C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" (default targets) -- FAILED.
Build FAILED.
"C:\git\2021-06-28-cmake-bug-report\build\dummy.sln" (default target) (1) ->
"C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj.metaproj" (default target) (2) ->
"C:\git\2021-06-28-cmake-bug-report\build\Dummy.vcxproj" (default target) (4) ->
(ClCompile target) ->
C:\git\2021-06-28-cmake-bug-report\dummy.c(3): fatal error C1189: #error: "This file should be compiled as CPP (/TP)" [C:\git\2021-06-28-cmake-bug-report\bu
ild\Dummy.vcxproj]
0 Warning(s)
1 Error(s)
Time Elapsed 00:00:00.74
We see this same issue with 3.20.5 with VS2019. Please advise.
Minimal/trivial repro project is here: 2021-06-28-cmake-bug-report.zip