Skip to content

Commit 5e10280

Browse files
committed
Add Dependencies in project group
1 parent 57c869a commit 5e10280

File tree

7 files changed

+46
-17
lines changed

7 files changed

+46
-17
lines changed

Sources/Get/get().swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ public func get(manifest: Manifest, manifestParser: (path: String, url: String)
2121
let dir = Path.join(manifest.path.parentDirectory, "Packages")
2222
let box = PackagesDirectory(prefix: dir, manifestParser: manifestParser)
2323

24-
//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)]
24+
let pkgs = try box.recursivelyFetch(manifest.dependencies) + [Package(manifest: manifest, url: manifest.path.parentDirectory, isSourcePackage: true)]
2725
for pkg in pkgs {
2826
pkg.dependencies = pkg.manifest.package.dependencies.map{ dep in pkgs.pick{ dep.url == $0.url }! }
2927
}

Sources/PackageType/Module.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ public class Module {
2222
*/
2323
public let name: String
2424
public var dependencies: [Module] /// in build order
25+
public var isExternalDependency: Bool
2526

26-
public init(name: String) {
27+
public init(name: String, isExternalDependency: Bool = false) {
2728
self.name = name
2829
self.dependencies = []
30+
self.isExternalDependency = isExternalDependency
2931
}
3032

3133
public var recursiveDependencies: [Module] {
@@ -48,9 +50,9 @@ public func ==(lhs: Module, rhs: Module) -> Bool {
4850
public class SwiftModule: Module {
4951
public let sources: Sources
5052

51-
public init(name: String, sources: Sources) {
53+
public init(name: String, sources: Sources, isExternalDependency: Bool = false) {
5254
self.sources = sources
53-
super.init(name: name)
55+
super.init(name: name, isExternalDependency: isExternalDependency)
5456
}
5557

5658
public enum ModuleType {
@@ -68,19 +70,19 @@ public class SwiftModule: Module {
6870
public class CModule: Module {
6971
public let path: String
7072

71-
public init(name: String, path: String) {
73+
public init(name: String, path: String, isExternalDependency: Bool = false) {
7274
self.path = path
73-
super.init(name: name)
75+
super.init(name: name, isExternalDependency: isExternalDependency)
7476
}
7577
}
7678

7779
public class ClangModule: CModule {
7880
public let sources: Sources
7981

80-
public init(name: String, sources: Sources) {
82+
public init(name: String, sources: Sources, isExternalDependency: Bool = false) {
8183
self.sources = sources
8284
//TODO: generate module map using swiftpm if layout can support
83-
super.init(name: name, path: sources.root + "/include")
85+
super.init(name: name, path: sources.root + "/include", isExternalDependency: isExternalDependency)
8486
}
8587
}
8688

Sources/PackageType/Package.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ public class Package {
1414
public let url: String
1515
public let path: String
1616
public let name: String
17+
public let isSourcePackage: Bool
1718
public var dependencies: [Package] = []
1819
public let manifest: Manifest
1920

20-
public init(manifest: Manifest, url: String) {
21+
public init(manifest: Manifest, url: String, isSourcePackage: Bool = false) {
2122
self.manifest = manifest
2223
self.url = url
2324
self.path = manifest.path.parentDirectory
2425
self.name = manifest.package.name ?? Package.nameForURL(url)
26+
self.isSourcePackage = isSourcePackage
2527
}
2628

2729
public enum Error: ErrorProtocol {

Sources/Transmute/Package+modules.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ extension Package {
1616
func modules() throws -> [Module] {
1717

1818
guard !Path.join(path, "module.modulemap").isFile else {
19-
return [CModule(name: name, path: path)]
19+
return [CModule(name: name, path: path, isExternalDependency: !isSourcePackage)]
2020
}
2121

2222
let srcroot = try sourceRoot()
@@ -85,11 +85,11 @@ extension Package {
8585
guard swiftSources.isEmpty else { throw Module.Error.MixedSources(path) }
8686
//FIXME: Support executables for C languages
8787
guard !cSources.contains({ $0.hasSuffix("main.c") }) else { throw Module.Error.CExecutableNotSupportedYet(path) }
88-
return ClangModule(name: name, sources: Sources(paths: cSources, root: path))
88+
return ClangModule(name: name, sources: Sources(paths: cSources, root: path), isExternalDependency: !isSourcePackage)
8989
}
9090

9191
guard !swiftSources.isEmpty else { throw Module.Error.NoSources(path) }
92-
return SwiftModule(name: name, sources: Sources(paths: swiftSources, root: path))
92+
return SwiftModule(name: name, sources: Sources(paths: swiftSources, root: path), isExternalDependency: !isSourcePackage)
9393
}
9494

9595
func isValidSource(path: String) -> Bool {

Sources/Xcodeproj/Module+PBXProj.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ let rootBuildConfigurationReference = "_______Debug_"
3333
let rootGroupReference = "___RootGroup_"
3434
let productsGroupReference = "____Products_"
3535
let sourcesGroupReference = "_____Sources_"
36+
let dependenciesGroupReference = "Dependencies_"
3637
let testsGroupReference = "_______Tests_"
3738
let linkPhaseFileRefPrefix = "_LinkFileRef_"
3839
let sourceGroupFileRefPrefix = "__PBXFileRef_"

Sources/Xcodeproj/pbxproj().swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import Utility
1818
public func pbxproj(package package: Package, modules: [SwiftModule], products _: [Product], printer print: (String) -> Void) {
1919

2020
let srcroot = package.path
21-
let nontests = modules.filter{ !($0 is TestModule) }
21+
let depModules = modules.filter{ $0.isExternalDependency }
22+
let nonTestSourceModules = modules.filter{ !($0 is TestModule) && !$0.isExternalDependency }
2223
let tests = modules.filter{ $0 is TestModule }
2324

2425
print("// !$*UTF8*$!")
@@ -49,7 +50,7 @@ public func pbxproj(package package: Package, modules: [SwiftModule], products _
4950
////// root group
5051
print(" \(rootGroupReference) = {")
5152
print(" isa = PBXGroup;")
52-
print(" children = (\(sourcesGroupReference), \(testsGroupReference), \(productsGroupReference));")
53+
print(" children = (\(sourcesGroupReference), \(dependenciesGroupReference), \(testsGroupReference), \(productsGroupReference));")
5354
print(" sourceTree = '<group>';")
5455
print(" };")
5556

@@ -144,11 +145,19 @@ public func pbxproj(package package: Package, modules: [SwiftModule], products _
144145
////// “Sources” group
145146
print(" \(sourcesGroupReference) = {")
146147
print(" isa = PBXGroup;")
147-
print(" children = (" + nontests.map{ $0.groupReference }.joined(separator: ", ") + ");")
148+
print(" children = (" + nonTestSourceModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
148149
print(" name = Sources;")
149150
print(" sourceTree = '<group>';")
150151
print(" };")
151152

153+
////// “Dependencies” group
154+
print(" \(dependenciesGroupReference) = {")
155+
print(" isa = PBXGroup;")
156+
print(" children = (" + depModules.map{ $0.groupReference }.joined(separator: ", ") + ");")
157+
print(" name = Dependencies;")
158+
print(" sourceTree = '<group>';")
159+
print(" };")
160+
152161
////// “Tests” group
153162
print(" \(testsGroupReference) = {")
154163
print(" isa = PBXGroup;")

Tests/Transmute/ModuleTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,24 @@ extension ModuleTests {
203203
let packages = try get(manifest, manifestParser: { try Manifest(path: $0, baseURL: $1) })
204204
let (modules, _) = try transmute(packages, rootdir: prefix)
205205

206+
let sourcePackages = packages.filter{ $0.name == "App" }
207+
.filter{ $0.isSourcePackage }
208+
209+
let externalPackages = packages.filter{ $0.name == "Module" || $0.name == "ModuleMap" }
210+
.filter{ !$0.isSourcePackage }
211+
212+
let sourceModules = modules.filter{ $0.name == "App" }
213+
.filter{ !$0.isExternalDependency }
214+
215+
let externalModules = modules.filter{ $0.name == "Module" || $0.name == "ModuleMap" }
216+
.filter{ $0.isExternalDependency }
217+
218+
XCTAssertEqual(packages.count, 3)
206219
XCTAssertEqual(modules.count, 3)
220+
XCTAssertEqual(sourcePackages.count, 1)
221+
XCTAssertEqual(externalPackages.count, 2)
222+
XCTAssertEqual(sourceModules.count, 1)
223+
XCTAssertEqual(externalModules.count, 2)
207224
XCTAssertEqual(recursiveDependencies(modules).count, 3)
208225
XCTAssertTrue(modules.dropFirst().first is CModule)
209226
}

0 commit comments

Comments
 (0)