@@ -236,11 +236,11 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
236236            throw  TestError . xcodeNotInstalled
237237        } 
238238
239-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  . xctest) 
239+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  . xctest) 
240240
241241        // Remove test output from prior runs and validate priors.
242-         if  self . options. enableExperimentalTestOutput && buildParameters . triple. supportsTestSummary { 
243-             _ =  try ?   localFileSystem. removeFileTree ( buildParameters . testOutputPath) 
242+         if  self . options. enableExperimentalTestOutput && productsBuildParameters . triple. supportsTestSummary { 
243+             _ =  try ?   localFileSystem. removeFileTree ( productsBuildParameters . testOutputPath) 
244244        } 
245245
246246        let  testProducts  =  try   buildTestsIfNeeded ( swiftCommandState:  swiftCommandState,  library:  . xctest) 
@@ -249,7 +249,7 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
249249            try   await  runTestProducts ( 
250250                testProducts, 
251251                additionalArguments:  xctestArgs, 
252-                 buildParameters :  buildParameters , 
252+                 productsBuildParameters :  productsBuildParameters , 
253253                swiftCommandState:  swiftCommandState, 
254254                library:  . xctest
255255            ) 
@@ -276,7 +276,7 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
276276            // Clean out the code coverage directory that may contain stale
277277            // profraw files from a previous run of the code coverage tool.
278278            if  self . options. enableCodeCoverage { 
279-                 try   swiftCommandState. fileSystem. removeFileTree ( buildParameters . codeCovPath) 
279+                 try   swiftCommandState. fileSystem. removeFileTree ( productsBuildParameters . codeCovPath) 
280280            } 
281281
282282            // Run the tests using the parallel runner.
@@ -286,7 +286,7 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
286286                toolchain:  toolchain, 
287287                numJobs:  options. numberOfWorkers ??  ProcessInfo . processInfo. activeProcessorCount, 
288288                buildOptions:  globalOptions. build, 
289-                 buildParameters :  buildParameters , 
289+                 productsBuildParameters :  productsBuildParameters , 
290290                shouldOutputSuccess:  swiftCommandState. logLevel <=  . info, 
291291                observabilityScope:  swiftCommandState. observabilityScope
292292            ) 
@@ -305,7 +305,7 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
305305            } 
306306
307307            if  self . options. enableExperimentalTestOutput,  !runner. ranSuccessfully { 
308-                 try   Self . handleTestOutput ( buildParameters :  buildParameters ,  packagePath:  testProducts [ 0 ] . packagePath) 
308+                 try   Self . handleTestOutput ( productsBuildParameters :  productsBuildParameters ,  packagePath:  testProducts [ 0 ] . packagePath) 
309309            } 
310310        } 
311311    } 
@@ -366,13 +366,13 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
366366    // MARK: - swift-testing
367367
368368    private  func  swiftTestingRun( _ swiftCommandState:  SwiftCommandState )  async  throws  { 
369-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  . swiftTesting) 
369+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  . swiftTesting) 
370370        let  testProducts  =  try   buildTestsIfNeeded ( swiftCommandState:  swiftCommandState,  library:  . swiftTesting) 
371371        let  additionalArguments  =  Array ( CommandLine . arguments. dropFirst ( ) ) 
372372        try   await  runTestProducts ( 
373373            testProducts, 
374374            additionalArguments:  additionalArguments, 
375-             buildParameters :  buildParameters , 
375+             productsBuildParameters :  productsBuildParameters , 
376376            swiftCommandState:  swiftCommandState, 
377377            library:  . swiftTesting
378378        ) 
@@ -408,20 +408,20 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
408408    private  func  runTestProducts( 
409409        _ testProducts:  [ BuiltTestProduct ] , 
410410        additionalArguments:  [ String ] , 
411-         buildParameters :  BuildParameters , 
411+         productsBuildParameters :  BuildParameters , 
412412        swiftCommandState:  SwiftCommandState , 
413413        library:  BuildParameters . Testing . Library 
414414    )  async  throws  { 
415415        // Clean out the code coverage directory that may contain stale
416416        // profraw files from a previous run of the code coverage tool.
417417        if  self . options. enableCodeCoverage { 
418-             try   swiftCommandState. fileSystem. removeFileTree ( buildParameters . codeCovPath) 
418+             try   swiftCommandState. fileSystem. removeFileTree ( productsBuildParameters . codeCovPath) 
419419        } 
420420
421421        let  toolchain  =  try   swiftCommandState. getTargetToolchain ( ) 
422422        let  testEnv  =  try   TestingSupport . constructTestEnvironment ( 
423423            toolchain:  toolchain, 
424-             buildParameters :  buildParameters , 
424+             destinationBuildParameters :  productsBuildParameters , 
425425            sanitizers:  globalOptions. build. sanitizers, 
426426            library:  library
427427        ) 
@@ -451,17 +451,17 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
451451        } 
452452
453453        if  self . options. enableExperimentalTestOutput,  !ranSuccessfully { 
454-             try   Self . handleTestOutput ( buildParameters :  buildParameters ,  packagePath:  testProducts [ 0 ] . packagePath) 
454+             try   Self . handleTestOutput ( productsBuildParameters :  productsBuildParameters ,  packagePath:  testProducts [ 0 ] . packagePath) 
455455        } 
456456    } 
457457
458-     private  static  func  handleTestOutput( buildParameters :  BuildParameters ,  packagePath:  AbsolutePath )  throws  { 
459-         guard  localFileSystem. exists ( buildParameters . testOutputPath)  else  { 
458+     private  static  func  handleTestOutput( productsBuildParameters :  BuildParameters ,  packagePath:  AbsolutePath )  throws  { 
459+         guard  localFileSystem. exists ( productsBuildParameters . testOutputPath)  else  { 
460460            print ( " No existing test output found. " ) 
461461            return 
462462        } 
463463
464-         let  lines  =  try   String ( contentsOfFile:  buildParameters . testOutputPath. pathString) . components ( separatedBy:  " \n " ) 
464+         let  lines  =  try   String ( contentsOfFile:  productsBuildParameters . testOutputPath. pathString) . components ( separatedBy:  " \n " ) 
465465        let  events  =  try   lines. map  {  try   JSONDecoder ( ) . decode ( TestEventRecord . self,  from:  $0)  } 
466466
467467        let  caseEvents  =  events. compactMap  {  $0. caseEvent } 
@@ -505,10 +505,10 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
505505        // Merge all the profraw files to produce a single profdata file.
506506        try   mergeCodeCovRawDataFiles ( swiftCommandState:  swiftCommandState,  library:  library) 
507507
508-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
508+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
509509        for  product  in  testProducts { 
510510            // Export the codecov data as JSON.
511-             let  jsonPath  =  buildParameters . codeCovAsJSONPath ( packageName:  rootManifest. displayName) 
511+             let  jsonPath  =  productsBuildParameters . codeCovAsJSONPath ( packageName:  rootManifest. displayName) 
512512            try   exportCodeCovAsJSON ( to:  jsonPath,  testBinary:  product. binaryPath,  swiftCommandState:  swiftCommandState,  library:  library) 
513513        } 
514514    } 
@@ -519,18 +519,18 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
519519        let  llvmProf  =  try   swiftCommandState. getTargetToolchain ( ) . getLLVMProf ( ) 
520520
521521        // Get the profraw files.
522-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
523-         let  codeCovFiles  =  try   swiftCommandState. fileSystem. getDirectoryContents ( buildParameters . codeCovPath) 
522+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
523+         let  codeCovFiles  =  try   swiftCommandState. fileSystem. getDirectoryContents ( productsBuildParameters . codeCovPath) 
524524
525525        // Construct arguments for invoking the llvm-prof tool.
526526        var  args  =  [ llvmProf. pathString,  " merge " ,  " -sparse " ] 
527527        for  file  in  codeCovFiles { 
528-             let  filePath  =  buildParameters . codeCovPath. appending ( component:  file) 
528+             let  filePath  =  productsBuildParameters . codeCovPath. appending ( component:  file) 
529529            if  filePath. extension ==  " profraw "  { 
530530                args. append ( filePath. pathString) 
531531            } 
532532        } 
533-         args +=  [ " -o " ,  buildParameters . codeCovDataFile. pathString] 
533+         args +=  [ " -o " ,  productsBuildParameters . codeCovDataFile. pathString] 
534534
535535        try   TSCBasic . Process. checkNonZeroExit ( arguments:  args) 
536536    } 
@@ -544,11 +544,11 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
544544    )  throws  { 
545545        // Export using the llvm-cov tool.
546546        let  llvmCov  =  try   swiftCommandState. getTargetToolchain ( ) . getLLVMCov ( ) 
547-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
547+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
548548        let  args  =  [ 
549549            llvmCov. pathString, 
550550            " export " , 
551-             " -instr-profile= \( buildParameters . codeCovDataFile) " , 
551+             " -instr-profile= \( productsBuildParameters . codeCovDataFile) " , 
552552            testBinary. pathString
553553        ] 
554554        let  result  =  try   TSCBasic . Process. popen ( arguments:  args) 
@@ -567,10 +567,11 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
567567        swiftCommandState:  SwiftCommandState , 
568568        library:  BuildParameters . Testing . Library 
569569    )  throws  ->  [ BuiltTestProduct ]  { 
570-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
570+         let  ( productsBuildParameters ,  toolsBuildParameters )  =  try   swiftCommandState. buildParametersForTest ( options:  self . options,  library:  library) 
571571        return  try   Commands . buildTestsIfNeeded ( 
572572            swiftCommandState:  swiftCommandState, 
573-             buildParameters:  buildParameters, 
573+             productsBuildParameters:  productsBuildParameters, 
574+             toolsBuildParameters:  toolsBuildParameters, 
574575            testProduct:  self . options. sharedOptions. testProduct
575576        ) 
576577    } 
@@ -620,8 +621,8 @@ extension SwiftTestCommand {
620621        guard  let  rootManifest =  rootManifests. values. first else  { 
621622            throw  StringError ( " invalid manifests at  \( root. packages) " ) 
622623        } 
623-         let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( enableCodeCoverage:  true ,  library:  . xctest) 
624-         print ( buildParameters . codeCovAsJSONPath ( packageName:  rootManifest. displayName) ) 
624+         let  ( productsBuildParameters ,  _ )  =  try   swiftCommandState. buildParametersForTest ( enableCodeCoverage:  true ,  library:  . xctest) 
625+         print ( productsBuildParameters . codeCovAsJSONPath ( packageName:  rootManifest. displayName) ) 
625626     } 
626627 } 
627628
@@ -632,7 +633,7 @@ extension SwiftTestCommand {
632633
633634        func  run( _ swiftCommandState:  SwiftCommandState )  throws  { 
634635            try   SwiftTestCommand . handleTestOutput ( 
635-                 buildParameters :  try   swiftCommandState. productsBuildParameters, 
636+                 productsBuildParameters :  try   swiftCommandState. productsBuildParameters, 
636637                packagePath:  localFileSystem. currentWorkingDirectory ??  . root // by definition runs in the current working directory
637638            ) 
638639        } 
@@ -660,12 +661,16 @@ extension SwiftTestCommand {
660661        // MARK: - XCTest
661662
662663        private  func  xctestRun( _ swiftCommandState:  SwiftCommandState )  throws  { 
663-              let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( 
664+           let  ( productsBuildParameters ,  toolsBuildParameters )  =  try   swiftCommandState. buildParametersForTest ( 
664665                enableCodeCoverage:  false , 
665666                shouldSkipBuilding:  sharedOptions. shouldSkipBuilding, 
666667                library:  . xctest
667668            ) 
668-             let  testProducts  =  try   buildTestsIfNeeded ( swiftCommandState:  swiftCommandState,  buildParameters:  buildParameters) 
669+             let  testProducts  =  try   buildTestsIfNeeded ( 
670+                 swiftCommandState:  swiftCommandState, 
671+                 productsBuildParameters:  productsBuildParameters, 
672+                 toolsBuildParameters:  toolsBuildParameters
673+             ) 
669674            let  testSuites  =  try   TestingSupport . getTestSuites ( 
670675                in:  testProducts, 
671676                swiftCommandState:  swiftCommandState, 
@@ -684,20 +689,21 @@ extension SwiftTestCommand {
684689        // MARK: - swift-testing
685690
686691        private  func  swiftTestingRun( _ swiftCommandState:  SwiftCommandState )  throws  { 
687-             let  buildParameters  =  try   swiftCommandState. buildParametersForTest ( 
692+             let  ( productsBuildParameters ,  toolsBuildParameters )  =  try   swiftCommandState. buildParametersForTest ( 
688693                enableCodeCoverage:  false , 
689694                shouldSkipBuilding:  sharedOptions. shouldSkipBuilding, 
690695                library:  . swiftTesting
691696            ) 
692697            let  testProducts  =  try   buildTestsIfNeeded ( 
693698                swiftCommandState:  swiftCommandState, 
694-                 buildParameters:  buildParameters
699+                 productsBuildParameters:  productsBuildParameters, 
700+                 toolsBuildParameters:  toolsBuildParameters
695701            ) 
696702
697703            let  toolchain  =  try   swiftCommandState. getTargetToolchain ( ) 
698704            let  testEnv  =  try   TestingSupport . constructTestEnvironment ( 
699705                toolchain:  toolchain, 
700-                 buildParameters :  buildParameters , 
706+                 destinationBuildParameters :  productsBuildParameters , 
701707                sanitizers:  globalOptions. build. sanitizers, 
702708                library:  . swiftTesting
703709            ) 
@@ -737,11 +743,13 @@ extension SwiftTestCommand {
737743
738744        private  func  buildTestsIfNeeded( 
739745            swiftCommandState:  SwiftCommandState , 
740-             buildParameters:  BuildParameters 
746+             productsBuildParameters:  BuildParameters , 
747+             toolsBuildParameters:  BuildParameters 
741748        )  throws  ->  [ BuiltTestProduct ]  { 
742749            return  try   Commands . buildTestsIfNeeded ( 
743750                swiftCommandState:  swiftCommandState, 
744-                 buildParameters:  buildParameters, 
751+                 productsBuildParameters:  productsBuildParameters, 
752+                 toolsBuildParameters:  toolsBuildParameters, 
745753                testProduct:  self . sharedOptions. testProduct
746754            ) 
747755        } 
@@ -934,7 +942,7 @@ final class ParallelTestRunner {
934942    private  let  toolchain :  UserToolchain 
935943
936944    private  let  buildOptions :  BuildOptions 
937-     private  let  buildParameters :  BuildParameters 
945+     private  let  productsBuildParameters :  BuildParameters 
938946
939947    /// Number of tests to execute in parallel.
940948    private  let  numJobs :  Int 
@@ -951,7 +959,7 @@ final class ParallelTestRunner {
951959        toolchain:  UserToolchain , 
952960        numJobs:  Int , 
953961        buildOptions:  BuildOptions , 
954-         buildParameters :  BuildParameters , 
962+         productsBuildParameters :  BuildParameters , 
955963        shouldOutputSuccess:  Bool , 
956964        observabilityScope:  ObservabilityScope 
957965    )  { 
@@ -978,7 +986,7 @@ final class ParallelTestRunner {
978986        } 
979987
980988        self . buildOptions =  buildOptions
981-         self . buildParameters  =  buildParameters 
989+         self . productsBuildParameters  =  productsBuildParameters 
982990
983991        assert ( numJobs >  0 ,  " num jobs should be > 0 " ) 
984992    } 
@@ -1008,7 +1016,7 @@ final class ParallelTestRunner {
10081016
10091017        let  testEnv  =  try   TestingSupport . constructTestEnvironment ( 
10101018            toolchain:  self . toolchain, 
1011-             buildParameters :  self . buildParameters , 
1019+             destinationBuildParameters :  self . productsBuildParameters , 
10121020            sanitizers:  self . buildOptions. sanitizers, 
10131021            library:  . xctest // swift-testing does not use ParallelTestRunner
10141022        ) 
@@ -1076,7 +1084,7 @@ final class ParallelTestRunner {
10761084
10771085        // Print test results.
10781086        for  test  in  processedTests. get ( )  { 
1079-             if  ( !test. success || shouldOutputSuccess)  && !buildParameters . testingParameters. experimentalTestOutput { 
1087+             if  ( !test. success || shouldOutputSuccess)  && !productsBuildParameters . testingParameters. experimentalTestOutput { 
10801088                // command's result output goes on stdout
10811089                // ie "swift test" should output to stdout
10821090                print ( test. output) 
@@ -1295,7 +1303,7 @@ extension SwiftCommandState {
12951303    func  buildParametersForTest( 
12961304        options:  TestCommandOptions , 
12971305        library:  BuildParameters . Testing . Library 
1298-     )  throws  ->  BuildParameters  { 
1306+     )  throws  ->  ( productsBuildParameters :   BuildParameters ,  toolsBuildParameters :   BuildParameters )  { 
12991307        var  result  =  try   self . buildParametersForTest ( 
13001308            enableCodeCoverage:  options. enableCodeCoverage, 
13011309            enableTestability:  options. enableTestableImports, 
@@ -1304,7 +1312,8 @@ extension SwiftCommandState {
13041312            library:  library
13051313        ) 
13061314        if  try   options. testLibraryOptions. enableSwiftTestingLibrarySupport ( swiftCommandState:  self )  { 
1307-             result. flags. swiftCompilerFlags +=  [ " -DSWIFT_PM_SUPPORTS_SWIFT_TESTING " ] 
1315+             result. productsBuildParameters. flags. swiftCompilerFlags +=  [ " -DSWIFT_PM_SUPPORTS_SWIFT_TESTING " ] 
1316+             result. toolsBuildParameters. flags. swiftCompilerFlags +=  [ " -DSWIFT_PM_SUPPORTS_SWIFT_TESTING " ] 
13081317        } 
13091318        return  result
13101319    } 
@@ -1364,10 +1373,14 @@ private extension Basics.Diagnostic {
13641373/// - Returns: The paths to the build test products.
13651374private  func  buildTestsIfNeeded( 
13661375    swiftCommandState:  SwiftCommandState , 
1367-     buildParameters:  BuildParameters , 
1376+     productsBuildParameters:  BuildParameters , 
1377+     toolsBuildParameters:  BuildParameters , 
13681378    testProduct:  String ? 
13691379)  throws  ->  [ BuiltTestProduct ]  { 
1370-     let  buildSystem  =  try   swiftCommandState. createBuildSystem ( productsBuildParameters:  buildParameters) 
1380+     let  buildSystem  =  try   swiftCommandState. createBuildSystem ( 
1381+         productsBuildParameters:  productsBuildParameters, 
1382+         toolsBuildParameters:  toolsBuildParameters
1383+     ) 
13711384
13721385    let  subset  =  testProduct. map ( BuildSubset . product)  ??  . allIncludingTests
13731386    try   buildSystem. build ( subset:  subset) 
0 commit comments