From bd81fb8e137f28b338b6d0c9d561b3fbb053f179 Mon Sep 17 00:00:00 2001 From: Butta Date: Mon, 26 Oct 2020 23:13:22 +0530 Subject: [PATCH 1/3] Revert "Revert "[build-script] Move --native-{clang,llvm,swift}-tools-path flags into the Python build-script"" Also, fix two places where the LLVM path was wrongly employed to set up clang, and use the Swift path in install_toolchain_path(). --- stdlib/CMakeLists.txt | 8 ++++---- unittests/runtime/CMakeLists.txt | 8 ++++---- utils/build-script | 12 ++++++++++++ utils/build_swift/build_swift/driver_arguments.py | 9 +++++++++ utils/build_swift/tests/expected_options.py | 6 ++++++ .../swift_build_support/products/product.py | 5 ++++- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/stdlib/CMakeLists.txt b/stdlib/CMakeLists.txt index edf7c19f4b7a6..91d9f4c28a515 100644 --- a/stdlib/CMakeLists.txt +++ b/stdlib/CMakeLists.txt @@ -112,11 +112,11 @@ else() # If we use Clang-cl or MSVC, CMake provides default compiler and linker flags that are incompatible # with the frontend of Clang or Clang++. if(SWIFT_COMPILER_IS_MSVC_LIKE) - set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang-cl") - set(CMAKE_C_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang-cl") + set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang-cl") + set(CMAKE_C_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang-cl") else() - set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang++") - set(CMAKE_C_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang") + set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang++") + set(CMAKE_C_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang") endif() if(CMAKE_C_COMPILER_LAUNCHER MATCHES ".*distcc") diff --git a/unittests/runtime/CMakeLists.txt b/unittests/runtime/CMakeLists.txt index 60f9944e1e64f..2ca86bf2b4070 100644 --- a/unittests/runtime/CMakeLists.txt +++ b/unittests/runtime/CMakeLists.txt @@ -13,11 +13,11 @@ if(("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "${SWIFT_PRIMARY_VARIANT_SDK}") AND # If we use Clang-cl or MSVC, CMake provides default compiler and linker flags that are incompatible # with the frontend of Clang or Clang++. if(SWIFT_COMPILER_IS_MSVC_LIKE) - set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang-cl") - set(CMAKE_C_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang-cl") + set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang-cl") + set(CMAKE_C_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang-cl") else() - set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang++") - set(CMAKE_C_COMPILER "${SWIFT_NATIVE_LLVM_TOOLS_PATH}/clang") + set(CMAKE_CXX_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang++") + set(CMAKE_C_COMPILER "${SWIFT_NATIVE_CLANG_TOOLS_PATH}/clang") endif() if(CMAKE_C_COMPILER_LAUNCHER MATCHES ".*distcc") diff --git a/utils/build-script b/utils/build-script index ab9809b1351c8..f544478b2a57b 100755 --- a/utils/build-script +++ b/utils/build-script @@ -707,6 +707,18 @@ class BuildScriptInvocation(object): impl_args += [ "--host-libtool", toolchain.libtool, ] + if args.native_clang_tools_path is not None: + impl_args += [ + "--native-clang-tools-path=%s" % args.native_clang_tools_path + ] + if args.native_llvm_tools_path is not None: + impl_args += [ + "--native-llvm-tools-path=%s" % args.native_llvm_tools_path + ] + if args.native_swift_tools_path is not None: + impl_args += [ + "--native-swift-tools-path=%s" % args.native_swift_tools_path + ] # If we have extra_swift_args, combine all of them together and then # add them as one command. diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 28a3ec0e6ab26..aab24712b8011 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -374,6 +374,15 @@ def create_argument_parser(): option('--host-cxx', store_path(executable=True), help='the absolute path to CXX, the "clang++" compiler for the ' 'host platform. Default is auto detected.') + option('--native-swift-tools-path', store_path, + help='the path to a directory that contains prebuilt Swift tools ' + 'that are executable on the host platform') + option('--native-clang-tools-path', store_path, + help='the path to a directory that contains prebuilt Clang tools ' + 'that are executable on the host platform') + option('--native-llvm-tools-path', store_path, + help='the path to a directory that contains prebuilt LLVM tools ' + 'that are executable on the host platform') option('--cmake-c-launcher', store_path(executable=True), default=os.environ.get('C_COMPILER_LAUNCHER', None), help='the absolute path to set CMAKE_C_COMPILER_LAUNCHER') diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index 8f13cca65b9c4..9ecfc47143123 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -189,6 +189,9 @@ 'lto_type': None, 'maccatalyst': False, 'maccatalyst_ios_tests': False, + 'native_clang_tools_path': None, + 'native_llvm_tools_path': None, + 'native_swift_tools_path': None, 'dump_config': False, 'show_sdks': False, 'skip_build': False, @@ -653,6 +656,9 @@ class BuildScriptImplOption(_BaseOption): PathOption('--install-symroot'), PathOption('--install-destdir'), EnableOption('--install-all'), + PathOption('--native-clang-tools-path'), + PathOption('--native-llvm-tools-path'), + PathOption('--native-swift-tools-path'), PathOption('--symbols-package'), PathOption('--cmake-c-launcher'), PathOption('--cmake-cxx-launcher'), diff --git a/utils/swift_build_support/swift_build_support/products/product.py b/utils/swift_build_support/swift_build_support/products/product.py index ba6f673bb6c99..075b934d10ac1 100644 --- a/utils/swift_build_support/swift_build_support/products/product.py +++ b/utils/swift_build_support/swift_build_support/products/product.py @@ -167,8 +167,11 @@ def install_toolchain_path(self, host_target): """toolchain_path() -> string Returns the path to the toolchain that is being created as part of this - build. + build, or to a native prebuilt toolchain that was passed in. """ + if self.args.native_swift_tools_path is not None: + return os.path.split(self.args.native_swift_tools_path)[0] + install_destdir = self.args.install_destdir if self.args.cross_compile_hosts: build_root = os.path.dirname(self.build_dir) From c74884ce307a59df7e62620ba6cd0f499565d7ce Mon Sep 17 00:00:00 2001 From: Butta Date: Sun, 8 Nov 2020 13:25:13 +0530 Subject: [PATCH 2/3] [build] Make it possible to actually build the stdlib with a prebuilt clang --- CMakeLists.txt | 8 ++++++++ stdlib/cmake/modules/AddSwiftStdlib.cmake | 3 ++- stdlib/public/SwiftShims/CMakeLists.txt | 3 ++- utils/build-presets.ini | 5 ++--- utils/build-script-impl | 7 ------- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8be6f4a7abd76..1996988f1cc12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -487,6 +487,14 @@ else() set(SWIFT_CROSS_COMPILING TRUE) endif() +# Check if a prebuilt clang path was passed in, as this variable will be +# assigned if not, in SwiftSharedCMakeConfig. +if("${SWIFT_NATIVE_CLANG_TOOLS_PATH}" STREQUAL "") + set(SWIFT_PREBUILT_CLANG FALSE) +else() + set(SWIFT_PREBUILT_CLANG TRUE) +endif() + include(SwiftSharedCMakeConfig) # NOTE: We include this before SwiftComponents as it relies on some LLVM CMake diff --git a/stdlib/cmake/modules/AddSwiftStdlib.cmake b/stdlib/cmake/modules/AddSwiftStdlib.cmake index 2a6e1d1df0714..d5df9c57dd338 100644 --- a/stdlib/cmake/modules/AddSwiftStdlib.cmake +++ b/stdlib/cmake/modules/AddSwiftStdlib.cmake @@ -1669,7 +1669,8 @@ function(add_swift_target_library name) list(APPEND SWIFTLIB_SWIFT_COMPILE_FLAGS "-warn-implicit-overrides") endif() - if(NOT SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER AND NOT BUILD_STANDALONE) + if(NOT SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER AND NOT BUILD_STANDALONE AND + NOT SWIFT_PREBUILT_CLANG) list(APPEND SWIFTLIB_DEPENDS clang) endif() diff --git a/stdlib/public/SwiftShims/CMakeLists.txt b/stdlib/public/SwiftShims/CMakeLists.txt index 926020372fb2e..5ee8a9c920697 100644 --- a/stdlib/public/SwiftShims/CMakeLists.txt +++ b/stdlib/public/SwiftShims/CMakeLists.txt @@ -111,7 +111,8 @@ endif() # First extract the "version" used for Clang's resource directory. string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION "${LLVM_PACKAGE_VERSION}") -if(NOT SWIFT_INCLUDE_TOOLS AND SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER) +if(NOT SWIFT_INCLUDE_TOOLS AND + (SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER OR SWIFT_PREBUILT_CLANG)) if(SWIFT_COMPILER_IS_MSVC_LIKE) execute_process(COMMAND ${CMAKE_C_COMPILER} /clang:-print-resource-dir OUTPUT_VARIABLE clang_headers_location diff --git a/utils/build-presets.ini b/utils/build-presets.ini index 5330b5acba186..dcba1e6d7b741 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -2283,10 +2283,9 @@ skip-build-cmark skip-build-benchmarks skip-test-cmark -# This triggers the stdlib standalone build: Don't build tools (the compiler), -# assume we are working with the host compiler. +# This triggers the stdlib standalone build: don't build the native tools from +# scratch, ie the compiler. build-swift-tools=0 -build-runtime-with-host-compiler=1 # Then set the paths to our native tools. If compiling against a toolchain, # these should all be the ./usr/bin directory. diff --git a/utils/build-script-impl b/utils/build-script-impl index 268d23de155af..7ac53c1e5a913 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -1485,13 +1485,6 @@ for host in "${ALL_HOSTS[@]}"; do fi fi - if [[ "${NATIVE_CLANG_TOOLS_PATH}" ]] ; then - common_cmake_options_host+=( - -DCMAKE_C_COMPILER="${NATIVE_CLANG_TOOLS_PATH}/clang" - -DCMAKE_CXX_COMPILER="${NATIVE_CLANG_TOOLS_PATH}/clang++" - ) - fi - llvm_cmake_options=( "${llvm_cmake_options[@]}" -DCMAKE_INSTALL_PREFIX:PATH="$(get_host_install_prefix ${host})" From 934823a99c39f155f113abea8f9b5080164457b7 Mon Sep 17 00:00:00 2001 From: Butta Date: Wed, 11 Nov 2020 09:25:35 +0530 Subject: [PATCH 3/3] [build] Replace SWIFT_CROSS_COMPILING with SWIFT_PREBUILT_CLANG --- CMakeLists.txt | 6 ------ cmake/modules/SwiftSharedCMakeConfig.cmake | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1996988f1cc12..77e81153a2322 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -481,12 +481,6 @@ if(SWIFT_PATH_TO_CMARK_BUILD) endif() message(STATUS "") -if("${SWIFT_NATIVE_LLVM_TOOLS_PATH}" STREQUAL "") - set(SWIFT_CROSS_COMPILING FALSE) -else() - set(SWIFT_CROSS_COMPILING TRUE) -endif() - # Check if a prebuilt clang path was passed in, as this variable will be # assigned if not, in SwiftSharedCMakeConfig. if("${SWIFT_NATIVE_CLANG_TOOLS_PATH}" STREQUAL "") diff --git a/cmake/modules/SwiftSharedCMakeConfig.cmake b/cmake/modules/SwiftSharedCMakeConfig.cmake index c4c15084fe902..9ee0865658917 100644 --- a/cmake/modules/SwiftSharedCMakeConfig.cmake +++ b/cmake/modules/SwiftSharedCMakeConfig.cmake @@ -58,7 +58,7 @@ macro(swift_common_standalone_build_config_llvm product) fix_imported_targets_for_xcode("${LLVM_EXPORTED_TARGETS}") endif() - if(NOT CMAKE_CROSSCOMPILING AND NOT SWIFT_CROSS_COMPILING) + if(NOT CMAKE_CROSSCOMPILING) set(${product}_NATIVE_LLVM_TOOLS_PATH "${LLVM_TOOLS_BINARY_DIR}") endif() @@ -159,7 +159,7 @@ endmacro() macro(swift_common_standalone_build_config_clang product) find_package(Clang CONFIG REQUIRED NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) - if (NOT CMAKE_CROSSCOMPILING) + if (NOT CMAKE_CROSSCOMPILING AND NOT SWIFT_PREBUILT_CLANG) set(${product}_NATIVE_CLANG_TOOLS_PATH "${LLVM_TOOLS_BINARY_DIR}") endif()