[CMake] Link Time Code Generation (LTGC) by default, for Release configurations of Visual Studio projects?

Niels Dekker niels_dekker_address_until_2024 at xs4all.nl
Wed Jan 24 15:06:09 EST 2018


When a Visual C++ project is created within Visual Studio (by File menu, 
New, Project...), it has Link Time Code Generation (LTGC) by default, 
for its Release configurations: Compiler option /GL and linker option 
/LTCG. However, when the Visual C++ project is generated by CMake, it 
does not have LTGC, by default. LTCG looks like a very useful feature to 
me. I think it's worth enabling the feature by default, for Release 
configurations. What do you think?


Some details:

I created a "dummy" Visual C++ project in Visual Studio 2017 (Version 
15.5.4), by File menu, New, Project..., and I also generated one by 
CMake (version 3.10.2), using a very minimal CMakeLists.txt

The Visual C++ project created by Visual Studio 2017 has the following 
compile options, by default, for Release (x64):

/permissive- /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl 
/Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "_MBCS" 
/errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" 
/EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\MyVS2015Project.pch" 
/diagnostics:classic

And the following linker options:

/OUT:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.exe" 
/MANIFEST /LTCG:incremental /NXCOMPAT 
/PDB:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.pdb" 
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" 
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" 
"uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FULL /MACHINE:X64 /OPT:REF 
/PGD:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.pgd" 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"x64\Release\MyVS2015Project.exe.intermediate.manifest" 
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1

The vcxproj file created by Visual Studio has 
"<WholeProgramOptimization>true</WholeProgramOptimization>" for its 
Release configurations.


The Visual C++ project generated by CMake (Generator: Visual Studio 15 
2017 Win64) has the following compile options, for its Release 
configuration:

/GS /TP /W3 /Zc:wchar_t /Gm- /O2 /Ob2 
/Fd"MyExecutable.dir\Release\vc141.pdb" /Zc:inline /fp:precise /D 
"WIN32" /D "_WINDOWS" /D "NDEBUG" /D "CMAKE_INTDIR=\"Release\"" /D 
"_MBCS" /errorReport:prompt /WX- /Zc:forScope /GR /Gd /MD /Fa"Release/" 
/EHsc /nologo /Fo"MyExecutable.dir\Release\" 
/Fp"MyExecutable.dir\Release\MyExecutable.pch" /diagnostics:classic

And the following linker options:

/OUT:"F:\X\Bin\vc141-64\MyProject\Release\MyExecutable.exe" /MANIFEST 
/NXCOMPAT /PDB:"F:/X/Bin/vc141-64/MyProject/Release/MyExecutable.pdb" 
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" 
"shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib" 
"advapi32.lib" 
/IMPLIB:"F:/X/Bin/vc141-64/MyProject/Release/MyExecutable.lib" 
/MACHINE:X64 /INCREMENTAL:NO 
/PGD:"F:\X\Bin\vc141-64\MyProject\Release\MyExecutable.pgd" 
/SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"MyExecutable.dir\Release\MyExecutable.exe.intermediate.manifest" 
/ERRORREPORT:PROMPT /NOLOGO /TLBID:1

The vcxproj file generated by CMake does not have a 
"<WholeProgramOptimization>" tag.


I hope you can consider adding LTCG to Release configurations of Visual 
C++ projects generated by CMake, by default.


Kind regards, Niels
-- 
Niels Dekker
Scientific programmer
LKEB, Leiden University Medical Center


More information about the CMake mailing list