Skip to content

Commit 9873280

Browse files
committed
build: convert output variables to target
Convert the out parameters for `_add_host_variant_link_flags` to use the target as an in-parameter. Doing so allows us to set the properties on the target directly rather than providing them as out parameters which then get set subsequently.
1 parent 2e13205 commit 9873280

File tree

2 files changed

+54
-91
lines changed

2 files changed

+54
-91
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 53 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -322,104 +322,107 @@ function(_add_host_variant_c_compile_flags)
322322
set("${CFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE)
323323
endfunction()
324324

325-
function(_add_host_variant_link_flags)
326-
set(oneValueArgs
327-
RESULT_VAR_NAME ENABLE_LTO LTO_OBJECT_NAME LINK_LIBRARIES_VAR_NAME LIBRARY_SEARCH_DIRECTORIES_VAR_NAME)
328-
cmake_parse_arguments(LFLAGS
329-
""
330-
"${oneValueArgs}"
331-
""
332-
${ARGN})
333-
334-
set(result ${${LFLAGS_RESULT_VAR_NAME}})
335-
set(link_libraries ${${LFLAGS_LINK_LIBRARIES_VAR_NAME}})
336-
set(library_search_directories ${${LFLAGS_LIBRARY_SEARCH_DIRECTORIES_VAR_NAME}})
337-
325+
function(_add_host_variant_link_flags target)
338326
_add_host_variant_c_compile_link_flags(
339327
ANALYZE_CODE_COVERAGE ${SWIFT_ANALYZE_CODE_COVERAGE}
340328
RESULT_VAR_NAME result)
329+
target_link_options(${target} PRIVATE
330+
${result})
331+
341332
if(SWIFT_HOST_VARIANT_SDK STREQUAL LINUX)
342-
list(APPEND link_libraries "pthread" "dl")
333+
target_link_libraries(${target} PRIVATE
334+
pthread
335+
dl)
343336
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL FREEBSD)
344-
list(APPEND link_libraries "pthread")
337+
target_link_libraries(${target} PRIVATE
338+
pthread)
345339
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL CYGWIN)
346340
# No extra libraries required.
347341
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
348-
# We don't need to add -nostdlib using MSVC or clang-cl, as MSVC and clang-cl rely on auto-linking entirely.
342+
# We don't need to add -nostdlib using MSVC or clang-cl, as MSVC and
343+
# clang-cl rely on auto-linking entirely.
349344
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
350345
# NOTE: we do not use "/MD" or "/MDd" and select the runtime via linker
351346
# options. This causes conflicts.
352-
list(APPEND result "-nostdlib")
347+
target_link_options(${target} PRIVATE
348+
-nostdlib)
353349
endif()
354350
swift_windows_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH}
355351
${SWIFT_HOST_VARIANT_ARCH}_LIB)
356-
list(APPEND library_search_directories ${${SWIFT_HOST_VARIANT_ARCH}_LIB})
352+
target_link_directories(${target} PRIVATE
353+
${${SWIFT_HOST_VARIANT_ARCH}_LIB})
357354

358355
# NOTE(compnerd) workaround incorrectly extensioned import libraries from
359356
# the Windows SDK on case sensitive file systems.
360-
list(APPEND library_search_directories
357+
target_link_directories(${target} PRIVATE
361358
${CMAKE_BINARY_DIR}/winsdk_lib_${SWIFT_HOST_VARIANT_ARCH}_symlinks)
362359
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL HAIKU)
363-
list(APPEND link_libraries "bsd" "atomic")
364-
list(APPEND result "-Wl,-Bsymbolic")
360+
target_link_libraries(${target} PRIVATE
361+
atomic
362+
bsd)
363+
target_link_options(${target} PRIVATE
364+
"SHELL:-Xlinker -Bsymbolic")
365365
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID)
366-
list(APPEND link_libraries "dl" "log" "atomic")
367-
# We need to add the math library, which is linked implicitly by libc++
368-
list(APPEND result "-lm")
366+
target_link_libraries(${target} PRIVATE
367+
atomic
368+
dl
369+
log
370+
# We need to add the math library, which is linked implicitly by libc++
371+
m)
369372

370373
# link against the custom C++ library
371-
swift_android_cxx_libraries_for_arch(${SWIFT_HOST_VARIANT_ARCH} cxx_link_libraries)
372-
list(APPEND link_libraries ${cxx_link_libraries})
374+
swift_android_cxx_libraries_for_arch(${SWIFT_HOST_VARIANT_ARCH}
375+
cxx_link_libraries)
376+
target_link_libraries(${target} PRIVATE
377+
${cxx_link_libraries})
373378

