Skip to content

Commit

Permalink
Unify PackageDescription 4.0 and 4.2+ into a single library by using …
Browse files Browse the repository at this point in the history
…availability annotations instead of #if

Replace the compile-time conditionals in PackageDescription with availability annotations.  This lets us build a single PackageDescription, which will make the build scripts easier (with the goal of being able to build it entirely from the package itself).

As part of this we also clean up the runtime library subdirectories.  Until now we've had PackagePlugin directly in the runtime library directory, and PackageDescription under subdirectories called "4" and "4_2".  This has sufficed in keeping PackageDescription and PackagePlugin in separate directories (so that a manifest or plugin script can't import both).

This needs to be changed now that there is only one version of a PackageDescription, and anyway it's time to clean this up.  So as part of this we also establish two subdirectories for the runtime APIs: "ManifestAPI" and "PluginAPI".  If we add more kinds of scripts, we can then add new subdirectories here.

rdar://77441062
  • Loading branch information
abertelrud committed May 3, 2021
1 parent 79152ec commit 2d64d68
Show file tree
Hide file tree
Showing 13 changed files with 161 additions and 308 deletions.
22 changes: 14 additions & 8 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -113,19 +113,25 @@ let package = Package(
),
],
targets: [
// The `PackageDescription` targets define the API which is available to
// the `Package.swift` manifest files. We build the latest API version
// here which is used when building and running swiftpm without the
// bootstrap script.
// The `PackageDescription` target provides the API that is available
// to `Package.swift` manifests. Here we build a debug version of the
// library; the bootstrap scripts build the deployable version.
.target(
/** Package Definition API */
name: "PackageDescription",
swiftSettings: [
.define("PACKAGE_DESCRIPTION_4_2"),
.unsafeFlags(["-package-description-version", "999.0"]),
.unsafeFlags(["-enable-library-evolution"])
]),


// The `PackagePlugin` target provides the API that is available to
// plugin scripts. Here we build a debug version of the library; the
// bootstrap scripts build the deployable version.
.target(
name: "PackagePlugin"),
name: "PackagePlugin",
swiftSettings: [
.unsafeFlags(["-package-description-version", "999.0"]),
.unsafeFlags(["-enable-library-evolution"])
]),

// MARK: SwiftPM specific support libraries

Expand Down
122 changes: 60 additions & 62 deletions Sources/PackageDescription/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,75 +1,73 @@
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
# Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors

foreach(PACKAGE_DESCRIPTION_VERSION 4 4_2)
add_library(PD${PACKAGE_DESCRIPTION_VERSION}
BuildSettings.swift
LanguageStandardSettings.swift
PackageDescription.swift
PackageDependency.swift
PackageRequirement.swift
Product.swift
Resource.swift
SupportedPlatforms.swift
Target.swift
Version.swift
Version+StringLiteralConvertible.swift)
add_library(PackageDescription
BuildSettings.swift
LanguageStandardSettings.swift
PackageDescription.swift
PackageDependency.swift
PackageRequirement.swift
Product.swift
Resource.swift
SupportedPlatforms.swift
Target.swift
Version.swift
Version+StringLiteralConvertible.swift)

target_compile_definitions(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
PACKAGE_DESCRIPTION_${PACKAGE_DESCRIPTION_VERSION})
target_compile_options(PackageDescription PUBLIC
$<$<COMPILE_LANGUAGE:Swift>:-package-description-version$<SEMICOLON>999.0>)
target_compile_options(PackageDescription PUBLIC
$<$<COMPILE_LANGUAGE:Swift>:-enable-library-evolution>)

if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
set(SWIFT_INTERFACE_PATH ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftinterface)
target_compile_options(PD${PACKAGE_DESCRIPTION_VERSION} PUBLIC
$<$<COMPILE_LANGUAGE:Swift>:-enable-library-evolution>)
target_compile_options(PD${PACKAGE_DESCRIPTION_VERSION} PUBLIC
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${SWIFT_INTERFACE_PATH}>)
target_link_options(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
"SHELL:-Xlinker -install_name -Xlinker @rpath/libPackageDescription.dylib")
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
set(SWIFT_INTERFACE_PATH ${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftinterface)
target_compile_options(PackageDescription PUBLIC
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${SWIFT_INTERFACE_PATH}>)
target_link_options(PackageDescription PRIVATE
"SHELL:-Xlinker -install_name -Xlinker @rpath/libPackageDescription.dylib")
endif()

set_target_properties(PD${PACKAGE_DESCRIPTION_VERSION} PROPERTIES
Swift_MODULE_NAME PackageDescription
Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
INSTALL_NAME_DIR \\@rpath
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
OUTPUT_NAME PackageDescription
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
)
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)
if(Foundation_FOUND)
target_link_libraries(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
Foundation)
endif()
target_link_options(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
"SHELL:-no-toolchain-stdlib-rpath")
set_target_properties(PD${PACKAGE_DESCRIPTION_VERSION} PROPERTIES
BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "$ORIGIN/../../$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
endif()
if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
if(Foundation_FOUND)
target_link_libraries(PackageDescription PRIVATE
Foundation)
endif()
target_link_options(PackageDescription PRIVATE
"SHELL:-no-toolchain-stdlib-rpath")
set_target_properties(PackageDescription PROPERTIES
BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "$ORIGIN/../../$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
endif()

if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
install(FILES
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftinterface
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftdoc
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION}
)
else()
install(FILES
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftmodule
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftdoc
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION}
)
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
install(FILES
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftinterface
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftdoc
DESTINATION lib/swift/pm/ManifestAPI
)
else()
install(FILES
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftmodule
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftdoc
DESTINATION lib/swift/pm/ManifestAPI
)
endif()

