Skip to content

Commit 2d64d68

Browse files
committed
Unify PackageDescription 4.0 and 4.2+ into a single library by using 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
1 parent 79152ec commit 2d64d68

File tree

13 files changed

+161
-308
lines changed

13 files changed

+161
-308
lines changed

Package.swift

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,25 @@ let package = Package(
113113
),
114114
],
115115
targets: [
116-
// The `PackageDescription` targets define the API which is available to
117-
// the `Package.swift` manifest files. We build the latest API version
118-
// here which is used when building and running swiftpm without the
119-
// bootstrap script.
116+
// The `PackageDescription` target provides the API that is available
117+
// to `Package.swift` manifests. Here we build a debug version of the
118+
// library; the bootstrap scripts build the deployable version.
120119
.target(
121-
/** Package Definition API */
122120
name: "PackageDescription",
123121
swiftSettings: [
124-
.define("PACKAGE_DESCRIPTION_4_2"),
122+
.unsafeFlags(["-package-description-version", "999.0"]),
123+
.unsafeFlags(["-enable-library-evolution"])
125124
]),
126-
125+
126+
// The `PackagePlugin` target provides the API that is available to
127+
// plugin scripts. Here we build a debug version of the library; the
128+
// bootstrap scripts build the deployable version.
127129
.target(
128-
name: "PackagePlugin"),
130+
name: "PackagePlugin",
131+
swiftSettings: [
132+
.unsafeFlags(["-package-description-version", "999.0"]),
133+
.unsafeFlags(["-enable-library-evolution"])
134+
]),
129135

130136
// MARK: SwiftPM specific support libraries
131137

Lines changed: 60 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,73 @@
11
# This source file is part of the Swift.org open source project
22
#
3-
# Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
3+
# Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
44
# Licensed under Apache License v2.0 with Runtime Library Exception
55
#
66
# See http://swift.org/LICENSE.txt for license information
77
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors
88

9-
foreach(PACKAGE_DESCRIPTION_VERSION 4 4_2)
10-
add_library(PD${PACKAGE_DESCRIPTION_VERSION}
11-
BuildSettings.swift
12-
LanguageStandardSettings.swift
13-
PackageDescription.swift
14-
PackageDependency.swift
15-
PackageRequirement.swift
16-
Product.swift
17-
Resource.swift
18-
SupportedPlatforms.swift
19-
Target.swift
20-
Version.swift
21-
Version+StringLiteralConvertible.swift)
9+
add_library(PackageDescription
10+
BuildSettings.swift
11+
LanguageStandardSettings.swift
12+
PackageDescription.swift
13+
PackageDependency.swift
14+
PackageRequirement.swift
15+
Product.swift
16+
Resource.swift
17+
SupportedPlatforms.swift
18+
Target.swift
19+
Version.swift
20+
Version+StringLiteralConvertible.swift)
2221

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

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

36-
set_target_properties(PD${PACKAGE_DESCRIPTION_VERSION} PROPERTIES
37-
Swift_MODULE_NAME PackageDescription
38-
Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
39-
INSTALL_NAME_DIR \\@rpath
40-
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
41-
OUTPUT_NAME PackageDescription
42-
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
43-
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
44-
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}
45-
)
35+
set_target_properties(PackageDescription PROPERTIES
36+
Swift_MODULE_NAME PackageDescription
37+
Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI
38+
INSTALL_NAME_DIR \\@rpath
39+
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI
40+
OUTPUT_NAME PackageDescription
41+
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI
42+
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI
43+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pm/ManifestAPI
44+
)
4645

