From dbd454798b7e6cde284103aef93a4eec75a2a43b Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 16 Oct 2017 17:37:41 -0700 Subject: [PATCH 1/4] build: tweak whitespace (NFC) This makes it easier to read and see what is going on. This made it easier to see what parameters were being passed when debugging the windows cross-compilation dependencies. --- cmake/modules/AddSwift.cmake | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index 53081bd1ca2d5..e5eeaab083c95 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -1681,12 +1681,14 @@ function(add_swift_library name) set(codesign_arg CODESIGN) endif() precondition(THIN_INPUT_TARGETS) - _add_swift_lipo_target( - SDK ${sdk} - TARGET ${lipo_target} - OUTPUT ${UNIVERSAL_LIBRARY_NAME} - ${codesign_arg} - ${THIN_INPUT_TARGETS}) + _add_swift_lipo_target(SDK + ${sdk} + TARGET + ${lipo_target} + OUTPUT + ${UNIVERSAL_LIBRARY_NAME} + ${codesign_arg} + ${THIN_INPUT_TARGETS}) # Cache universal libraries for dependency purposes set(UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR} @@ -1732,11 +1734,13 @@ function(add_swift_library name) "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static") set(UNIVERSAL_LIBRARY_NAME "${SWIFTSTATICLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}") - _add_swift_lipo_target( - SDK ${sdk} - TARGET ${lipo_target_static} - OUTPUT "${UNIVERSAL_LIBRARY_NAME}" - ${THIN_INPUT_TARGETS_STATIC}) + _add_swift_lipo_target(SDK + ${sdk} + TARGET + ${lipo_target_static} + OUTPUT + "${UNIVERSAL_LIBRARY_NAME}" + ${THIN_INPUT_TARGETS_STATIC}) swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}" FILES "${UNIVERSAL_LIBRARY_NAME}" DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${resource_dir_sdk_subdir}" From dcdd23fb18e1b0c604a02ec7d9e95a8271e9ee19 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 16 Oct 2017 17:39:46 -0700 Subject: [PATCH 2/4] build: filter out a filtering list, 80-col (NFC) Rather than check the two names individually use a `IN_LIST` to make it simpler to reason about. Wrap another conditional to 80-columns. NFC. --- cmake/modules/AddSwift.cmake | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index e5eeaab083c95..68b47d1936ccc 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -1753,14 +1753,18 @@ function(add_swift_library name) # Add Swift standard library targets as dependencies to the top-level # convenience target. if(SWIFTLIB_TARGET_LIBRARY) + set(FILTERED_UNITTESTS + swiftStdlibCollectionUnittest + swiftStdlibUnicodeUnittest) + foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES}) set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") - if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND TARGET "swift-test-stdlib${VARIANT_SUFFIX}") + if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND + TARGET "swift-test-stdlib${VARIANT_SUFFIX}") add_dependencies("swift-stdlib${VARIANT_SUFFIX}" ${lipo_target} ${lipo_target_static}) - if((NOT "${name}" STREQUAL "swiftStdlibCollectionUnittest") AND - (NOT "${name}" STREQUAL "swiftStdlibUnicodeUnittest")) + if(NOT "${name}" IN_LIST FILTERED_UNITTESTS) add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" ${lipo_target} ${lipo_target_static}) From 784c98bc194fd50e7ab9f4e3f72b6e21f36b8e97 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 16 Oct 2017 17:41:41 -0700 Subject: [PATCH 3/4] build: depend on the architecture variant on non-MachO For the non-MachO targets, which do not have the concept of fat binaries, depend explicitly on the architecture variant. This is particularly useful for Windows which permits cross-compilation and cross-targeting of all the variants even though it does not support fat binaries. This allows us to build a single variant of the windows standard library at a time in the case that we would like to build a subset of the targets. --- cmake/modules/AddSwift.cmake | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index 68b47d1936ccc..568a40418c89e 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -1636,8 +1636,11 @@ function(add_swift_library name) # Add dependencies on the (not-yet-created) custom lipo target. foreach(DEP ${SWIFTLIB_LINK_LIBRARIES}) if (NOT "${DEP}" STREQUAL "icucore") - add_dependencies(${VARIANT_NAME} - "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}") + if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "MACHO") + add_dependencies(${VARIANT_NAME} "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}") + else() + add_dependencies(${VARIANT_NAME} "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") + endif() endif() endforeach() @@ -1761,13 +1764,23 @@ function(add_swift_library name) set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND TARGET "swift-test-stdlib${VARIANT_SUFFIX}") + if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "MACHO") + set(shared_lipo_target ${lipo_target}) + set(static_lipo_target ${lipo_target_static}) + else() + set(shared_lipo_target ${lipo_target}-${arch}) + if(TARGET "${lipo_target_static}") + set(static_lipo_target ${lipo_target_static}-${arch}) + endif() + endif() + add_dependencies("swift-stdlib${VARIANT_SUFFIX}" - ${lipo_target} - ${lipo_target_static}) + ${shared_lipo_target} + ${static_lipo_target}) if(NOT "${name}" IN_LIST FILTERED_UNITTESTS) add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" - ${lipo_target} - ${lipo_target_static}) + ${shared_lipo_target} + ${static_lipo_target}) endif() endif() endforeach() From ff5d6355b83cda030bc36dc8b25fffb746e69b31 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 16 Oct 2017 17:43:17 -0700 Subject: [PATCH 4/4] build: strip the lipo'ed target placeholder When building non-MachO targets, there is no support for fat binaries. As a result, the lipo target does nothing. Because we do not support variant builds for ELF targets, this has not resulted in any issues. However, the PE/COFF (Windows) target suppots multiple variants. In such a case, the "lipo" target will copy a number of builds, leaving the binary to be an arbitrary variant. Instead, prefer to always use the architectural variant path. In place, create an empty target which serves as a means of collecting dependencies. --- cmake/modules/AddSwift.cmake | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index 568a40418c89e..54481b1ed9322 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -486,11 +486,8 @@ function(_add_swift_lipo_target) DEPENDS ${source_targets}) else() # We don't know how to create fat binaries for other platforms. - add_custom_command_target(unused_var - COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${source_binaries}" "${LIPO_OUTPUT}" - CUSTOM_TARGET_NAME "${LIPO_TARGET}" - OUTPUT "${LIPO_OUTPUT}" - DEPENDS ${source_targets}) + add_custom_target(${LIPO_TARGET}) + add_dependencies(${LIPO_TARGET} ${source_targets}) endif() endfunction()