Skip to content

Commit 5cd0b68

Browse files
committed
Add Dependencies in project group
1 parent b354d67 commit 5cd0b68

File tree

7 files changed

+34
-29
lines changed

7 files changed

+34
-29
lines changed

Sources/Transmute/transmute().swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import PackageType
1212
import Utility
1313
import func libc.exit
1414

15-
public func transmute(packages: [Package], rootdir: String) throws -> ([Module], [Product]) {
15+
public func transmute(packages: [Package], rootdir: String) throws -> (modules: [Module], externalModules: [Module], products: [Product]) {
1616

1717
var products: [Product] = []
1818
var map: [Package: [Module]] = [:]
@@ -66,18 +66,10 @@ public func transmute(packages: [Package], rootdir: String) throws -> ([Module],
6666
// ensure modules depend on the modules of any dependent packages
6767
fillModuleGraph(packages, modulesForPackage: { map[$0]! })
6868

69-
var set = Set<Module>()
70-
var stack = packages.flatMap{ map[$0] ?? [] }
71-
var modules = [Module]()
69+
let depPackages = packages.filter{ $0.path != rootdir }
7270

73-
while !stack.isEmpty {
74-
let module = stack.removeFirst()
75-
if !set.contains(module) {
76-
set.insert(module)
77-
stack += module.dependencies
78-
modules.append(module)
79-
}
80-
}
71+
let modules = recursiveDependencies(packages.flatMap{ map[$0] ?? [] })
72+
let extModules = recursiveDependencies(depPackages.flatMap{ map[$0] ?? [] })
8173

82-
return (modules, products)
83-
}
74+
return (modules, extModules, products)
75+
}

Sources/Xcodeproj/Module+PBXProj.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ let rootGroupReference = "___RootGroup_"
3535
let productsGroupReference = "____Products_"
3636
let testProductsGroupReference = "TestProducts_"
3737
let sourcesGroupReference = "_____Sources_"
38+
let dependenciesGroupReference = "Dependencies_"
3839
let testsGroupReference = "_______Tests_"
3940
let linkPhaseFileRefPrefix = "_LinkFileRef_"
4041
let sourceGroupFileRefPrefix = "__PBXFileRef_"

Sources/Xcodeproj/generate().swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import POSIX
1616
Generates an xcodeproj at the specified path.
1717
- Returns: the path to the generated project
1818
*/
19-
public func generate(dstdir dstdir: String, projectName: String, srcroot: String, modules: [SwiftModule], products: [Product]) throws -> String {
19+
public func generate(dstdir dstdir: String, projectName: String, srcroot: String, modules: [SwiftModule], externalModules: [SwiftModule], products: [Product]) throws -> String {
2020

2121
let xcodeprojName = "\(projectName).xcodeproj"
2222
let xcodeprojPath = try mkdir(dstdir, xcodeprojName)
@@ -25,7 +25,7 @@ public func generate(dstdir dstdir: String, projectName: String, srcroot: String
2525

2626
////// the pbxproj file describes the project and its targets
2727
try open(xcodeprojPath, "project.pbxproj") { fwrite in
28-
pbxproj(srcroot: srcroot, projectRoot: dstdir, modules: modules, products: products, printer: fwrite)
28+
pbxproj(srcroot: srcroot, projectRoot: dstdir, modules: modules, externalModules: externalModules, products: products, printer: fwrite)
2929
}
3030

3131
////// the scheme acts like an aggregate target for all our targets

Sources/Xcodeproj/pbxproj().swift

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
import PackageType
1616
import Utility
1717

18-
public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [SwiftModule], products _: [Product], printer print: (String) -> Void) {
19-
let nontests = modules.filter{ !($0 is TestModule) }
20-
let tests = modules.filter{ $0 is TestModule }
18+
public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [SwiftModule], externalModules: [SwiftModule], products _: [Product], printer print: (String) -> Void) {
19+
20+
let rootModulesSet = Set(modules).subtract(Set(externalModules))
21+
let nonTestRootModules = rootModulesSet.filter{ !($0 is TestModule) }
22+
let (tests, nonTests) = modules.partition{ $0 is TestModule }
2123

2224
print("// !$*UTF8*$!")
2325
print("{")
@@ -47,7 +49,7 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
4749
////// root group
4850
print(" \(rootGroupReference) = {")
4951
print(" isa = PBXGroup;")
50-
print(" children = (\(sourcesGroupReference), \(testsGroupReference), \(productsGroupReference));")
52+
print(" children = (\(sourcesGroupReference), \(dependenciesGroupReference), \(testsGroupReference), \(productsGroupReference));")
5153
print(" sourceTree = '<group>';")
5254
print(" };")
5355

@@ -147,11 +149,19 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
147149
////// “Sources” group
148150
print(" \(sourcesGroupReference) = {")
149151
print(" isa = PBXGroup;")
150-
print(" children = (" + nontests.map{ $0.groupReference }.joined(separator: ", ") + ");")
152+
print(" children = (" + nonTestRootModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
151153
print(" name = Sources;")
152154
print(" sourceTree = '<group>';")
153155
print(" };")
154156

157+
////// “Dependencies” group
158+
print(" \(dependenciesGroupReference) = {")
159+
print(" isa = PBXGroup;")
160+
print(" children = (" + externalModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
161+
print(" name = Dependencies;")
162+
print(" sourceTree = '<group>';")
163+
print(" };")
164+
155165
////// “Tests” group
156166
print(" \(testsGroupReference) = {")
157167
print(" isa = PBXGroup;")
@@ -184,7 +194,7 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
184194
}
185195

186196
////// “Products” group
187-
productReferences += nontests.map { $0.productReference }
197+
productReferences += nonTests.map { $0.productReference }
188198

189199
print(" \(productsGroupReference) = {")
190200
print(" isa = PBXGroup;")

Sources/swift-build/main.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ do {
6767
case .Build(let conf):
6868
let dirs = try directories()
6969
let packages = try fetch(dirs.root)
70-
let (modules, products) = try transmute(packages, rootdir: dirs.root)
70+
let (modules, externalModules, products) = try transmute(packages, rootdir: dirs.root)
7171
let yaml = try describe(dirs.build, conf, modules, products, Xcc: opts.Xcc, Xld: opts.Xld, Xswiftc: opts.Xswiftc)
7272
try build(YAMLPath: yaml, target: "default")
7373

@@ -93,8 +93,10 @@ do {
9393
case .GenerateXcodeproj(let outpath):
9494
let dirs = try directories()
9595
let packages = try fetch(dirs.root)
96-
let (modules, products) = try transmute(packages, rootdir: dirs.root)
96+
let (modules, externalModules, products) = try transmute(packages, rootdir: dirs.root)
97+
9798
let swiftModules = modules.flatMap{ $0 as? SwiftModule }
99+
let externalSwiftModules = externalModules.flatMap{ $0 as? SwiftModule }
98100

99101
let projectName: String
100102
let dstdir: String
@@ -114,7 +116,7 @@ do {
114116
projectName = packageName
115117
}
116118

117-
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: dirs.root, modules: swiftModules, products: products)
119+
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: dirs.root, modules: swiftModules, externalModules: externalSwiftModules, products: products)
118120

119121
print("generated:", outpath.prettied)
120122
}

Tests/Transmute/ModuleTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,8 @@ extension ModuleTests {
201201
let prefix = Path.join(prefix, "App")
202202
let manifest = try Manifest(path: prefix)
203203
let packages = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
204-
let (modules, _) = try transmute(packages, rootdir: prefix)
205-
204+
let (modules, _, _) = try transmute(packages, rootdir: prefix)
205+
206206
XCTAssertEqual(modules.count, 3)
207207
XCTAssertEqual(recursiveDependencies(modules).count, 3)
208208
XCTAssertTrue(modules.dropFirst().first is CModule)
@@ -212,7 +212,7 @@ extension ModuleTests {
212212
let prefix = Path.join(prefix, "App")
213213
let manifest = try Manifest(path: prefix)
214214
let packages = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
215-
let (modules, _) = try transmute(packages, rootdir: prefix)
215+
let (modules, _, _) = try transmute(packages, rootdir: prefix)
216216

217217
XCTAssertEqual(modules.count, 2)
218218
XCTAssertTrue(modules.first is CModule)

Tests/Xcodeproj/TestGeneration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class TestGeneration: XCTestCase {
5151
let modules = dummy()
5252
let products: [Product] = []
5353

54-
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: srcroot, modules: modules, products: products)
54+
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: srcroot, modules: modules, externalModules: [], products: products)
5555

5656
XCTAssertDirectoryExists(outpath)
5757
XCTAssertEqual(outpath, Path.join(dstdir, "\(projectName).xcodeproj"))

0 commit comments

Comments
 (0)