Skip to content

Commit 103ed52

Browse files
committed
PackageModel: relative paths for cross-compilation destinations
This introduces support for relative paths in v2 scheme of `destination.json` files. The path is then normalized relative to the location of `destination.json` files. As a result, it makes it easier for moving cross-compilation sysroots between different directories on the same filesystem, or even between different machines.
1 parent d61b1ea commit 103ed52

File tree

1 file changed

+54
-11
lines changed

1 file changed

+54
-11
lines changed

Sources/PackageModel/Destination.swift

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import Basics
1414
import Foundation
15+
import SystemPackage
1516
import TSCBasic
1617

1718
import struct TSCUtility.Triple
@@ -212,27 +213,51 @@ extension Destination {
212213
public init(fromFile path: AbsolutePath, fileSystem: FileSystem) throws {
213214
let decoder = JSONDecoder.makeWithDefaults()
214215
let version = try decoder.decode(path: path, fileSystem: fileSystem, as: VersionInfo.self)
216+
215217
// Check schema version.
216-
guard version.version == 1 else {
218+
if version.version == 1 {
219+
let destination = try decoder.decode(path: path, fileSystem: fileSystem, as: DestinationInfoV1.self)
220+
try self.init(
221+
target: destination.target.map{ try Triple($0) },
222+
sdk: destination.sdk,
223+
binDir: destination.binDir,
224+
extraCCFlags: destination.extraCCFlags,
225+
extraSwiftCFlags: destination.extraSwiftCFlags,
226+
extraCPPFlags: destination.extraCPPFlags
227+
)
228+
} else if version.version == 2 {
229+
let destination = try decoder.decode(path: path, fileSystem: fileSystem, as: DestinationInfoV2.self)
230+
let destinationDirectory = path.parentDirectory
231+
232+
try self.init(
233+
target: destination.target.map{ try Triple($0) },
234+
sdk: destination.sdk?.absolutePath(relativeTo: destinationDirectory),
235+
binDir: destination.binDir.absolutePath(relativeTo: destinationDirectory),
236+
extraCCFlags: destination.extraCCFlags,
237+
extraSwiftCFlags: destination.extraSwiftCFlags,
238+
extraCPPFlags: destination.extraCPPFlags
239+
)
240+
} else {
217241
throw DestinationError.invalidSchemaVersion
218242
}
219-
let destination = try decoder.decode(path: path, fileSystem: fileSystem, as: DestinationInfo.self)
220-
try self.init(
221-
target: destination.target.map{ try Triple($0) },
222-
sdk: destination.sdk,
223-
binDir: destination.binDir,
224-
extraCCFlags: destination.extraCCFlags,
225-
extraSwiftCFlags: destination.extraSwiftCFlags,
226-
extraCPPFlags: destination.extraCPPFlags
227-
)
243+
}
244+
}
245+
246+
fileprivate extension FilePath {
247+
func absolutePath(relativeTo directory: AbsolutePath) -> AbsolutePath {
248+
if isRelative {
249+
return directory.appending(RelativePath(string))
250+
} else {
251+
return AbsolutePath(string)
252+
}
228253
}
229254
}
230255

231256
fileprivate struct VersionInfo: Codable {
232257
let version: Int
233258
}
234259

235-
fileprivate struct DestinationInfo: Codable {
260+
fileprivate struct DestinationInfoV1: Codable {
236261
let target: String?
237262
let sdk: AbsolutePath?
238263
let binDir: AbsolutePath
@@ -249,3 +274,21 @@ fileprivate struct DestinationInfo: Codable {
249274
case extraCPPFlags = "extra-cpp-flags"
250275
}
251276
}
277+
278+
fileprivate struct DestinationInfoV2: Codable {
279+
let target: String?
280+
let sdk: FilePath?
281+
let binDir: FilePath
282+
let extraCCFlags: [String]
283+
let extraSwiftCFlags: [String]
284+
let extraCPPFlags: [String]
285+
286+
enum CodingKeys: String, CodingKey {
287+
case target
288+
case sdk
289+
case binDir = "toolchain-bin-dir"
290+
case extraCCFlags = "extra-cc-flags"
291+
case extraSwiftCFlags = "extra-swiftc-flags"
292+
case extraCPPFlags = "extra-cpp-flags"
293+
}
294+
}

0 commit comments

Comments
 (0)