From ec8c9892a3d511b4aa6fac9e5c4080c9ebc47913 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Tue, 14 Nov 2023 13:41:40 -0800 Subject: [PATCH] build: convert package manifest libraries to static Change `PackageDescription`, `CompilerPluginSupport`, and `PackagePlugin` to static which will enable SPM to avoid having to deal with `Path` alteration to execute the manifest on Windows. This also means that we no longer have to worry about the `DT_RUNPATH`/`LC_RPATH` on Linux and Darwin respectively. --- Package.swift | 2 - Sources/CompilerPluginSupport/CMakeLists.txt | 32 ++----------- Sources/PackageDescription/CMakeLists.txt | 30 ++---------- Sources/PackageLoading/ManifestLoader.swift | 13 +---- Sources/PackagePlugin/CMakeLists.txt | 50 +++++--------------- 5 files changed, 21 insertions(+), 106 deletions(-) diff --git a/Package.swift b/Package.swift index 7c711b0af32..5edb9d0b03f 100644 --- a/Package.swift +++ b/Package.swift @@ -98,12 +98,10 @@ let package = Package( ), .library( name: "PackageDescription", - type: .dynamic, targets: ["PackageDescription", "CompilerPluginSupport"] ), .library( name: "PackagePlugin", - type: .dynamic, targets: ["PackagePlugin"] ), .library( diff --git a/Sources/CompilerPluginSupport/CMakeLists.txt b/Sources/CompilerPluginSupport/CMakeLists.txt index d54ff20186b..9adae83fb8e 100644 --- a/Sources/CompilerPluginSupport/CMakeLists.txt +++ b/Sources/CompilerPluginSupport/CMakeLists.txt @@ -6,45 +6,23 @@ # See http://swift.org/LICENSE.txt for license information # See http://swift.org/CONTRIBUTORS.txt for Swift project authors -add_library(CompilerPluginSupport +add_library(CompilerPluginSupport STATIC TargetExtensions.swift) +target_compile_options(CompilerPluginSupport PRIVATE + $<$:-package-description-version$999.0>) target_link_libraries(CompilerPluginSupport PRIVATE PackageDescription) - -target_compile_options(CompilerPluginSupport PUBLIC - $<$:-package-description-version$999.0>) - -if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) - target_link_options(CompilerPluginSupport PRIVATE - "SHELL:-Xlinker -install_name -Xlinker @rpath/CompilerPluginSupport.dylib") -endif() - set_target_properties(CompilerPluginSupport PROPERTIES Swift_MODULE_NAME CompilerPluginSupport Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - INSTALL_NAME_DIR \\@rpath OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - OUTPUT_NAME CompilerPluginSupport ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI -) - -if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) - target_link_libraries(CompilerPluginSupport PRIVATE - Foundation) - target_link_options(CompilerPluginSupport PRIVATE - "SHELL:-no-toolchain-stdlib-rpath") - set_target_properties(CompilerPluginSupport PROPERTIES - BUILD_WITH_INSTALL_RPATH TRUE - INSTALL_RPATH "$ORIGIN/../../$") -endif() + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI) install(FILES ${CMAKE_BINARY_DIR}/pm/ManifestAPI/CompilerPluginSupport.swiftmodule ${CMAKE_BINARY_DIR}/pm/ManifestAPI/CompilerPluginSupport.swiftdoc - DESTINATION lib/swift/pm/ManifestAPI -) - + DESTINATION lib/swift/pm/ManifestAPI) install(TARGETS CompilerPluginSupport DESTINATION lib/swift/pm/ManifestAPI) diff --git a/Sources/PackageDescription/CMakeLists.txt b/Sources/PackageDescription/CMakeLists.txt index a2eef65315b..08b9c297dba 100644 --- a/Sources/PackageDescription/CMakeLists.txt +++ b/Sources/PackageDescription/CMakeLists.txt @@ -6,7 +6,7 @@ # See http://swift.org/LICENSE.txt for license information # See http://swift.org/CONTRIBUTORS.txt for Swift project authors -add_library(PackageDescription +add_library(PackageDescription STATIC BuildSettings.swift Context.swift ContextModel.swift @@ -22,41 +22,19 @@ add_library(PackageDescription Target.swift Version.swift Version+StringLiteralConvertible.swift) - -target_compile_options(PackageDescription PUBLIC +target_compile_options(PackageDescription PRIVATE $<$:-package-description-version$999.0>) - -if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) - target_link_options(PackageDescription PRIVATE - "SHELL:-Xlinker -install_name -Xlinker @rpath/libPackageDescription.dylib") -endif() - set_target_properties(PackageDescription PROPERTIES Swift_MODULE_NAME PackageDescription Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - INSTALL_NAME_DIR \\@rpath OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - OUTPUT_NAME PackageDescription ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI -) - -if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) - target_link_libraries(PackageDescription PRIVATE - Foundation) - target_link_options(PackageDescription PRIVATE - "SHELL:-no-toolchain-stdlib-rpath") - set_target_properties(PackageDescription PROPERTIES - BUILD_WITH_INSTALL_RPATH TRUE - INSTALL_RPATH "$ORIGIN/../../$") -endif() + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI) install(FILES ${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftmodule ${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftdoc - DESTINATION lib/swift/pm/ManifestAPI -) - + DESTINATION lib/swift/pm/ManifestAPI) install(TARGETS PackageDescription DESTINATION lib/swift/pm/ManifestAPI) diff --git a/Sources/PackageLoading/ManifestLoader.swift b/Sources/PackageLoading/ManifestLoader.swift index 73d509ae3dc..5cfa4b10864 100644 --- a/Sources/PackageLoading/ManifestLoader.swift +++ b/Sources/PackageLoading/ManifestLoader.swift @@ -811,11 +811,6 @@ public final class ManifestLoader: ManifestLoaderProtocol { "-L", runtimePath.pathString, "-lPackageDescription", ] -#if !os(Windows) - // -rpath argument is not supported on Windows, - // so we add runtimePath to PATH when executing the manifest instead - cmd += ["-Xlinker", "-rpath", "-Xlinker", runtimePath.pathString] -#endif } // Use the same minimum deployment target as the PackageDescription library (with a fallback to the default host triple). @@ -963,14 +958,8 @@ public final class ManifestLoader: ManifestLoaderProtocol { ) } - var environment = ProcessEnv.vars - #if os(Windows) - let windowsPathComponent = runtimePath.pathString.replacingOccurrences(of: "/", with: "\\") - environment["Path"] = "\(windowsPathComponent);\(environment["Path"] ?? "")" - #endif - let cleanupAfterRunning = cleanupIfError.delay() - TSCBasic.Process.popen(arguments: cmd, environment: environment, queue: callbackQueue) { result in + TSCBasic.Process.popen(arguments: cmd, environment: ProcessEnv.vars, queue: callbackQueue) { result in dispatchPrecondition(condition: .onQueue(callbackQueue)) defer { cleanupAfterRunning.perform() } diff --git a/Sources/PackagePlugin/CMakeLists.txt b/Sources/PackagePlugin/CMakeLists.txt index ac30db77e1a..77c573f6fec 100644 --- a/Sources/PackagePlugin/CMakeLists.txt +++ b/Sources/PackagePlugin/CMakeLists.txt @@ -6,7 +6,7 @@ # See http://swift.org/LICENSE.txt for license information # See http://swift.org/CONTRIBUTORS.txt for Swift project authors -add_library(PackagePlugin SHARED +add_library(PackagePlugin STATIC ArgumentExtractor.swift Command.swift Context.swift @@ -20,54 +20,26 @@ add_library(PackagePlugin SHARED PluginMessages.swift Protocols.swift Utilities.swift) - -target_compile_options(PackagePlugin PUBLIC - $<$:-package-description-version$999.0>) -target_compile_options(PackagePlugin PUBLIC +target_compile_options(PackagePlugin PRIVATE + $<$:-package-description-version$999.0> $<$:-enable-library-evolution>) - -if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) - set(SWIFT_INTERFACE_PATH ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftinterface) - target_compile_options(PackagePlugin PUBLIC - $<$:-emit-module-interface-path$${SWIFT_INTERFACE_PATH}>) - target_link_options(PackagePlugin PRIVATE - "SHELL:-Xlinker -install_name -Xlinker @rpath/libPackagePlugin.dylib") -endif() - set_target_properties(PackagePlugin PROPERTIES Swift_MODULE_NAME PackagePlugin Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI - INSTALL_NAME_DIR \\@rpath OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI - OUTPUT_NAME PackagePlugin ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI -) - -if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) - target_link_libraries(PackagePlugin PRIVATE - Foundation) - target_link_options(PackagePlugin PRIVATE - "SHELL:-no-toolchain-stdlib-rpath") - set_target_properties(PackagePlugin PROPERTIES - BUILD_WITH_INSTALL_RPATH TRUE - INSTALL_RPATH "$ORIGIN/../../$") -endif() + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/PluginAPI) if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) - install(FILES - ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftinterface - ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftdoc - DESTINATION lib/swift/pm/PluginAPI - ) -else() - install(FILES - ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftmodule - ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftdoc - DESTINATION lib/swift/pm/PluginAPI - ) + set(SWIFT_INTERFACE_PATH ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftinterface) + target_compile_options(PackagePlugin PRIVATE + $<$:-emit-module-interface-path$${SWIFT_INTERFACE_PATH}>) endif() +install(FILES + ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swift$,interface,module> + ${CMAKE_BINARY_DIR}/pm/PluginAPI/PackagePlugin.swiftdoc + DESTINATION lib/swift/pm/PluginAPI) install(TARGETS PackagePlugin DESTINATION lib/swift/pm/PluginAPI)