Skip to content

Pass toolchain settings when using XCBuild #3709

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 1 commit into from
Sep 8, 2021
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
16 changes: 11 additions & 5 deletions Sources/Build/BuildPlan.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1254,13 +1254,19 @@ public final class ProductBuildDescription {

// Embed the swift stdlib library path inside tests and executables on Darwin.
if containsSwiftTargets {
let useStdlibRpath: Bool
switch product.type {
case .library, .plugin: break
case .library(let type):
useStdlibRpath = type == .dynamic
case .test, .executable, .snippet:
if buildParameters.triple.isDarwin() {
let stdlib = buildParameters.toolchain.macosSwiftStdlib
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
}
useStdlibRpath = true
case .plugin:
throw InternalError("unexpectedly asked to generate linker arguments for a plugin product")
}

if useStdlibRpath && buildParameters.triple.isDarwin() {
let stdlib = buildParameters.toolchain.macosSwiftStdlib
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
}
}

Expand Down
11 changes: 10 additions & 1 deletion Sources/XCBuildSupport/PIFBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,17 @@ public struct PIFBuilderParameters {
/// Whether to create dylibs for dynamic library products.
public let shouldCreateDylibForDynamicProducts: Bool

/// The path to the library directory of the active toolchain.
public let toolchainLibDir: AbsolutePath

/// Creates a `PIFBuilderParameters` instance.
/// - Parameters:
/// - enableTestability: Whether or not build for testability is enabled.
/// - shouldCreateDylibForDynamicProducts: Whether to create dylibs for dynamic library products.
public init(enableTestability: Bool, shouldCreateDylibForDynamicProducts: Bool) {
public init(enableTestability: Bool, shouldCreateDylibForDynamicProducts: Bool, toolchainLibDir: AbsolutePath) {
self.enableTestability = enableTestability
self.shouldCreateDylibForDynamicProducts = shouldCreateDylibForDynamicProducts
self.toolchainLibDir = toolchainLibDir
}
}

Expand Down Expand Up @@ -395,6 +399,10 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
settings[.SWIFT_FORCE_STATIC_LINK_STDLIB] = "NO"
settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB] = "YES"

if product.type == .executable || product.type == .test {
settings[.LIBRARY_SEARCH_PATHS] = ["$(inherited)", "\(parameters.toolchainLibDir.pathString)/swift/macosx"]
}

// Tests can have a custom deployment target based on the minimum supported by XCTest.
if mainTarget.underlyingTarget.type == .test {
settings[.MACOSX_DEPLOYMENT_TARGET] = mainTarget.underlyingTarget.deploymentTarget(for: .macOS)
Expand Down Expand Up @@ -518,6 +526,7 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
settings[.DEFINES_MODULE] = "YES"
settings[.SKIP_INSTALL] = "NO"
settings[.INSTALL_PATH] = "/usr/local/lib"
settings[.LIBRARY_SEARCH_PATHS] = ["$(inherited)", "\(parameters.toolchainLibDir.pathString)/swift/macosx"]

if !parameters.shouldCreateDylibForDynamicProducts {
settings[.GENERATE_INFOPLIST_FILE] = "YES"
Expand Down
14 changes: 10 additions & 4 deletions Sources/XCBuildSupport/XcodeBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,14 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {

// Generate a table of any overriding build settings.
var settings: [String: String] = [:]
// An error with determining the override should not be fatal here.
settings["CC"] = try? buildParameters.toolchain.getClangCompiler().pathString
// Always specify the path of the effective Swift compiler, which was determined in the same way as for the native build system.
settings["SWIFT_EXEC"] = buildParameters.toolchain.swiftCompiler.pathString
settings["LIBRARY_SEARCH_PATHS"] = "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)/swift/macosx"
settings["LIBRARY_SEARCH_PATHS"] = "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)"
settings["OTHER_CFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCCFlags.joined(separator: " "))"
settings["OTHER_CPLUSPLUSFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCPPFlags.joined(separator: " "))"
settings["OTHER_SWIFT_FLAGS"] = "$(inherited) \(buildParameters.toolchain.extraSwiftCFlags.joined(separator: " "))"
// Optionally also set the list of architectures to build for.
if !buildParameters.archs.isEmpty {
settings["ARCHS"] = buildParameters.archs.joined(separator: " ")
Expand All @@ -164,7 +169,7 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
// Generate the build parameters.
let params = XCBBuildParameters(
configurationName: buildParameters.configuration.xcbuildName,
overrides: .init(commandLine: .init(table: settings)),
overrides: .init(synthesized: .init(table: settings)),
activeRunDestination: runDestination
)

Expand Down Expand Up @@ -226,7 +231,7 @@ struct XCBBuildParameters: Encodable {
}

struct SettingsOverride: Encodable {
var commandLine: XCBSettingsTable? = nil
var synthesized: XCBSettingsTable? = nil
}

var configurationName: String
Expand All @@ -247,7 +252,8 @@ extension PIFBuilderParameters {
public init(_ buildParameters: BuildParameters) {
self.init(
enableTestability: buildParameters.enableTestability,
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts,
toolchainLibDir: buildParameters.toolchain.toolchainLibDir
)
}
}
Expand Down
2 changes: 2 additions & 0 deletions Tests/BuildTests/BuildPlanTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1156,6 +1156,7 @@ final class BuildPlanTests: XCTestCase {
"-Xlinker", "-install_name", "-Xlinker", "@rpath/libBar-Baz.dylib",
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
"@/path/to/build/debug/Bar-Baz.product/Objects.LinkFileList",
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
"-target", defaultTargetTriple,
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/Bar.swiftmodule"
])
Expand Down Expand Up @@ -1236,6 +1237,7 @@ final class BuildPlanTests: XCTestCase {
"-Xlinker", "-install_name", "-Xlinker", "@rpath/liblib.dylib",
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
"@/path/to/build/debug/lib.product/Objects.LinkFileList",
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
"-target", defaultTargetTriple,
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/lib.swiftmodule",
]
Expand Down
13 changes: 12 additions & 1 deletion Tests/XCBuildSupportTests/PIFBuilderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.SWIFT_VERSION], "5")
XCTAssertEqual(settings[.TARGET_NAME], "foo")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand All @@ -503,6 +504,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.SWIFT_VERSION], "5")
XCTAssertEqual(settings[.TARGET_NAME], "foo")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand Down Expand Up @@ -539,6 +541,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.TARGET_NAME], "cfoo")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand All @@ -562,6 +565,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.TARGET_NAME], "cfoo")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand Down Expand Up @@ -598,6 +602,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.SWIFT_VERSION], "4.2")
XCTAssertEqual(settings[.TARGET_NAME], "bar")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand All @@ -618,6 +623,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.SWIFT_VERSION], "4.2")
XCTAssertEqual(settings[.TARGET_NAME], "bar")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand Down Expand Up @@ -653,6 +659,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.TARGET_NAME], "cbar")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand All @@ -675,6 +682,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
XCTAssertEqual(settings[.TARGET_NAME], "cbar")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand Down Expand Up @@ -1086,6 +1094,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.SKIP_INSTALL], "NO")
XCTAssertEqual(settings[.TARGET_BUILD_DIR], "$(TARGET_BUILD_DIR)/PackageFrameworks")
XCTAssertEqual(settings[.TARGET_NAME], "BarLib")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand All @@ -1109,6 +1118,7 @@ class PIFBuilderTests: XCTestCase {
XCTAssertEqual(settings[.TARGET_BUILD_DIR], "$(TARGET_BUILD_DIR)/PackageFrameworks")
XCTAssertEqual(settings[.TARGET_NAME], "BarLib")
XCTAssertEqual(settings[.USES_SWIFTPM_UNSAFE_FLAGS], "NO")
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
}
}

Expand Down Expand Up @@ -2295,7 +2305,8 @@ extension PIFBuilderParameters {
) -> Self {
PIFBuilderParameters(
enableTestability: false,
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts,
toolchainLibDir: AbsolutePath("/toolchain/lib")
)
}
}