Skip to content

Commit 9ae6909

Browse files
committed
build: prevent CMake from causing a full rebuild every time it is run
1 parent d2205eb commit 9ae6909

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

cmake/modules/Utilities.cmake

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,13 @@ function(generate_build_configurations)
7777
# Convert lists to strings for CMake variables
7878
# Append to preserve any flags set by toolchain files or CMake initialization
7979
listToString(final_compiler_flags "${DEFAULT_COMPILER_FLAGS}" "${compiler_flags}")
80-
set(CMAKE_CXX_FLAGS_${triplet_upper} "${CMAKE_CXX_FLAGS_${triplet_upper}} ${final_compiler_flags}" CACHE STRING "" FORCE)
81-
set(CMAKE_C_FLAGS_${triplet_upper} "${CMAKE_C_FLAGS_${triplet_upper}} ${final_compiler_flags}" CACHE STRING "" FORCE)
80+
# Only set if not already in cache to avoid triggering rebuilds
81+
if(NOT DEFINED CMAKE_CXX_FLAGS_${triplet_upper})
82+
set(CMAKE_CXX_FLAGS_${triplet_upper} "${final_compiler_flags}" CACHE STRING "")
83+
endif()
84+
if(NOT DEFINED CMAKE_C_FLAGS_${triplet_upper})
85+
set(CMAKE_C_FLAGS_${triplet_upper} "${final_compiler_flags}" CACHE STRING "")
86+
endif()
8287

8388
# Combine DEFAULT_COMPILER_FLAGS with per-config flags for propagation to external consumers
8489
# This ensures both base flags (like /W3, /Zc:inline) and config-specific flags (like /O2) propagate
@@ -97,18 +102,25 @@ function(generate_build_configurations)
97102
# and add to TARGET_LINK_OPTIONS for per-config generator expressions
98103
# For single-config generators (Ninja), only set the base CMAKE flags for the active config
99104
if(is_multi_config)
100-
# Append to existing flags to preserve CMake's defaults (including standard libraries)
101-
set(CMAKE_EXE_LINKER_FLAGS_${triplet_upper} "${CMAKE_EXE_LINKER_FLAGS_${triplet_upper}} ${exe_linker_flags}" CACHE STRING "" FORCE)
102-
set(CMAKE_SHARED_LINKER_FLAGS_${triplet_upper} "${CMAKE_SHARED_LINKER_FLAGS_${triplet_upper}} ${shared_linker_flags}" CACHE STRING "" FORCE)
105+
# Only set if not already in cache to avoid triggering rebuilds
106+
if(NOT DEFINED CMAKE_EXE_LINKER_FLAGS_${triplet_upper})
107+
set(CMAKE_EXE_LINKER_FLAGS_${triplet_upper} "${exe_linker_flags}" CACHE STRING "")
108+
endif()
109+
if(NOT DEFINED CMAKE_SHARED_LINKER_FLAGS_${triplet_upper})
110+
set(CMAKE_SHARED_LINKER_FLAGS_${triplet_upper} "${shared_linker_flags}" CACHE STRING "")
111+
endif()
103112
# Include default linker flags for propagation to external consumers
104113
# UE4SS is a SHARED library, so use DEFAULT_SHARED_LINKER_FLAGS (which is currently empty)
105114
# But also include DEFAULT_EXE_LINKER_FLAGS (/DEBUG:FULL) for completeness
106115
list(APPEND TARGET_LINK_OPTIONS_LOCAL "$<$<STREQUAL:$<CONFIG>,${triplet}>:${DEFAULT_EXE_LINKER_FLAGS};${linker_flags}>")
107116
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "${triplet}")
108-
# For single-config, append to base flags including DEFAULT_EXE_LINKER_FLAGS
109-
# Preserve CMake's defaults including standard libraries
110-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${DEFAULT_EXE_LINKER_FLAGS} ${exe_linker_flags}" CACHE STRING "" FORCE)
111-
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${DEFAULT_SHARED_LINKER_FLAGS} ${shared_linker_flags}" CACHE STRING "" FORCE)
117+
# For single-config, only set if not already in cache to avoid triggering rebuilds
118+
if(NOT DEFINED CMAKE_EXE_LINKER_FLAGS)
119+
set(CMAKE_EXE_LINKER_FLAGS "${DEFAULT_EXE_LINKER_FLAGS} ${exe_linker_flags}" CACHE STRING "")
120+
endif()
121+
if(NOT DEFINED CMAKE_SHARED_LINKER_FLAGS)
122+
set(CMAKE_SHARED_LINKER_FLAGS "${DEFAULT_SHARED_LINKER_FLAGS} ${shared_linker_flags}" CACHE STRING "")
123+
endif()
112124
message(STATUS "Single-config: Applied ${triplet} linker flags to base CMAKE linker flags")
113125
# Also add to TARGET_LINK_OPTIONS for propagation to external consumers
114126
list(APPEND TARGET_LINK_OPTIONS_LOCAL "${DEFAULT_EXE_LINKER_FLAGS}")
@@ -141,11 +153,14 @@ function(setup_build_configuration)
141153
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
142154

143155
if(is_multi_config)
144-
set(CMAKE_CONFIGURATION_TYPES ${BUILD_CONFIGS} CACHE STRING "" FORCE)
156+
# Only set if not already defined to avoid unnecessary cache modifications
157+
if(NOT DEFINED CMAKE_CONFIGURATION_TYPES)
158+
set(CMAKE_CONFIGURATION_TYPES ${BUILD_CONFIGS} CACHE STRING "")
159+
endif()
145160
else()
146161
if(NOT CMAKE_BUILD_TYPE)
147162
message("Defaulting to Game__Shipping__Win64")
148-
set(CMAKE_BUILD_TYPE Game__Shipping__Win64 CACHE STRING "" FORCE)
163+
set(CMAKE_BUILD_TYPE Game__Shipping__Win64 CACHE STRING "")
149164
endif()
150165

151166
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose build type")

0 commit comments

Comments
 (0)