diff --git a/Fixtures/InvalidLayouts/NoTargets/Package.swift b/Fixtures/InvalidLayouts/NoTargets/Package.swift deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Fixtures/Miscellaneous/ExactDependencies/EmptyWithDependency/Package.swift b/Fixtures/Miscellaneous/ExactDependencies/EmptyWithDependency/Package.swift new file mode 100644 index 00000000000..21bf8e44d12 --- /dev/null +++ b/Fixtures/Miscellaneous/ExactDependencies/EmptyWithDependency/Package.swift @@ -0,0 +1,7 @@ +import PackageDescription + +let package = Package( + name: "EmptyWithDependency", + dependencies: [ + .Package(url: "../FooLib2", majorVersion: 1), + ]) diff --git a/Sources/Transmute/transmute().swift b/Sources/Transmute/transmute().swift index 326f6ed37d5..b0592bda259 100644 --- a/Sources/Transmute/transmute().swift +++ b/Sources/Transmute/transmute().swift @@ -10,14 +10,25 @@ import PackageType import Utility +import func libc.exit -public func transmute(packages: [Package]) throws -> ([Module], [Product]) { +public func transmute(packages: [Package], rootdir: String) throws -> ([Module], [Product]) { var products: [Product] = [] var map: [Package: [Module]] = [:] for package in packages { - let modules = try package.modules() + + let modules: [Module] + do { + modules = try package.modules() + } catch Package.ModuleError.NoModules(let pkg) where pkg.path == rootdir { + //Ignore and print warning if root package doesn't contain any sources + print("warning: root package '\(pkg)' does not contain any sources") + if packages.count == 1 { exit(0) } //Exit now if there is no more packages + modules = [] + } + let testModules = try package.testModules() products += try package.products(modules, tests: testModules) diff --git a/Sources/swift-build/main.swift b/Sources/swift-build/main.swift index b95962bb727..d59efad7c61 100644 --- a/Sources/swift-build/main.swift +++ b/Sources/swift-build/main.swift @@ -44,7 +44,7 @@ do { case .Build(let conf): let dirs = try directories() let packages = try fetch(dirs.root) - let (modules, products) = try transmute(packages) + let (modules, products) = try transmute(packages, rootdir: dirs.root) let yaml = try describe(dirs.build, conf, modules, products, Xcc: opts.Xcc, Xld: opts.Xld, Xswiftc: opts.Xswiftc) try build(YAMLPath: yaml, target: "default") diff --git a/Tests/Functional/TestInvalidLayouts.swift b/Tests/Functional/TestInvalidLayouts.swift index 50759bd99dd..f55bd6961e6 100644 --- a/Tests/Functional/TestInvalidLayouts.swift +++ b/Tests/Functional/TestInvalidLayouts.swift @@ -14,13 +14,6 @@ import func POSIX.unlink class InvalidLayoutsTestCase: XCTestCase { - func testNoTargets() { - fixture(name: "InvalidLayouts/NoTargets") { prefix in - XCTAssertFileExists(prefix, "Package.swift") - XCTAssertBuildFails(prefix) - } - } - func testMultipleRoots() { fixture(name: "InvalidLayouts/MultipleRoots1") { prefix in XCTAssertBuildFails(prefix) diff --git a/Tests/Functional/TestMiscellaneous.swift b/Tests/Functional/TestMiscellaneous.swift index aae9e1c7018..ce82ed15c95 100644 --- a/Tests/Functional/TestMiscellaneous.swift +++ b/Tests/Functional/TestMiscellaneous.swift @@ -31,6 +31,25 @@ class MiscellaneousTestCase: XCTestCase { } } + func testPackageWithNoSources() { + + // Tests a package with no source files + + fixture(name: "Miscellaneous/Empty") { prefix in + XCTAssertBuilds(prefix) + } + } + + func testPackageWithNoSourcesButDependency() { + + // Tests a package with no source files but dependency, dependency should build. + + fixture(name: "Miscellaneous/ExactDependencies") { prefix in + XCTAssertBuilds(prefix, "EmptyWithDependency") + XCTAssertFileExists(prefix, "EmptyWithDependency/.build/debug/FooLib2.swiftmodule") + } + } + func testManifestExcludes1() { // Tests exclude syntax where no target customization is specified diff --git a/Tests/Functional/TestValidLayouts.swift b/Tests/Functional/TestValidLayouts.swift index 37c0dad7ade..33591f42654 100644 --- a/Tests/Functional/TestValidLayouts.swift +++ b/Tests/Functional/TestValidLayouts.swift @@ -145,7 +145,6 @@ extension DependencyResolutionTestCase { extension InvalidLayoutsTestCase { static var allTests : [(String, InvalidLayoutsTestCase -> () throws -> Void)] { return [ - ("testNoTargets", testNoTargets), ("testMultipleRoots", testMultipleRoots), ("testInvalidLayout1", testInvalidLayout1), ("testInvalidLayout2", testInvalidLayout2), @@ -160,6 +159,8 @@ extension MiscellaneousTestCase { static var allTests : [(String, MiscellaneousTestCase -> () throws -> Void)] { return [ ("testPrintsSelectedDependencyVersion", testPrintsSelectedDependencyVersion), + ("testPackageWithNoSources", testPackageWithNoSources), + ("testPackageWithNoSourcesButDependency", testPackageWithNoSourcesButDependency), ("testManifestExcludes1", testManifestExcludes1), ("testManifestExcludes2", testManifestExcludes2), ("testManifestExcludes3", testManifestExcludes3), diff --git a/Tests/Transmute/ModuleTests.swift b/Tests/Transmute/ModuleTests.swift index 1d50f439e78..e602e810825 100644 --- a/Tests/Transmute/ModuleTests.swift +++ b/Tests/Transmute/ModuleTests.swift @@ -201,7 +201,7 @@ extension ModuleTests { let prefix = Path.join(prefix, "App") let manifest = try Manifest(path: prefix, baseURL: prefix) let packages = try get(manifest) - let (modules, _) = try transmute(packages) + let (modules, _) = try transmute(packages, rootdir: prefix) XCTAssertEqual(modules.count, 3) XCTAssertEqual(recursiveDependencies(modules).count, 3) @@ -212,7 +212,7 @@ extension ModuleTests { let prefix = Path.join(prefix, "App") let manifest = try Manifest(path: prefix, baseURL: prefix) let packages = try get(manifest) - let (modules, _) = try transmute(packages) + let (modules, _) = try transmute(packages, rootdir: prefix) XCTAssertEqual(modules.count, 2) XCTAssertTrue(modules.first is CModule)