1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
//===--- NinjaBuildFile.swift ---------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
struct NinjaBuildFile {
var attributes: [Attribute.Key: Attribute]
var buildRules: [BuildRule] = []
init(
attributes: [Attribute.Key: Attribute],
buildRules: [BuildRule]
) {
self.attributes = attributes
self.buildRules = buildRules
}
}
extension NinjaBuildFile {
var buildConfiguration: BuildConfiguration? {
attributes[.configuration]
.flatMap { BuildConfiguration(rawValue: $0.value) }
}
}
extension NinjaBuildFile {
struct BuildRule: Hashable {
let inputs: [String]
let outputs: [String]
let dependencies: [String]
let attributes: [Attribute.Key: Attribute]
private(set) var isPhony = false
init(
inputs: [String], outputs: [String], dependencies: [String],
attributes: [Attribute.Key : Attribute]
) {
self.inputs = inputs
self.outputs = outputs
self.dependencies = dependencies
self.attributes = attributes
}
static func phony(for outputs: [String], inputs: [String]) -> Self {
var rule = Self(
inputs: inputs, outputs: outputs, dependencies: [], attributes: [:]
)
rule.isPhony = true
return rule
}
}
}
extension NinjaBuildFile {
struct Attribute: Hashable {
var key: Key
var value: String
}
}
extension NinjaBuildFile: CustomDebugStringConvertible {
var debugDescription: String {
buildRules.map(\.debugDescription).joined(separator: "\n")
}
}
extension NinjaBuildFile.BuildRule: CustomDebugStringConvertible {
var debugDescription: String {
"""
{
inputs: \(inputs)
outputs: \(outputs)
dependencies: \(dependencies)
attributes: \(attributes)
isPhony: \(isPhony)
}
"""
}
}
extension NinjaBuildFile.Attribute: CustomStringConvertible {
var description: String {
"\(key.rawValue) = \(value)"
}
}
extension NinjaBuildFile.Attribute {
enum Key: String {
case configuration = "CONFIGURATION"
case defines = "DEFINES"
case flags = "FLAGS"
case includes = "INCLUDES"
case swiftModule = "SWIFT_MODULE"
case swiftModuleName = "SWIFT_MODULE_NAME"
case swiftLibraryName = "SWIFT_LIBRARY_NAME"
case swiftSources = "SWIFT_SOURCES"
case command = "COMMAND"
}
}
|