install(TARGETS PD${PACKAGE_DESCRIPTION_VERSION}
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION})
endforeach()
install(TARGETS PackageDescription
DESTINATION lib/swift/pm/ManifestAPI)
2 changes: 0 additions & 2 deletions Sources/PackageDescription/LanguageStandardSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,6 @@ public enum CXXLanguageStandard: String, Encodable {
case gnucxx20 = "gnu++20"
}

#if !PACKAGE_DESCRIPTION_4
/// The version of the Swift language to use for compiling Swift sources in the package.
public enum SwiftVersion {
@available(_PackageDescription, introduced: 4, obsoleted: 5)
Expand Down Expand Up @@ -187,4 +186,3 @@ extension SwiftVersion: Encodable {
try container.encode(value)
}
}
#endif
22 changes: 2 additions & 20 deletions Sources/PackageDescription/PackageDependency.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,7 @@ extension Package.Dependency {
url: String,
_ range: Range<Version>
) -> Package.Dependency {
#if PACKAGE_DESCRIPTION_4
return .init(name: nil, url: url, requirement: .rangeItem(range))
#else
return .init(name: nil, url: url, requirement: ._rangeItem(range))
#endif
}

/// Adds a package dependency starting with a specific minimum version, up to
Expand All @@ -172,11 +168,7 @@ extension Package.Dependency {
url: String,
_ range: Range<Version>
) -> Package.Dependency {
#if PACKAGE_DESCRIPTION_4
return .init(name: name, url: url, requirement: .rangeItem(range))
#else
return .init(name: name, url: url, requirement: ._rangeItem(range))
#endif
}

/// Adds a package dependency starting with a specific minimum version, going
Expand All @@ -202,11 +194,7 @@ extension Package.Dependency {
upper.major, upper.minor, upper.patch + 1,
prereleaseIdentifiers: upper.prereleaseIdentifiers,
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
#if PACKAGE_DESCRIPTION_4
return .init(name: nil, url: url, requirement: .rangeItem(range.lowerBound..<upperBound))
#else
return .init(name: nil, url: url, requirement: ._rangeItem(range.lowerBound..<upperBound))
#endif
}

/// Adds a package dependency starting with a specific minimum version, going
Expand All @@ -233,14 +221,9 @@ extension Package.Dependency {
upper.major, upper.minor, upper.patch + 1,
prereleaseIdentifiers: upper.prereleaseIdentifiers,
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
#if PACKAGE_DESCRIPTION_4
return .init(name: name, url: url, requirement: .rangeItem(range.lowerBound..<upperBound))
#else
return .init(name: name, url: url, requirement: ._rangeItem(range.lowerBound..<upperBound))
#endif
}

#if !PACKAGE_DESCRIPTION_4
/// Adds a package dependency to a local package on the filesystem.
///
/// The Swift Package Manager uses the package dependency as-is
Expand All @@ -253,7 +236,7 @@ extension Package.Dependency {
public static func package(
path: String
) -> Package.Dependency {
return .init(name: nil, url: path, requirement: ._localPackageItem)
return .init(name: nil, url: path, requirement: .localPackageItem)
}

/// Adds a package dependency to a local package on the filesystem.
Expand All @@ -271,9 +254,8 @@ extension Package.Dependency {
name: String? = nil,
path: String
) -> Package.Dependency {
return .init(name: name, url: path, requirement: ._localPackageItem)
return .init(name: name, url: path, requirement: .localPackageItem)
}
#endif
}

// Mark common APIs used by mistake as unavailable to provide better error messages.
Expand Down

0 comments on commit 2d64d68

Please sign in to comment.