From d8b3b626fe2c2f0a5205c423dbfc287d51b66ee3 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 25 Jan 2020 10:54:49 -0800 Subject: [PATCH] build: use modern target property handling Use specific operations for setting the compile flags, link flags, linked libraries, and library search paths. This allows us to use CMake more effectively, simplifies the logic, and will ensure that flags are not duplicated. --- cmake/modules/AddSwift.cmake | 80 +++++++++---------- cmake/modules/SwiftList.cmake | 9 --- lib/SymbolGraphGen/CMakeLists.txt | 2 +- .../cmake/modules/AddSwiftSourceKit.cmake | 18 ++--- 4 files changed, 46 insertions(+), 63 deletions(-) diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index dc59e57379d02..9caf6b793b03d 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -702,14 +702,6 @@ function(_add_swift_lipo_target) endif() endfunction() -function(swift_target_link_search_directories target directories) - set(STLD_FLAGS "") - foreach(directory ${directories}) - set(STLD_FLAGS "${STLD_FLAGS} \"${CMAKE_LIBRARY_PATH_FLAG}${directory}\"") - endforeach() - set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS ${STLD_FLAGS}) -endfunction() - # Add a single variant of a new Swift library. # # Usage: @@ -886,22 +878,10 @@ function(_add_swift_library_single target name) if(SWIFT_EMBED_BITCODE_SECTION AND NOT SWIFTLIB_SINGLE_DONT_EMBED_BITCODE) if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "IOS" OR "${SWIFTLIB_SINGLE_SDK}" STREQUAL "TVOS" OR "${SWIFTLIB_SINGLE_SDK}" STREQUAL "WATCHOS") list(APPEND SWIFTLIB_SINGLE_C_COMPILE_FLAGS "-fembed-bitcode") - list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-bitcode_bundle" "-Xlinker" "-lto_library" "-Xlinker" "${LLVM_LIBRARY_DIR}/libLTO.dylib") - # If we are asked to hide symbols, pass the obfuscation flag to libLTO. - if (SWIFT_EMBED_BITCODE_SECTION_HIDE_SYMBOLS) - list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-bitcode_hide_symbols") - endif() set(embed_bitcode_arg EMBED_BITCODE) endif() endif() - if(${SWIFTLIB_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS) - list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-compatibility_version" "-Xlinker" "1") - if (SWIFT_COMPILER_VERSION) - list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-current_version" "-Xlinker" "${SWIFT_COMPILER_VERSION}" ) - endif() - endif() - if(XCODE) string(REGEX MATCHALL "/[^/]+" split_path ${CMAKE_CURRENT_SOURCE_DIR}) list(GET split_path -1 dir) @@ -1450,17 +1430,32 @@ function(_add_swift_library_single target name) set(PLIST_INFO_BUILD_VERSION) endif() - # Convert variables to space-separated strings. - _list_escape_for_shell("${c_compile_flags}" c_compile_flags) - _list_escape_for_shell("${link_flags}" link_flags) - # Set compilation and link flags. - set_property(TARGET "${target}" APPEND_STRING PROPERTY - COMPILE_FLAGS " ${c_compile_flags}") - set_property(TARGET "${target}" APPEND_STRING PROPERTY - LINK_FLAGS " ${link_flags}") - set_property(TARGET "${target}" APPEND PROPERTY LINK_LIBRARIES ${link_libraries}) - swift_target_link_search_directories("${target}" "${library_search_directories}") + target_compile_options(${target} PRIVATE + ${c_compile_flags}) + target_link_options(${target} PRIVATE + ${link_flags}) + if(${SWIFTLIB_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS) + target_link_options(${target} PRIVATE + "LINKER:-compatibility_version,1") + if(SWIFT_COMPILER_VERSION) + target_link_options(${target} PRIVATE + "LINKER:-current_version,${SWIFT_COMPILER_VERSION}") + endif() + # Include LLVM Bitcode slices for iOS, Watch OS, and Apple TV OS device libraries. + if(SWIFT_EMBED_BITCODE_SECTION AND NOT SWIFTLIB_SINGLE_DONT_EMBED_BITCODE) + if(${SWIFTLIB_SINGLE_SDK} MATCHES "(I|TV|WATCH)OS") + target_link_options(${target} PRIVATE + "LINKER:-bitcode_bundle" + $<$:"LINKER:-bitcode_hide_symbols"> + "LINKER:-lto_library,${LLVM_LIBRARY_DIR}/libLTO.dylib") + endif() + endif() + endif() + target_link_libraries(${target} PRIVATE + ${link_libraries}) + target_link_directories(${target} PRIVATE + ${library_search_directories}) # Adjust the linked libraries for windows targets. On Windows, the link is # performed against the import library, and the runtime uses the dll. Not @@ -1510,8 +1505,8 @@ function(_add_swift_library_single target name) endif() if(target_static) - set_property(TARGET "${target_static}" APPEND_STRING PROPERTY - COMPILE_FLAGS " ${c_compile_flags}") + target_link_options(${target_static} PRIVATE + ${c_compile_flags}) # FIXME: The fallback paths here are going to be dynamic libraries. if(SWIFTLIB_INSTALL_WITH_SHARED) @@ -1523,7 +1518,8 @@ function(_add_swift_library_single target name) "${search_base_dir}/${SWIFTLIB_SINGLE_SUBDIR}" "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}" "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}") - swift_target_link_search_directories("${target_static}" "${library_search_directories}") + target_link_directories(${target_static} PRIVATE + ${library_search_directories}) target_link_libraries("${target_static}" PRIVATE ${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}) endif() @@ -2624,16 +2620,14 @@ function(_add_swift_executable_single name) ${SWIFTEXE_SINGLE_DEPENDS}) llvm_update_compile_flags("${name}") - # Convert variables to space-separated strings. - _list_escape_for_shell("${c_compile_flags}" c_compile_flags) - _list_escape_for_shell("${link_flags}" link_flags) - - set_property(TARGET ${name} APPEND_STRING PROPERTY - COMPILE_FLAGS " ${c_compile_flags}") - swift_target_link_search_directories("${name}" "${library_search_directories}") - set_property(TARGET ${name} APPEND_STRING PROPERTY - LINK_FLAGS " ${link_flags}") - set_property(TARGET ${name} APPEND PROPERTY LINK_LIBRARIES ${link_libraries}) + target_compile_options(${name} PRIVATE + ${c_compile_flags}) + target_link_directories(${name} PRIVATE + ${library_search_directories}) + target_link_options(${name} PRIVATE + ${link_flags}) + target_link_libraries(${name} PRIVATE + ${link_libraries}) if (SWIFT_PARALLEL_LINK_JOBS) set_property(TARGET ${name} PROPERTY JOB_POOL_LINK swift_link_job_pool) endif() diff --git a/cmake/modules/SwiftList.cmake b/cmake/modules/SwiftList.cmake index 68708e242f35d..c2b1043ff9ec6 100644 --- a/cmake/modules/SwiftList.cmake +++ b/cmake/modules/SwiftList.cmake @@ -38,15 +38,6 @@ function(_list_add_string_suffix input_list suffix result_var_name) set("${result_var_name}" "${result}" PARENT_SCOPE) endfunction() -function(_list_escape_for_shell input_list result_var_name) - set(result "") - foreach(element ${input_list}) - string(REPLACE " " "\\ " element "${element}") - set(result "${result}${element} ") - endforeach() - set("${result_var_name}" "${result}" PARENT_SCOPE) -endfunction() - function(list_replace input_list old new) set(replaced_list) foreach(item ${${input_list}}) diff --git a/lib/SymbolGraphGen/CMakeLists.txt b/lib/SymbolGraphGen/CMakeLists.txt index 2780330587fb2..64f34c90254b7 100644 --- a/lib/SymbolGraphGen/CMakeLists.txt +++ b/lib/SymbolGraphGen/CMakeLists.txt @@ -7,7 +7,7 @@ add_swift_host_library(swiftSymbolGraphGen STATIC SymbolGraphGen.cpp SymbolGraphASTWalker.cpp) -target_link_libraries(swiftSymbolGraphGen +target_link_libraries(swiftSymbolGraphGen PRIVATE swiftAST swiftFrontend swiftMarkup) diff --git a/tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake b/tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake index b33c54d66f70b..4f88629516aa4 100644 --- a/tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake +++ b/tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake @@ -70,17 +70,15 @@ function(add_sourcekit_default_compiler_flags target) LINK_LIBRARIES_VAR_NAME link_libraries LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories) - # Convert variables to space-separated strings. - _list_escape_for_shell("${c_compile_flags}" c_compile_flags) - _list_escape_for_shell("${link_flags}" link_flags) - # Set compilation and link flags. - set_property(TARGET "${target}" APPEND_STRING PROPERTY - COMPILE_FLAGS " ${c_compile_flags} -fblocks") - set_property(TARGET "${target}" APPEND_STRING PROPERTY - LINK_FLAGS " ${link_flags}") - set_property(TARGET "${target}" APPEND PROPERTY LINK_LIBRARIES ${link_libraries}) - swift_target_link_search_directories("${target}" "${library_search_directories}") + target_compile_options(${target} PRIVATE + -fblocks) + target_link_options(${target} PRIVATE + ${link_flags}) + target_link_directories(${target} PRIVATE + ${library_search_directories}) + target_link_libraries(${target} PRIVATE + ${link_libraries}) endfunction() # Add a new SourceKit library.