374379
# link against the ICU libraries
375-
list(APPEND link_libraries
380+
target_link_libraries(${target} PRIVATE
376381
${SWIFT_ANDROID_${SWIFT_HOST_VARIANT_ARCH}_ICU_I18N}
377382
${SWIFT_ANDROID_${SWIFT_HOST_VARIANT_ARCH}_ICU_UC})
378383

379384
swift_android_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH}
380385
${SWIFT_HOST_VARIANT_ARCH}_LIB)
381-
foreach(path IN LISTS ${SWIFT_HOST_VARIANT_ARCH}_LIB)
382-
list(APPEND library_search_directories ${path})
383-
endforeach()
386+
target_link_directories(${target} PRIVATE
387+
${${SWIFT_HOST_VARIANT_ARCH}_LIB})
384388
else()
385389
# If lto is enabled, we need to add the object path flag so that the LTO code
386390
# generator leaves the intermediate object file in a place where it will not
387391
# be touched. The reason why this must be done is that on OS X, debug info is
388392
# left in object files. So if the object file is removed when we go to
389393
# generate a dsym, the debug info is gone.
390394
if (SWIFT_TOOLS_ENABLE_LTO)
391-
precondition(LFLAGS_LTO_OBJECT_NAME
392-
MESSAGE "Should specify a unique name for the lto object")
393-
set(lto_object_dir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
394-
set(lto_object ${lto_object_dir}/${LFLAGS_LTO_OBJECT_NAME}-lto.o)
395-
list(APPEND result "-Wl,-object_path_lto,${lto_object}")
396-
endif()
395+
target_link_options(${target} PRIVATE
396+
"SHELL:-Xlinker -object_path_lto"
397+
"SHELL:-Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${target}-${SWIFT_HOST_VARIANT_SDK}-${SWIFT_HOST_VARIANT_ARCH}-lto${CMAKE_C_OUTPUT_EXTENSION}")
398+
endif()
397399
endif()
398400

399401
if(NOT "${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_SDK}_ICU_UC}" STREQUAL "")
400402
get_filename_component(SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_UC_LIBDIR
401403
"${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_SDK}_ICU_UC}" DIRECTORY)
402-
list(APPEND library_search_directories "${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_UC_LIBDIR}")
404+
target_link_directories(${target} PRIVATE
405+
"${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_UC_LIBDIR}")
403406
endif()
404407
if(NOT "${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_I18N}" STREQUAL "")
405408
get_filename_component(SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_SDK}_ICU_I18N_LIBDIR
406409
"${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_I18N}" DIRECTORY)
407-
list(APPEND library_search_directories "${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_I18N_LIBDIR}")
410+
target_link_directories(${target} PRIVATE
411+
"${SWIFT_${SWIFT_HOST_VARIANT_SDK}_${SWIFT_HOST_VARIANT_ARCH}_ICU_I18N_LIBDIR}")
408412
endif()
409413

410414
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
411415
# FIXME: On Apple platforms, find_program needs to look for "ld64.lld"
412416
find_program(LDLLD_PATH "ld.lld")
413417
if((SWIFT_ENABLE_LLD_LINKER AND LDLLD_PATH AND NOT APPLE) OR
414-
(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS AND
415-
NOT CMAKE_SYSTEM_NAME STREQUAL WINDOWS))
416-
list(APPEND result "-fuse-ld=lld")
418+
(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS AND NOT CMAKE_SYSTEM_NAME STREQUAL WINDOWS))
419+
target_link_options(${target} PRIVATE -fuse-ld=lld)
417420
elseif(SWIFT_ENABLE_GOLD_LINKER AND
418-
"${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_OBJECT_FORMAT}" STREQUAL "ELF")
421+
"${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_OBJECT_FORMAT}" STREQUAL "ELF")
419422
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
420-
list(APPEND result "-fuse-ld=gold.exe")
423+
target_link_options(${target} PRIVATE -fuse-ld=gold.exe)
421424
else()
422-
list(APPEND result "-fuse-ld=gold")
425+
target_link_options(${target} PRIVATE -fuse-ld=gold)
423426
endif()
424427
endif()
425428
endif()
@@ -431,19 +434,16 @@ function(_add_host_variant_link_flags)
431434
# TODO: Evaluate/enable -f{function,data}-sections --gc-sections for bfd,
432435
# gold, and lld.
433436
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
434-
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
437+
if(CMAKE_SYSTEM_NAME MATCHES Darwin)
435438
# See rdar://48283130: This gives 6MB+ size reductions for swift and
436439
# SourceKitService, and much larger size reductions for sil-opt etc.
437-
list(APPEND result "-Wl,-dead_strip")
440+
target_link_options(${target} PRIVATE
441+
"SHELL:-Xlinker -dead_strip")
438442
endif()
439443
endif()
440444