47-
if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
48-
if(Foundation_FOUND)
49-
target_link_libraries(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
50-
Foundation)
51-
endif()
52-
target_link_options(PD${PACKAGE_DESCRIPTION_VERSION} PRIVATE
53-
"SHELL:-no-toolchain-stdlib-rpath")
54-
set_target_properties(PD${PACKAGE_DESCRIPTION_VERSION} PROPERTIES
55-
BUILD_WITH_INSTALL_RPATH TRUE
56-
INSTALL_RPATH "$ORIGIN/../../$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
57-
endif()
46+
if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
47+
if(Foundation_FOUND)
48+
target_link_libraries(PackageDescription PRIVATE
49+
Foundation)
50+
endif()
51+
target_link_options(PackageDescription PRIVATE
52+
"SHELL:-no-toolchain-stdlib-rpath")
53+
set_target_properties(PackageDescription PROPERTIES
54+
BUILD_WITH_INSTALL_RPATH TRUE
55+
INSTALL_RPATH "$ORIGIN/../../$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
56+
endif()
5857

59-
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
60-
install(FILES
61-
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftinterface
62-
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftdoc
63-
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION}
64-
)
65-
else()
66-
install(FILES
67-
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftmodule
68-
${CMAKE_BINARY_DIR}/pm/${PACKAGE_DESCRIPTION_VERSION}/PackageDescription.swiftdoc
69-
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION}
70-
)
71-
endif()
58+
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
59+
install(FILES
60+
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftinterface
61+
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftdoc
62+
DESTINATION lib/swift/pm/ManifestAPI
63+
)
64+
else()
65+
install(FILES
66+
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftmodule
67+
${CMAKE_BINARY_DIR}/pm/ManifestAPI/PackageDescription.swiftdoc
68+
DESTINATION lib/swift/pm/ManifestAPI
69+
)
70+
endif()
7271

73-
install(TARGETS PD${PACKAGE_DESCRIPTION_VERSION}
74-
DESTINATION lib/swift/pm/${PACKAGE_DESCRIPTION_VERSION})
75-
endforeach()
72+
install(TARGETS PackageDescription
73+
DESTINATION lib/swift/pm/ManifestAPI)

Sources/PackageDescription/LanguageStandardSettings.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public enum CXXLanguageStandard: String, Encodable {
144144
case gnucxx20 = "gnu++20"
145145
}
146146

147-
#if !PACKAGE_DESCRIPTION_4
148147
/// The version of the Swift language to use for compiling Swift sources in the package.
149148
public enum SwiftVersion {
150149
@available(_PackageDescription, introduced: 4, obsoleted: 5)
@@ -187,4 +186,3 @@ extension SwiftVersion: Encodable {
187186
try container.encode(value)
188187
}
189188
}
190-
#endif

Sources/PackageDescription/PackageDependency.swift

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,7 @@ extension Package.Dependency {
147147
url: String,
148148
_ range: Range<Version>
149149
) -> Package.Dependency {
150-
#if PACKAGE_DESCRIPTION_4
151150
return .init(name: nil, url: url, requirement: .rangeItem(range))
152-
#else
153-
return .init(name: nil, url: url, requirement: ._rangeItem(range))
154-
#endif
155151
}
156152

157153
/// Adds a package dependency starting with a specific minimum version, up to
@@ -172,11 +168,7 @@ extension Package.Dependency {
172168
url: String,
173169
_ range: Range<Version>
174170
) -> Package.Dependency {
175-
#if PACKAGE_DESCRIPTION_4
176171
return .init(name: name, url: url, requirement: .rangeItem(range))
177-
#else
178-
return .init(name: name, url: url, requirement: ._rangeItem(range))
179-
#endif
180172
}
181173

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

212200
/// Adds a package dependency starting with a specific minimum version, going
@@ -233,14 +221,9 @@ extension Package.Dependency {
233221
upper.major, upper.minor, upper.patch + 1,
234222
prereleaseIdentifiers: upper.prereleaseIdentifiers,
235223
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
236-
#if PACKAGE_DESCRIPTION_4
237224
return .init(name: name, url: url, requirement: .rangeItem(range.lowerBound..<upperBound))
238-
#else
239-
return .init(name: name, url: url, requirement: ._rangeItem(range.lowerBound..<upperBound))
240-
#endif
241225
}
242226

243-
#if !PACKAGE_DESCRIPTION_4
244227
/// Adds a package dependency to a local package on the filesystem.
245228
///
246229
/// The Swift Package Manager uses the package dependency as-is
@@ -253,7 +236,7 @@ extension Package.Dependency {
253236
public static func package(
254237
path: String
255238
) -> Package.Dependency {
256-
return .init(name: nil, url: path, requirement: ._localPackageItem)
239+
return .init(name: nil, url: path, requirement: .localPackageItem)
257240
}
258241

259242
/// Adds a package dependency to a local package on the filesystem.
@@ -271,9 +254,8 @@ extension Package.Dependency {
271254
name: String? = nil,
272255
path: String
273256
) -> Package.Dependency {
274-
return .init(name: name, url: path, requirement: ._localPackageItem)
257+
return .init(name: name, url: path, requirement: .localPackageItem)
275258
}
276-
#endif
277259
}
278260

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

0 commit comments

Comments
 (0)