Skip to content

Commit df71a35

Browse files
committed
cmake: Pass optimization flag to linker too
The linker may want to know the desired optimization level as when the multilib configuration includes -Os as a selector. Adopt the same pattern as the assembler optimization flags by allowing toolchains to specify linker optimization flags which default to the compiler optimization flags and the apply those using add_link_options. Signed-off-by: Keith Packard <[email protected]>
1 parent 0e3cd5b commit df71a35

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ get_property(ASM_OPTIMIZE_FOR_SPEED_FLAG TARGET asm PROPERTY optimization_speed)
226226
get_property(ASM_OPTIMIZE_FOR_SIZE_FLAG TARGET asm PROPERTY optimization_size)
227227
get_property(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET asm PROPERTY optimization_size_aggressive)
228228

229+
get_property(LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG TARGET linker PROPERTY no_optimization)
230+
get_property(LINKER_OPTIMIZE_FOR_DEBUG_FLAG TARGET linker PROPERTY optimization_debug)
231+
get_property(LINKER_OPTIMIZE_FOR_SPEED_FLAG TARGET linker PROPERTY optimization_speed)
232+
get_property(LINKER_OPTIMIZE_FOR_SIZE_FLAG TARGET linker PROPERTY optimization_size)
233+
get_property(LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET linker PROPERTY optimization_size_aggressive)
234+
229235
# Let the assembler inherit the optimization flags of the compiler if it is
230236
# not set explicitly.
231237
if(NOT ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG)
@@ -244,23 +250,46 @@ if(NOT ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG)
244250
set(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG})
245251
endif()
246252

253+
# Let the linker inherit the optimization flags of the compiler if it is
254+
# not set explicitly.
255+
if(NOT LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG)
256+
set(LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG})
257+
endif()
258+
if(NOT LINKER_OPTIMIZE_FOR_DEBUG_FLAG)
259+
set(LINKER_OPTIMIZE_FOR_DEBUG_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG})
260+
endif()
261+
if(NOT LINKER_OPTIMIZE_FOR_SPEED_FLAG)
262+
set(LINKER_OPTIMIZE_FOR_SPEED_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG})
263+
endif()
264+
if(NOT LINKER_OPTIMIZE_FOR_SIZE_FLAG)
265+
set(LINKER_OPTIMIZE_FOR_SIZE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG})
266+
endif()
267+
if(NOT LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG)
268+
set(LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG})
269+
endif()
270+
247271
# From kconfig choice, pick the actual OPTIMIZATION_FLAG to use.
248272
# Kconfig choice ensures only one of these CONFIG_*_OPTIMIZATIONS is set.
249273
if(CONFIG_NO_OPTIMIZATIONS)
250274
set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG})
251275
set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG})
276+
set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG})
252277
elseif(CONFIG_DEBUG_OPTIMIZATIONS)
253278
set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG})
254279
set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_DEBUG_FLAG})
280+
set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_DEBUG_FLAG})
255281
elseif(CONFIG_SPEED_OPTIMIZATIONS)
256282
set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG})
257283
set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SPEED_FLAG})
284+
set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SPEED_FLAG})
258285
elseif(CONFIG_SIZE_OPTIMIZATIONS)
259286
set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG}) # Default in kconfig
260287
set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_FLAG})
288+
set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SIZE_FLAG})
261289
elseif(CONFIG_SIZE_OPTIMIZATIONS_AGGRESSIVE)
262290
set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG})
263291
set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG})
292+
set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG})
264293
else()
265294
message(FATAL_ERROR
266295
"Unreachable code. Expected optimization level to have been chosen. See Kconfig.zephyr")
@@ -277,6 +306,7 @@ endif()
277306
zephyr_compile_options($<$<COMPILE_LANGUAGE:ASM>:${ASM_OPTIMIZATION_FLAG}>)
278307
zephyr_compile_options($<$<COMPILE_LANGUAGE:C>:${COMPILER_OPTIMIZATION_FLAG}>)
279308
zephyr_compile_options($<$<COMPILE_LANGUAGE:CXX>:${COMPILER_OPTIMIZATION_FLAG}>)
309+
add_link_options(${LINKER_OPTIMIZATION_FLAG})
280310

281311
if(CONFIG_LTO)
282312
zephyr_compile_options($<TARGET_PROPERTY:compiler,optimization_lto>)

0 commit comments

Comments
 (0)