Skip to content

Commit 2c588fd

Browse files
committed
Merge pull request #186 from bhargavg/dependencies-pbxgroup
Move external dependencies to Dependencies group in Xcode project
2 parents 2447467 + 9d56b9a commit 2c588fd

File tree

8 files changed

+51
-41
lines changed

8 files changed

+51
-41
lines changed

Sources/Get/get().swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,22 @@ import Utility
1717
- Throws: Error.InvalidDependencyGraph
1818
- Returns: The modules that this manifest requires building
1919
*/
20-
public func get(manifest: Manifest, manifestParser: (path: String, url: String) throws -> Manifest) throws -> [Package] {
20+
public func get(manifest: Manifest, manifestParser: (path: String, url: String) throws -> Manifest) throws -> (rootPackage: Package, externalPackages:[Package]) {
2121
let dir = Path.join(manifest.path.parentDirectory, "Packages")
2222
let box = PackagesDirectory(prefix: dir, manifestParser: manifestParser)
2323

2424
//TODO don't lose the dependency information during the Fetcher process!
25-
26-
let pkgs = try box.recursivelyFetch(manifest.dependencies) + [Package(manifest: manifest, url: manifest.path.parentDirectory)]
25+
26+
let rootPackage = Package(manifest: manifest, url: manifest.path.parentDirectory)
27+
let extPackages = try box.recursivelyFetch(manifest.dependencies)
28+
29+
let pkgs = extPackages + [rootPackage]
30+
2731
for pkg in pkgs {
2832
pkg.dependencies = pkg.manifest.package.dependencies.map{ dep in pkgs.pick{ dep.url == $0.url }! }
2933
}
30-
return pkgs
34+
35+
return (rootPackage, extPackages)
3136
}
3237

3338
//TODO normalize urls eg http://github.com -> https://github.com

Sources/Transmute/transmute().swift

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ 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(rootPackage: Package, externalPackages: [Package]) throws -> (modules: [Module], externalModules: [Module], products: [Product]) {
1616

1717
var products: [Product] = []
1818
var map: [Package: [Module]] = [:]
19+
20+
let packages = externalPackages + [rootPackage]
1921

2022
for package in packages {
2123

2224
let modules: [Module]
2325
do {
2426
modules = try package.modules()
25-
} catch Package.ModuleError.NoModules(let pkg) where pkg.path == rootdir {
27+
} catch Package.ModuleError.NoModules(let pkg) where pkg === rootPackage {
2628
//Ignore and print warning if root package doesn't contain any sources
2729
print("warning: root package '\(pkg)' does not contain any sources")
2830
if packages.count == 1 { exit(0) } //Exit now if there is no more packages
@@ -66,18 +68,8 @@ public func transmute(packages: [Package], rootdir: String) throws -> ([Module],
6668
// ensure modules depend on the modules of any dependent packages
6769
fillModuleGraph(packages, modulesForPackage: { map[$0]! })
6870

69-
var set = Set<Module>()
70-
var stack = packages.flatMap{ map[$0] ?? [] }
71-
var modules = [Module]()
71+
let modules = recursiveDependencies(packages.flatMap{ map[$0] ?? [] })
72+
let externalModules = recursiveDependencies(externalPackages.flatMap{ map[$0] ?? [] })
7273

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-
}
81-
82-
return (modules, products)
83-
}
74+
return (modules, externalModules, products)
75+
}

Sources/Xcodeproj/Module+PBXProj.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ let rootGroupReference = "___RootGroup_"
3434
let productsGroupReference = "____Products_"
3535
let testProductsGroupReference = "TestProducts_"
3636
let sourcesGroupReference = "_____Sources_"
37+
let dependenciesGroupReference = "Dependencies_"
3738
let testsGroupReference = "_______Tests_"
3839
let linkPhaseFileRefPrefix = "_LinkFileRef_"
3940
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("{")
@@ -57,7 +59,7 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
5759
////// root group
5860
print(" \(rootGroupReference) = {")
5961
print(" isa = PBXGroup;")
60-
print(" children = (\(packageSwift.0), \(sourcesGroupReference), \(testsGroupReference), \(productsGroupReference));")
62+
print(" children = (\(packageSwift.0), \(sourcesGroupReference), \(dependenciesGroupReference), \(testsGroupReference), \(productsGroupReference));")
6163
print(" sourceTree = '<group>';")
6264
print(" };")
6365

@@ -157,11 +159,19 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
157159
////// “Sources” group
158160
print(" \(sourcesGroupReference) = {")
159161
print(" isa = PBXGroup;")
160-
print(" children = (" + nontests.map{ $0.groupReference }.joined(separator: ", ") + ");")
162+
print(" children = (" + nonTestRootModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
161163
print(" name = Sources;")
162164
print(" sourceTree = '<group>';")
163165
print(" };")
164166

167+
////// “Dependencies” group
168+
print(" \(dependenciesGroupReference) = {")
169+
print(" isa = PBXGroup;")
170+
print(" children = (" + externalModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
171+
print(" name = Dependencies;")
172+
print(" sourceTree = '<group>';")
173+
print(" };")
174+
165175
////// “Tests” group
166176
print(" \(testsGroupReference) = {")
167177
print(" isa = PBXGroup;")
@@ -185,7 +195,7 @@ public func pbxproj(srcroot srcroot: String, projectRoot: String, modules: [Swif
185195
}
186196

187197
////// “Products” group
188-
productReferences += nontests.map { $0.productReference }
198+
productReferences += nonTests.map { $0.productReference }
189199

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

Sources/swift-build/main.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,16 @@ do {
5858
return try Manifest(path: path, baseURL: baseURL, swiftc: Toolchain.swiftc, libdir: libdir)
5959
}
6060

61-
func fetch(root: String) throws -> [Package] {
61+
func fetch(root: String) throws -> (rootPackage: Package, externalPackages:[Package]) {
6262
let manifest = try parseManifest(path: root, baseURL: root)
6363
return try get(manifest, manifestParser: parseManifest)
6464
}
6565

6666
switch mode {
6767
case .Build(let conf):
6868
let dirs = try directories()
69-
let packages = try fetch(dirs.root)
70-
let (modules, products) = try transmute(packages, rootdir: dirs.root)
69+
let (rootPackage, externalPackages) = try fetch(dirs.root)
70+
let (modules, externalModules, products) = try transmute(rootPackage, externalPackages: externalPackages)
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

@@ -92,13 +92,15 @@ do {
9292

9393
case .GenerateXcodeproj(let outpath):
9494
let dirs = try directories()
95-
let packages = try fetch(dirs.root)
96-
let (modules, products) = try transmute(packages, rootdir: dirs.root)
95+
let (rootPackage, externalPackages) = try fetch(dirs.root)
96+
let (modules, externalModules, products) = try transmute(rootPackage, externalPackages: externalPackages)
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
101-
let packageName = packages.last!.name //FIXME coincidental dependency on order
103+
let packageName = rootPackage.name
102104

103105
switch outpath {
104106
case let outpath? where outpath.hasSuffix(".xcodeproj"):
@@ -113,7 +115,7 @@ do {
113115
projectName = packageName
114116
}
115117

116-
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: dirs.root, modules: swiftModules, products: products)
118+
let outpath = try Xcodeproj.generate(dstdir: dstdir, projectName: projectName, srcroot: dirs.root, modules: swiftModules, externalModules: externalSwiftModules, products: products)
117119

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

Tests/Transmute/ModuleTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,9 @@ extension ModuleTests {
200200
fixture(name: "Miscellaneous/PackageType") { prefix in
201201
let prefix = Path.join(prefix, "App")
202202
let manifest = try Manifest(path: prefix)
203-
let packages = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
204-
let (modules, _) = try transmute(packages, rootdir: prefix)
205-
203+
let (rootPackage, externalPackages) = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
204+
let (modules, _, _) = try transmute(rootPackage, externalPackages: externalPackages)
205+
206206
XCTAssertEqual(modules.count, 3)
207207
XCTAssertEqual(recursiveDependencies(modules).count, 3)
208208
XCTAssertTrue(modules.dropFirst().first is CModule)
@@ -211,8 +211,8 @@ extension ModuleTests {
211211
fixture(name: "ModuleMaps/Direct") { prefix in
212212
let prefix = Path.join(prefix, "App")
213213
let manifest = try Manifest(path: prefix)
214-
let packages = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
215-
let (modules, _) = try transmute(packages, rootdir: prefix)
214+
let (rootPackage, externalPackages) = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
215+
let (modules, _, _) = try transmute(rootPackage, externalPackages: externalPackages)
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)