@@ -776,7 +776,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
776776 let scope = cbc. scope
777777 let inputFileType = cbc. inputs. first? . fileType
778778 let lookup = { self . lookup ( $0, cbc, delegate) }
779- for buildOption in self . flattenedOrderedBuildOptions {
779+ for buildOption in cbc . producer . effectiveFlattenedOrderedBuildOptions ( self ) {
780780 guard let dependencyFormat = buildOption. dependencyFormat else {
781781 continue
782782 }
@@ -910,7 +910,12 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
910910
911911 // Add the additional outputs defined by the spec. These are not declared as outputs but should be processed by the tool separately.
912912 let additionalEvaluatedOutputsResult = await additionalEvaluatedOutputs ( cbc, delegate)
913- outputs. append ( contentsOf: additionalEvaluatedOutputsResult. outputs. map ( { delegate. createNode ( $0) } ) )
913+ outputs. append ( contentsOf: additionalEvaluatedOutputsResult. outputs. map { output in
914+ if let fileTypeIdentifier = output. fileType, let fileType = cbc. producer. lookupFileType ( identifier: fileTypeIdentifier) {
915+ delegate. declareOutput ( FileToBuild ( absolutePath: output. path, fileType: fileType) )
916+ }
917+ return delegate. createNode ( output. path)
918+ } )
914919
915920 if let infoPlistContent = additionalEvaluatedOutputsResult. generatedInfoPlistContent {
916921 delegate. declareGeneratedInfoPlistContent ( infoPlistContent)
@@ -972,7 +977,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
972977 }
973978
974979 public struct AdditionalEvaluatedOutputsResult {
975- public var outputs = [ Path] ( )
980+ public var outputs = [ ( path : Path, fileType : String ? ) ] ( )
976981 public var generatedInfoPlistContent : Path ? = nil
977982 }
978983
@@ -988,20 +993,25 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
988993
989994 // FIXME: In Xcode, this is also marked as an "auxiliary output", which we use in conjunction with the "MightNotEmitAllOutput" flag to determine whether or not the tool needs to rerun if the output is missing.
990995
991- result. outputs. append ( output)
996+ result. outputs. append ( ( output, nil ) )
992997 }
993998
994999 let producer = cbc. producer
9951000 let scope = cbc. scope
9961001 let inputFileType = cbc. inputs. first? . fileType
9971002 let lookup = { self . lookup ( $0, cbc, delegate) }
9981003 let optionContext = await discoveredCommandLineToolSpecInfo ( producer, scope, delegate)
999- result. outputs. append ( contentsOf: self . flattenedOrderedBuildOptions . flatMap { buildOption -> [ Path ] in
1004+ result. outputs. append ( contentsOf: cbc . producer . effectiveFlattenedOrderedBuildOptions ( self , filter : . all ) . flatMap { buildOption -> [ ( Path , String ? ) ] in
10001005 // Check if the effective arguments for this build option were non-empty as a proxy for whether it got filtered out by architecture mismatch, etc.
10011006 guard let outputDependencies = buildOption. outputDependencies, !buildOption. getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) . isEmpty else {
10021007 return [ ]
10031008 }
1004- return outputDependencies. compactMap { Path ( scope. evaluate ( $0, lookup: lookup) ) . nilIfEmpty? . normalize ( ) }
1009+ return outputDependencies. compactMap { outputDependency in
1010+ guard let path = Path ( scope. evaluate ( outputDependency. path, lookup: lookup) ) . nilIfEmpty else {
1011+ return nil
1012+ }
1013+ return ( path. normalize ( ) , outputDependency. fileType. map { scope. evaluate ( $0, lookup: lookup) . nilIfEmpty } ?? nil )
1014+ }
10051015 } )
10061016
10071017 return result
@@ -1225,7 +1235,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
12251235 return cbc. scope. evaluate ( value, lookup: lookup) . map { . literal( ByteString ( encodingAsUTF8: $0) ) }
12261236
12271237 case . options:
1228- return self . commandLineFromOptions ( cbc, delegate, optionContext: optionContext, lookup: lookup)
1238+ return self . commandLineFromOptions ( cbc, delegate, optionContext: optionContext, buildOptionsFilter : . all , lookup: lookup)
12291239
12301240 case . output:
12311241 // We always resolve the Output via a recursive macro evaluation. See constructTasks() for more information.
@@ -1254,22 +1264,22 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
12541264 /// Creates and returns the command line arguments generated by the options of the specification.
12551265 ///
12561266 /// - parameter lookup: An optional closure which functionally defined overriding values during build setting evaluation.
1257- public func commandLineFromOptions( _ producer: any CommandProducer , scope: MacroEvaluationScope , inputFileType: FileTypeSpec ? , optionContext: ( any BuildOptionGenerationContext ) ? , lookup: ( ( MacroDeclaration ) -> MacroExpression ? ) ? = nil ) -> [ CommandLineArgument ] {
1258- return self . flattenedOrderedBuildOptions . flatMap { $0. getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) }
1267+ public func commandLineFromOptions( _ producer: any CommandProducer , scope: MacroEvaluationScope , inputFileType: FileTypeSpec ? , optionContext: ( any BuildOptionGenerationContext ) ? , buildOptionsFilter : BuildOptionsFilter , lookup: ( ( MacroDeclaration ) -> MacroExpression ? ) ? = nil ) -> [ CommandLineArgument ] {
1268+ return producer . effectiveFlattenedOrderedBuildOptions ( self , filter : buildOptionsFilter ) . flatMap { $0. getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) }
12591269 }
12601270
12611271 /// Creates and returns the command line arguments generated by the options of the specification.
12621272 ///
12631273 /// - parameter lookup: An optional closure which functionally defined overriding values during build setting evaluation.
1264- public func commandLineFromOptions( _ cbc: CommandBuildContext , _ delegate: any DiagnosticProducingDelegate , optionContext: ( any BuildOptionGenerationContext ) ? , lookup: ( ( MacroDeclaration ) -> MacroExpression ? ) ? = nil ) -> [ CommandLineArgument ] {
1265- return commandLineFromOptions ( cbc. producer, scope: cbc. scope, inputFileType: cbc. inputs. first? . fileType, optionContext: optionContext, lookup: { self . lookup ( $0, cbc, delegate, lookup) } )
1274+ public func commandLineFromOptions( _ cbc: CommandBuildContext , _ delegate: any DiagnosticProducingDelegate , optionContext: ( any BuildOptionGenerationContext ) ? , buildOptionsFilter : BuildOptionsFilter = . all , lookup: ( ( MacroDeclaration ) -> MacroExpression ? ) ? = nil ) -> [ CommandLineArgument ] {
1275+ return commandLineFromOptions ( cbc. producer, scope: cbc. scope, inputFileType: cbc. inputs. first? . fileType, optionContext: optionContext, buildOptionsFilter : buildOptionsFilter , lookup: { self . lookup ( $0, cbc, delegate, lookup) } )
12661276 }
12671277
12681278 /// Creates and returns the command line arguments generated by the specification's build setting corresponding to the given macro declaration.
12691279 ///
12701280 /// - parameter lookup: An optional closure which functionally defined overriding values during build setting evaluation.
12711281 func commandLineFromMacroDeclaration( _ producer: any CommandProducer , optionContext: ( any BuildOptionGenerationContext ) ? , scope: MacroEvaluationScope , macro: MacroDeclaration , inputFileType: FileTypeSpec ? , lookup: ( ( MacroDeclaration ) -> MacroExpression ? ) ? = nil ) -> [ CommandLineArgument ] {
1272- return buildOptions . first { $0. name == macro. name } ? . getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) ?? [ ]
1282+ return producer . effectiveBuildOptions ( self ) . first { $0. name == macro. name } ? . getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) ?? [ ]
12731283 }
12741284
12751285 /// Creates and returns the command line arguments generated by the specification's build setting corresponding to the given macro declaration.
@@ -1285,7 +1295,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
12851295 let scope = cbc. scope
12861296 let inputFileType = cbc. inputs. first? . fileType
12871297 let lookup = { self . lookup ( $0, cbc, delegate, lookup) }
1288- return self . flattenedOrderedBuildOptions . flatMap { buildOption -> [ Path ] in
1298+ return cbc . producer . effectiveFlattenedOrderedBuildOptions ( self ) . flatMap { buildOption -> [ Path ] in
12891299 // Check if the effective arguments for this build option were non-empty as a proxy for whether it got filtered out by architecture mismatch, etc.
12901300 guard let inputInclusions = buildOption. inputInclusions, !buildOption. getArgumentsForCommand ( producer, scope: scope, inputFileType: inputFileType, optionContext: optionContext, lookup: lookup) . isEmpty else {
12911301 return [ ]
@@ -1297,7 +1307,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
12971307 /// Compute the list of additional linker arguments to use when this tool is used for building with the given scope.
12981308 public func computeAdditionalLinkerArgs( _ producer: any CommandProducer , scope: MacroEvaluationScope , inputFileTypes: [ FileTypeSpec ] , optionContext: ( any BuildOptionGenerationContext ) ? , delegate: any TaskGenerationDelegate ) async -> ( args: [ [ String ] ] , inputPaths: [ Path ] ) {
12991309 // FIXME: Optimize the list to search here.
1300- return ( args: self . flattenedOrderedBuildOptions . map { $0. getAdditionalLinkerArgs ( producer, scope: scope, inputFileTypes: inputFileTypes) } , inputPaths: [ ] )
1310+ return ( args: producer . effectiveFlattenedOrderedBuildOptions ( self ) . map { $0. getAdditionalLinkerArgs ( producer, scope: scope, inputFileTypes: inputFileTypes) } , inputPaths: [ ] )
13011311 }
13021312
13031313 // Creates and returns the environment from the specification. This includes both the 'EnvironmentVariables' property for this tool spec, and any build options which define that their value should be exported via their 'SetValueInEnvironmentVariable' property.
@@ -1313,7 +1323,7 @@ open class CommandLineToolSpec : PropertyDomainSpec, SpecType, TaskTypeDescripti
13131323
13141324 // Add environment variables from build options which specify they should be added via a 'SetValueInEnvironmentVariable' property.
13151325 // FIXME: Optimize the list to search here.
1316- for buildOption in self . flattenedOrderedBuildOptions {
1326+ for buildOption in cbc . producer . effectiveFlattenedOrderedBuildOptions ( self ) {
13171327 if let assignment = buildOption. getEnvironmentAssignmentForCommand ( cbc, lookup: wrappedLookup) {
13181328 environment. append ( assignment)
13191329 }
0 commit comments