Skip to content

Unify the two versions of PackageDescription into a single one using availability annotations instead of compile conditionals #3464

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While unwinding the loop I also made this conform to the 2-space indentation that we seem to be using for CMakefiles.

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)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than relying on a directory named after the version number to keep the library apart from the PackagePlugin library, I added a subdirectory here named after the subsystem for which this is an API. The plugin one is called PluginAPI, and I can imagine that we'd have additional ones as needed.

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
Loading