Skip to content

[Explicit Module Builds] Avoid adding cross-target input dependencies to intermediate build artifact jobs. #2804

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
Jul 7, 2020
Merged
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
19 changes: 17 additions & 2 deletions Sources/Build/ManifestBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ extension LLBuildManifestBuilder {
if buildParameters.useExplicitModuleBuild {
commandLine.append("-experimental-explicit-module-build")
}

var driver = try Driver(args: commandLine, fileSystem: target.fs)
let jobs = try driver.planBuild()
let resolver = try ArgsResolver(fileSystem: target.fs)
Expand All @@ -218,22 +219,36 @@ extension LLBuildManifestBuilder {
let jobInputs = job.inputs.map { $0.resolveToNode() }
let jobOutputs = job.outputs.map { $0.resolveToNode() }

// Add target dependencies as inputs to the main module build command.
//
// Jobs for a target's intermediate build artifacts, such as PCMs or
// modules built from a .swiftinterface, do not have a
// dependency on cross-target build products. If multiple targets share
// common intermediate dependency modules, such dependencies can lead
// to cycles in the resulting manifest.
var manifestNodeInputs : [Node] = []
if buildParameters.useExplicitModuleBuild && !driver.isExplicitMainModuleJob(job: job) {
manifestNodeInputs = jobInputs
} else {
manifestNodeInputs = (inputs + jobInputs).uniqued()
}

let moduleName = target.target.c99name
let description = job.description
if job.kind.isSwiftFrontend {
manifest.addSwiftFrontendCmd(
name: jobOutputs.first!.name,
moduleName: moduleName,
description: description,
inputs: (inputs + jobInputs).uniqued(),
inputs: manifestNodeInputs,
outputs: jobOutputs,
args: arguments
)
} else {
manifest.addShellCmd(
name: jobOutputs.first!.name,
description: description,
inputs: (inputs + jobInputs).uniqued(),
inputs: manifestNodeInputs,
outputs: jobOutputs,
args: arguments
)
Expand Down