diff --git a/Sources/ProjectSpec/SpecOptions.swift b/Sources/ProjectSpec/SpecOptions.swift index 9d559578..12e097f7 100644 --- a/Sources/ProjectSpec/SpecOptions.swift +++ b/Sources/ProjectSpec/SpecOptions.swift @@ -19,6 +19,7 @@ public struct SpecOptions: Equatable { public var defaultConfig: String? public var transitivelyLinkDependencies: Bool public var groupSortPosition: GroupSortPosition + public var generateEmptyDirectories: Bool public enum ValidationType: String { case missingConfigs @@ -71,7 +72,8 @@ public struct SpecOptions: Equatable { disabledValidations: [ValidationType] = [], defaultConfig: String? = nil, transitivelyLinkDependencies: Bool = false, - groupSortPosition: GroupSortPosition = .bottom + groupSortPosition: GroupSortPosition = .bottom, + generateEmptyDirectories: Bool = true ) { self.minimumXcodeGenVersion = minimumXcodeGenVersion self.carthageBuildPath = carthageBuildPath @@ -89,6 +91,7 @@ public struct SpecOptions: Equatable { self.defaultConfig = defaultConfig self.transitivelyLinkDependencies = transitivelyLinkDependencies self.groupSortPosition = groupSortPosition + self.generateEmptyDirectories = generateEmptyDirectories } } @@ -114,5 +117,6 @@ extension SpecOptions: JSONObjectConvertible { defaultConfig = jsonDictionary.json(atKeyPath: "defaultConfig") transitivelyLinkDependencies = jsonDictionary.json(atKeyPath: "transitivelyLinkDependencies") ?? false groupSortPosition = jsonDictionary.json(atKeyPath: "groupSortPosition") ?? .bottom + generateEmptyDirectories = jsonDictionary.json(atKeyPath: "generateEmptyDirectories") ?? true } } diff --git a/Sources/XcodeGenKit/SourceGenerator.swift b/Sources/XcodeGenKit/SourceGenerator.swift index b3b86a20..fd7fbc22 100644 --- a/Sources/XcodeGenKit/SourceGenerator.swift +++ b/Sources/XcodeGenKit/SourceGenerator.swift @@ -318,8 +318,12 @@ class SourceGenerator { return try dirPath.children() .filter { if $0.isDirectory { - let children = try $0.children().filter(isIncludedPath) - return !children.isEmpty + if project.options.generateEmptyDirectories { + return true + } else { + let children = try $0.children().filter(isIncludedPath) + return !children.isEmpty + } } else if $0.isFile { return isIncludedPath($0) } else { @@ -352,18 +356,18 @@ class SourceGenerator { for path in directories { let subGroups = try getGroupSources(targetType: targetType, targetSource: targetSource, path: path, isBaseGroup: false) - guard !subGroups.sourceFiles.isEmpty else { + guard !subGroups.sourceFiles.isEmpty || project.options.generateEmptyDirectories else { continue } allSourceFiles += subGroups.sourceFiles - guard let firstGroup = subGroups.groups.first else { - continue + if let firstGroup = subGroups.groups.first { + groupChildren.append(firstGroup) + groups += subGroups.groups + } else if project.options.generateEmptyDirectories { + groups += subGroups.groups } - - groupChildren.append(firstGroup) - groups += subGroups.groups } // find the base localised directory