Compare commits

...

5 Commits

Author SHA1 Message Date
Bartosz Polaczyk ef3a88c6ec Merge pull request #122 from polac24/20220418-derived
Fix building target dependencies list with custom DERIVED_FILE_DIR
2022-04-19 09:32:43 +02:00
Bartosz Polaczyk 95f95be29e Identify custom DerivedData under sources dir 2022-04-18 09:07:36 +02:00
Bartosz Polaczyk 4d12800096 Skip all DerivedData files in dependencies list 2022-04-18 09:04:17 +02:00
Bartosz Polaczyk fbb456b0e0 Merge pull request #121 from cezarsignori/csignori/rc_derived_files_dir
Set auto-generated Swift header under DERIVED_FILES_DIR as irrelevant dependency
2022-04-18 08:57:44 +02:00
Cezar Signori a321ea3362 Set auto-generated Swift header under DERIVED_FILES_DIR as irrelevant dependency 2022-04-14 14:20:30 +02:00
6 changed files with 53 additions and 2 deletions
@@ -40,6 +40,7 @@ public struct PostbuildContext {
var mode: Mode
var targetName: String
var targetTempDir: URL
var derivedFilesDir: URL
/// Location where all compilation outputs (.o) are placed
var compilationTempDir: URL
var configuration: String
@@ -91,6 +92,7 @@ extension PostbuildContext {
let targetNameValue: String = try env.readEnv(key: "TARGET_NAME")
targetName = targetNameValue
targetTempDir = try env.readEnv(key: "TARGET_TEMP_DIR")
derivedFilesDir = try env.readEnv(key: "DERIVED_FILE_DIR")
let archs: [String] = try env.readEnv(key: "ARCHS").split(separator: " ").map(String.init)
guard let firstArch = archs.first, !firstArch.isEmpty else {
throw PostbuildContextError.missingArchitecture
@@ -171,6 +171,7 @@ public class XCPostbuild {
product: context.productsDir,
source: context.srcRoot,
intermediate: context.targetTempDir,
derivedFiles: context.derivedFilesDir,
bundle: context.bundleDir
)
// Override fingerprints for all produced '.swiftmodule' files
@@ -27,6 +27,7 @@ public struct Dependency: Equatable {
case source
case fingerprint
case intermediate
case derivedFile
// Product of the target itself
case ownProduct
case unknown
@@ -55,13 +56,15 @@ class DependencyProcessorImpl: DependencyProcessor {
private let productPath: String
private let sourcePath: String
private let intermediatePath: String
private let derivedFilesPath: String
private let bundlePath: String?
init(xcode: URL, product: URL, source: URL, intermediate: URL, bundle: URL?) {
init(xcode: URL, product: URL, source: URL, intermediate: URL, derivedFiles: URL, bundle: URL?) {
xcodePath = xcode.path.dirPath()
productPath = product.path.dirPath()
sourcePath = source.path.dirPath()
intermediatePath = intermediate.path.dirPath()
derivedFilesPath = derivedFiles.path.dirPath()
bundlePath = bundle?.path.dirPath()
}
@@ -77,6 +80,8 @@ class DependencyProcessorImpl: DependencyProcessor {
return Dependency(url: file, type: .xcode)
} else if filePath.hasPrefix(intermediatePath) {
return Dependency(url: file, type: .intermediate)
} else if filePath.hasPrefix(derivedFilesPath) {
return Dependency(url: file, type: .derivedFile)
} else if let bundle = bundlePath, filePath.hasPrefix(bundle) {
// If a target produces a bundle, explicitly classify all
// of products to distinguish from other targets products
@@ -107,7 +112,9 @@ class DependencyProcessorImpl: DependencyProcessor {
// - All files in `*/Interemediates/*` - this file are created on-fly for a given target
// - Some files may depend on its own product (e.g. .m may #include *-Swift.h) - we know products will match
// because in case of a hit, these will be taken from the artifact
let irrelevantDependenciesType: [Dependency.Kind] = [.xcode, .intermediate, .ownProduct]
// - Customized DERIVED_FILE_DIR may change a directory of
// derived files, which by default is under `*/Interemediates`
let irrelevantDependenciesType: [Dependency.Kind] = [.xcode, .intermediate, .ownProduct, .derivedFile]
return !irrelevantDependenciesType.contains(dependency.type)
}
}
@@ -26,6 +26,7 @@ class PostbuildContextTests: FileXCTestCase {
private static let SampleEnvs = [
"TARGET_NAME": "TARGET_NAME",
"TARGET_TEMP_DIR": "TARGET_TEMP_DIR",
"DERIVED_FILE_DIR": "DERIVED_FILE_DIR",
"ARCHS": "x86_64",
"OBJECT_FILE_DIR_normal": "/OBJECT_FILE_DIR_normal" ,
"CONFIGURATION": "CONFIGURATION",
@@ -27,6 +27,7 @@ class PostbuildTests: FileXCTestCase {
mode: .producer,
targetName: "",
targetTempDir: "",
derivedFilesDir: "",
compilationTempDir: "",
configuration: "",
platform: "",
@@ -78,6 +79,7 @@ class PostbuildTests: FileXCTestCase {
product: "/Product",
source: "/Source",
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: nil
)
private var overrideManager = FingerprintOverrideManagerImpl(
@@ -27,6 +27,7 @@ class DependencyProcessorImplTests: FileXCTestCase {
product: "/Product",
source: "/Source",
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: "/Bundle"
)
@@ -37,6 +38,7 @@ class DependencyProcessorImplTests: FileXCTestCase {
product: "/",
source: "/",
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: nil
)
@@ -53,6 +55,7 @@ class DependencyProcessorImplTests: FileXCTestCase {
product: "/",
source: "/",
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: "/Bundle"
)
@@ -62,6 +65,22 @@ class DependencyProcessorImplTests: FileXCTestCase {
)
}
func testFiltersOutGeneratedSwiftHeaders() throws {
let dependencies = processor.process([
"/DerivedFiles/ModuleName-Swift.h",
])
XCTAssertEqual(dependencies, [])
}
func testFiltersOutDerivedFile() throws {
let dependencies = processor.process([
"/DerivedFiles/output.h",
])
XCTAssertEqual(dependencies, [])
}
func testFiltersOutProductModulemap() throws {
let dependencies = processor.process([
"/Product/some.modulemap",
@@ -130,6 +149,7 @@ class DependencyProcessorImplTests: FileXCTestCase {
product: "/Product",
source: "/Source",
intermediate: intermediateDirReal,
derivedFiles: "/DerivedFiles",
bundle: "/Bundle"
)
@@ -158,6 +178,7 @@ class DependencyProcessorImplTests: FileXCTestCase {
product: "/Product",
source: sourceDirReal,
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: "/Bundle"
)
@@ -189,4 +210,21 @@ class DependencyProcessorImplTests: FileXCTestCase {
return sourceDir.appendingPathComponent(filename)
}
func testSkipsCustomizedDerivedDirFileUnderSources() {
let derivedFile: URL = "/DerivedFiles/Module-Swift.h"
let processor = DependencyProcessorImpl(
xcode: "/Xcode",
product: "/",
source: "/",
intermediate: "/Intermediate",
derivedFiles: "/DerivedFiles",
bundle: nil
)
XCTAssertEqual(
processor.process([derivedFile]),
[]
)
}
}