Skip to content

Commit b81cba3

Browse files
azeeyAddisu Z. Taddese
andcommitted
Make Whole Program Optimization (WPO) optional on MSVC (#532)
* Add GZ_MSVC_WPO option to toggle Whole Program Optimization This adds a \GZ_MSVC_WPO\ option (default ON) that controls the injection of \/GL\ and \/LTCG\ on MSVC. It also fixes a bug where \/LTCG\ was only applied to RelWithDebInfo shared linker flags, and not to Release or other target types. \/INCREMENTAL:NO\ is appropriately restricted to RelWithDebInfo. Generated-By: Gemini 3.1 Pro Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai> * Add /bigobj flag to MSVC_MINIMAL_FLAGS Increases the number of sections in an object file to prevent C1128 errors when building complex templated code with Whole Program Optimization (/GL) enabled. Generated-By: Gemini 3.0 Pro --------- Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai> Co-authored-by: Addisu Z. Taddese <addisu@openrobotics.org> (cherry picked from commit a3c8e29) Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
1 parent 4deb840 commit b81cba3

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

cmake/IgnSetCompilerFlags.cmake

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,23 +294,35 @@ macro(ign_setup_msvc)
294294
# W2: Warning level 2: significant warnings.
295295
# TODO: Recommend Wall in the future.
296296
# Note: MSVC /Wall generates tons of warnings on gtest code.
297-
set(MSVC_MINIMAL_FLAGS "/Gy /W2")
297+
# bigobj: Increase the number of sections in an object file, which is often needed
298+
# for complex templated code or when using Whole Program Optimization (/GL).
299+
set(MSVC_MINIMAL_FLAGS "/Gy /W2 /bigobj")
298300

299301
# Zi: Produce complete debug information
300302
# Note: We provide Zi to ordinary release mode because it does not impact
301303
# performance and can be helpful for debugging.
302304
set(MSVC_DEBUG_FLAGS "${MSVC_MINIMAL_FLAGS} /Zi")
303305

304-
# GL: Enable Whole Program Optimization
305-
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
306-
307-
# UNDEBUG: Undefine NDEBUG so that assertions can be triggered
308-
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS} /UNDEBUG")
309-
310-
# INCREMENTAL:NO fix LNK4075 warning
311-
# LTCG: need when using /GL above
312-
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
313-
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
306+
option(GZ_MSVC_WPO "Enable Whole Program Optimization on MSVC" ON)
307+
if(GZ_MSVC_WPO)
308+
# GL: Enable Whole Program Optimization
309+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
310+
311+
# UNDEBUG: Undefine NDEBUG so that assertions can be triggered
312+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS} /UNDEBUG")
313+
314+
# LTCG: need when using /GL above
315+
set(MSVC_RELEASE_LINKER_FLAGS "/LTCG")
316+
317+
# INCREMENTAL:NO fix LNK4075 warning
318+
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
319+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
320+
else()
321+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS}")
322+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS} /UNDEBUG")
323+
set(MSVC_RELEASE_LINKER_FLAGS "")
324+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO")
325+
endif()
314326

315327
# cmake automatically provides /Zi /Ob0 /Od /RTC1
316328
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${MSVC_DEBUG_FLAGS}")
@@ -319,11 +331,16 @@ macro(ign_setup_msvc)
319331
# cmake automatically provides /O2 /Ob2 /DNDEBUG
320332
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
321333
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
334+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
335+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
336+
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
322337

323338
# cmake automatically provides /Zi /O2 /Ob1 /DNDEBUG
324339
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
325340
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
326341
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
342+
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
343+
set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
327344

328345
# cmake automatically provides /O1 /Ob1 /DNDEBUG
329346
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} ${MSVC_MINIMAL_FLAGS}")

0 commit comments

Comments
 (0)