441445
get_maccatalyst_build_flavor(maccatalyst_build_flavor
442446
"${SWIFT_HOST_VARIANT_SDK}" "")
443-
444-
set("${LFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE)
445-
set("${LFLAGS_LINK_LIBRARIES_VAR_NAME}" "${link_libraries}" PARENT_SCOPE)
446-
set("${LFLAGS_LIBRARY_SEARCH_DIRECTORIES_VAR_NAME}" "${library_search_directories}" PARENT_SCOPE)
447447
endfunction()
448448

449449
# Add a single variant of a new Swift library.
@@ -591,20 +591,14 @@ function(_add_swift_host_library_single target)
591591
set(c_compile_flags ${ASHLS_C_COMPILE_FLAGS})
592592
set(link_flags)
593593

594-
set(library_search_directories)
595-
596594
_add_host_variant_c_compile_flags(RESULT_VAR_NAME c_compile_flags)
597595

598596
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
599597
if(libkind STREQUAL SHARED)
600598
list(APPEND c_compile_flags -D_WINDLL)
601599
endif()
602600
endif()
603-
_add_host_variant_link_flags(
604-
LTO_OBJECT_NAME "${target}-${SWIFT_HOST_VARIANT_SDK}-${SWIFT_HOST_VARIANT_ARCH}"
605-
RESULT_VAR_NAME link_flags
606-
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories
607-
)
601+
_add_host_variant_link_flags(${target})
608602

609603
# Set compilation and link flags.
610604
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
@@ -629,8 +623,6 @@ function(_add_swift_host_library_single target)
629623

630624
target_compile_options(${target} PRIVATE
631625
${c_compile_flags})
632-
target_link_options(${target} PRIVATE
633-
${link_flags})
634626
if(${SWIFT_HOST_VARIANT_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
635627
target_link_options(${target} PRIVATE
636628
"LINKER:-compatibility_version,1")
@@ -657,10 +649,6 @@ function(_add_swift_host_library_single target)
657649
endif()
658650
endif()
659651
endif()
660-
target_link_libraries(${target} PRIVATE
661-
${link_libraries})
662-
target_link_directories(${target} PRIVATE
663-
${library_search_directories})
664652

665653
# Do not add code here.
666654
endfunction()
@@ -755,29 +743,14 @@ function(add_swift_host_tool executable)
755743
precondition(ASHT_SWIFT_COMPONENT
756744
MESSAGE "Swift Component is required to add a host tool")
757745

758-
# Determine compiler flags.
759-
set(c_compile_flags)
760-
set(link_flags)
761-
set(link_libraries)
762-
set(library_search_directories
763-
${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR})
764-
765746
_add_host_variant_c_compile_flags(RESULT_VAR_NAME c_compile_flags)
766-
_add_host_variant_link_flags(
767-
LTO_OBJECT_NAME "${executable}-${SWIFT_HOST_VARIANT_SDK}-${SWIFT_HOST_VARIANT_ARCH}"
768-
RESULT_VAR_NAME link_flags
769-
LINK_LIBRARIES_VAR_NAME link_libraries
770-
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories)
771747

772748
add_executable(${executable} ${ASHT_UNPARSED_ARGUMENTS})
773749
target_compile_options(${executable} PRIVATE
774750
${c_compile_flags})
751+
_add_host_variant_link_flags(${executable})
775752
target_link_directories(${executable} PRIVATE
776-
${library_search_directories})
777-
target_link_options(${executable} PRIVATE
778-
${link_flags})
779-
target_link_libraries(${executable} PRIVATE
780-
${link_libraries})
753+
${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR})
781754

782755
set_target_properties(${executable} PROPERTIES
783756
FOLDER "Swift executables")

tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,7 @@ function(add_sourcekit_default_compiler_flags target)
4646

4747
# Add variant-specific flags.
4848
_add_host_variant_c_compile_flags(RESULT_VAR_NAME c_compile_flags)
49-
_add_host_variant_link_flags(
50-
LTO_OBJECT_NAME "${target}-${SWIFT_HOST_VARIANT_SDK}-${SWIFT_HOST_VARIANT_ARCH}"
51-
RESULT_VAR_NAME link_flags
52-
LINK_LIBRARIES_VAR_NAME link_libraries
53-
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories)
49+
_add_host_variant_link_flags(${target})
5450

5551
# Set compilation and link flags.
5652
if(${SWIFT_HOST_VARIANT_SDK} STREQUAL WINDOWS)
@@ -61,12 +57,6 @@ function(add_sourcekit_default_compiler_flags target)
6157
endif()
6258
target_compile_options(${target} PRIVATE
6359
-fblocks)
64-
target_link_options(${target} PRIVATE
65-
${link_flags})
66-
target_link_directories(${target} PRIVATE
67-
${library_search_directories})
68-
target_link_libraries(${target} PRIVATE
69-
${link_libraries})
7060
endfunction()
7161

7262
# Add a new SourceKit library.

0 commit comments

Comments
 (0)