mirror of
https://github.com/yonaskolb/XcodeGen.git
synced 2026-03-18 20:02:25 +00:00
Add FileTypes for cross project file options (#914)
* move BuildPhase * add fileTypes * update changelog
This commit is contained in:
@@ -476,7 +476,7 @@ public class PBXProjGenerator {
|
||||
return addObject(shellScriptPhase)
|
||||
}
|
||||
|
||||
func generateCopyFiles(targetName: String, copyFiles: TargetSource.BuildPhase.CopyFilesSettings, buildPhaseFiles: [PBXBuildFile]) -> PBXCopyFilesBuildPhase {
|
||||
func generateCopyFiles(targetName: String, copyFiles: BuildPhaseSpec.CopyFilesSettings, buildPhaseFiles: [PBXBuildFile]) -> PBXCopyFilesBuildPhase {
|
||||
let copyFilesBuildPhase = PBXCopyFilesBuildPhase(
|
||||
dstPath: copyFiles.subpath,
|
||||
dstSubfolderSpec: copyFiles.destination.destination,
|
||||
@@ -644,7 +644,7 @@ public class PBXProjGenerator {
|
||||
var dependencies: [PBXTargetDependency] = []
|
||||
var targetFrameworkBuildFiles: [PBXBuildFile] = []
|
||||
var frameworkBuildPaths = Set<String>()
|
||||
var copyFilesBuildPhasesFiles: [TargetSource.BuildPhase.CopyFilesSettings: [PBXBuildFile]] = [:]
|
||||
var copyFilesBuildPhasesFiles: [BuildPhaseSpec.CopyFilesSettings: [PBXBuildFile]] = [:]
|
||||
var copyFrameworksReferences: [PBXBuildFile] = []
|
||||
var copyResourcesReferences: [PBXBuildFile] = []
|
||||
var copyBundlesReferences: [PBXBuildFile] = []
|
||||
@@ -955,8 +955,8 @@ public class PBXProjGenerator {
|
||||
return getBuildFilesForSourceFiles(filteredSourceFiles)
|
||||
}
|
||||
|
||||
func getBuildFilesForCopyFilesPhases() -> [TargetSource.BuildPhase.CopyFilesSettings: [PBXBuildFile]] {
|
||||
var sourceFilesByCopyFiles: [TargetSource.BuildPhase.CopyFilesSettings: [SourceFile]] = [:]
|
||||
func getBuildFilesForCopyFilesPhases() -> [BuildPhaseSpec.CopyFilesSettings: [PBXBuildFile]] {
|
||||
var sourceFilesByCopyFiles: [BuildPhaseSpec.CopyFilesSettings: [SourceFile]] = [:]
|
||||
for sourceFile in sourceFiles {
|
||||
guard case let .copyFiles(copyFilesSettings)? = sourceFile.buildPhase else { continue }
|
||||
sourceFilesByCopyFiles[copyFilesSettings, default: []].append(sourceFile)
|
||||
|
||||
@@ -8,7 +8,7 @@ struct SourceFile {
|
||||
let path: Path
|
||||
let fileReference: PBXFileElement
|
||||
let buildFile: PBXBuildFile
|
||||
let buildPhase: TargetSource.BuildPhase?
|
||||
let buildPhase: BuildPhaseSpec?
|
||||
}
|
||||
|
||||
class SourceGenerator {
|
||||
@@ -87,11 +87,22 @@ class SourceGenerator {
|
||||
_ = try getSourceFiles(targetType: .none, targetSource: TargetSource(path: path), path: fullPath)
|
||||
}
|
||||
|
||||
func generateSourceFile(targetType: PBXProductType, targetSource: TargetSource, path: Path, buildPhase: TargetSource.BuildPhase? = nil, fileReference: PBXFileElement? = nil) -> SourceFile {
|
||||
func getFileType(path: Path) -> FileType? {
|
||||
if let fileExtension = path.extension {
|
||||
return project.options.fileTypes[fileExtension] ?? FileType.defaultFileTypes[fileExtension]
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func generateSourceFile(targetType: PBXProductType, targetSource: TargetSource, path: Path, buildPhase: BuildPhaseSpec? = nil, fileReference: PBXFileElement? = nil) -> SourceFile {
|
||||
let fileReference = fileReference ?? fileReferencesByPath[path.string.lowercased()]!
|
||||
var settings: [String: Any] = [:]
|
||||
var attributes: [String] = targetSource.attributes
|
||||
var chosenBuildPhase: TargetSource.BuildPhase?
|
||||
let fileType = getFileType(path: path)
|
||||
var attributes: [String] = targetSource.attributes + (fileType?.attributes ?? [])
|
||||
var chosenBuildPhase: BuildPhaseSpec?
|
||||
var compilerFlags: String = ""
|
||||
let assetTags: [String] = targetSource.resourceTags + (fileType?.resourceTags ?? [])
|
||||
|
||||
let headerVisibility = targetSource.headerVisibility ?? .public
|
||||
|
||||
@@ -107,7 +118,7 @@ class SourceGenerator {
|
||||
// Static libraries don't support the header build phase
|
||||
// For public headers they need to be copied
|
||||
if headerVisibility == .public {
|
||||
chosenBuildPhase = .copyFiles(TargetSource.BuildPhase.CopyFilesSettings(
|
||||
chosenBuildPhase = .copyFiles(BuildPhaseSpec.CopyFilesSettings(
|
||||
destination: .productsDirectory,
|
||||
subpath: "include/$(PRODUCT_NAME)",
|
||||
phaseOrder: .preCompile
|
||||
@@ -123,16 +134,28 @@ class SourceGenerator {
|
||||
attributes.append(headerVisibility.settingName)
|
||||
}
|
||||
}
|
||||
if chosenBuildPhase == .sources && targetSource.compilerFlags.count > 0 {
|
||||
settings["COMPILER_FLAGS"] = targetSource.compilerFlags.joined(separator: " ")
|
||||
|
||||
if let flags = fileType?.compilerFlags {
|
||||
compilerFlags += flags.joined(separator: " ")
|
||||
}
|
||||
|
||||
if !targetSource.compilerFlags.isEmpty {
|
||||
if !compilerFlags.isEmpty {
|
||||
compilerFlags += " "
|
||||
}
|
||||
compilerFlags += targetSource.compilerFlags.joined(separator: " ")
|
||||
}
|
||||
|
||||
if chosenBuildPhase == .sources && !compilerFlags.isEmpty {
|
||||
settings["COMPILER_FLAGS"] = compilerFlags
|
||||
}
|
||||
|
||||
if !attributes.isEmpty {
|
||||
settings["ATTRIBUTES"] = attributes
|
||||
}
|
||||
|
||||
if chosenBuildPhase == .resources && !targetSource.resourceTags.isEmpty {
|
||||
settings["ASSET_TAGS"] = targetSource.resourceTags
|
||||
|
||||
if chosenBuildPhase == .resources && !assetTags.isEmpty {
|
||||
settings["ASSET_TAGS"] = assetTags
|
||||
}
|
||||
|
||||
let buildFile = PBXBuildFile(file: fileReference, settings: settings.isEmpty ? nil : settings)
|
||||
@@ -226,53 +249,22 @@ class SourceGenerator {
|
||||
}
|
||||
|
||||
/// returns a default build phase for a given path. This is based off the filename
|
||||
private func getDefaultBuildPhase(for path: Path, targetType: PBXProductType) -> TargetSource.BuildPhase? {
|
||||
private func getDefaultBuildPhase(for path: Path, targetType: PBXProductType) -> BuildPhaseSpec? {
|
||||
if path.lastComponent == "Info.plist" {
|
||||
return nil
|
||||
}
|
||||
if let buildPhase = getFileType(path: path)?.buildPhase {
|
||||
return buildPhase
|
||||
}
|
||||
if let fileExtension = path.extension {
|
||||
switch fileExtension {
|
||||
case "swift",
|
||||
"m",
|
||||
"mm",
|
||||
"cpp",
|
||||
"c",
|
||||
"cc",
|
||||
"S",
|
||||
"xcdatamodeld",
|
||||
"xcmappingmodel",
|
||||
"intentdefinition",
|
||||
"metal",
|
||||
"mlmodel",
|
||||
"rcproject":
|
||||
return .sources
|
||||
case "h",
|
||||
"hh",
|
||||
"hpp",
|
||||
"ipp",
|
||||
"tpp",
|
||||
"hxx",
|
||||
"def":
|
||||
return .headers
|
||||
case "modulemap":
|
||||
guard targetType == .staticLibrary else { return nil }
|
||||
return .copyFiles(TargetSource.BuildPhase.CopyFilesSettings(
|
||||
return .copyFiles(BuildPhaseSpec.CopyFilesSettings(
|
||||
destination: .productsDirectory,
|
||||
subpath: "include/$(PRODUCT_NAME)",
|
||||
phaseOrder: .preCompile
|
||||
))
|
||||
case "framework":
|
||||
return .frameworks
|
||||
case "xpc":
|
||||
return .copyFiles(.xpcServices)
|
||||
case "xcconfig",
|
||||
"entitlements",
|
||||
"gpx",
|
||||
"lproj",
|
||||
"xcfilelist",
|
||||
"apns",
|
||||
"pch":
|
||||
return nil
|
||||
default:
|
||||
return .resources
|
||||
}
|
||||
@@ -414,13 +406,24 @@ class SourceGenerator {
|
||||
let children = try getSourceChildren(targetSource: targetSource, dirPath: path, excludePaths: excludePaths, includePaths: includePaths)
|
||||
|
||||
let createIntermediateGroups = targetSource.createIntermediateGroups ?? project.options.createIntermediateGroups
|
||||
let nonLocalizedChildren = children.filter { $0.extension != "lproj" }
|
||||
|
||||
let directories = children
|
||||
.filter { $0.isDirectory && !Xcode.isDirectoryFileWrapper(path: $0) && $0.extension != "lproj" }
|
||||
let directories = nonLocalizedChildren
|
||||
.filter {
|
||||
if let fileType = getFileType(path: $0) {
|
||||
return !fileType.file
|
||||
} else {
|
||||
return $0.isDirectory && !Xcode.isDirectoryFileWrapper(path: $0)
|
||||
}
|
||||
}
|
||||
|
||||
let filePaths = children
|
||||
.filter { $0.isFile || $0.isDirectory && $0.extension != "lproj"
|
||||
&& Xcode.isDirectoryFileWrapper(path: $0)
|
||||
let filePaths = nonLocalizedChildren
|
||||
.filter {
|
||||
if let fileType = getFileType(path: $0) {
|
||||
return fileType.file
|
||||
} else {
|
||||
return $0.isFile || $0.isDirectory && Xcode.isDirectoryFileWrapper(path: $0)
|
||||
}
|
||||
}
|
||||
|
||||
let localisedDirectories = children
|
||||
@@ -576,7 +579,7 @@ class SourceGenerator {
|
||||
rootGroups.insert(fileReference)
|
||||
}
|
||||
|
||||
let buildPhase: TargetSource.BuildPhase?
|
||||
let buildPhase: BuildPhaseSpec?
|
||||
if let targetBuildPhase = targetSource.buildPhase {
|
||||
buildPhase = targetBuildPhase
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user