Make TreeArtifactOutputs optional based on a config setting.

PiperOrigin-RevId: 244714749
diff --git a/src/TulsiGenerator/BazelBuildSettingsFeatures.swift b/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
index 443e8f9..11e95d4 100644
--- a/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
+++ b/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
@@ -56,6 +56,9 @@
     if options[.SwiftForcesdSYMs].commonValueAsBool ?? true {
       features.insert(.SwiftForcesdSYMs)
     }
+    if options[.TreeArtifactOutputs].commonValueAsBool ?? true {
+      features.insert(.TreeArtifactOutputs)
+    }
     return features
   }
 }
diff --git a/src/TulsiGenerator/BazelSettingsProvider.swift b/src/TulsiGenerator/BazelSettingsProvider.swift
index d730f09..efd0ed9 100644
--- a/src/TulsiGenerator/BazelSettingsProvider.swift
+++ b/src/TulsiGenerator/BazelSettingsProvider.swift
@@ -34,6 +34,12 @@
   /// See https://forums.swift.org/t/improving-swift-lldb-support-for-path-remappings/22694.
   case SwiftForcesdSYMs
 
+  /// Build using tree artifact outputs (--define=apple.experimental.tree_artifact_outputs=1).
+  /// Should only be disabled if it causes errors.
+  /// Known issues:
+  /// - Bundles with spaces in the name
+  case TreeArtifactOutputs
+
   /// TODO(b/111928007): Remove this and/or BazelSettingFeature once DebugPathNormalization is
   /// supported by all builds.
   public var stringValue: String {
@@ -42,6 +48,8 @@
         return "DebugPathNormalization"
       case .SwiftForcesdSYMs:
         return "SwiftForcesdSYMs"
+      case .TreeArtifactOutputs:
+        return "TreeArtifactOutputs"
     }
   }
 
@@ -61,6 +69,8 @@
         return true
       case .SwiftForcesdSYMs:
         return true
+      case .TreeArtifactOutputs:
+        return true
     }
   }
 
@@ -70,6 +80,8 @@
         return true
       case .SwiftForcesdSYMs:
         return false
+      case .TreeArtifactOutputs:
+        return true
     }
   }
 
@@ -83,6 +95,7 @@
     switch self {
       case .DebugPathNormalization: return ["--features=debug_prefix_map_pwd_is_dot"]
       case .SwiftForcesdSYMs: return ["--apple_generate_dsym"]
+      case .TreeArtifactOutputs: return ["--define=apple.experimental.tree_artifact_outputs=1"]
     }
   }
 
@@ -122,7 +135,6 @@
   static let tulsiCommonNonCacheableFlags = BazelFlags(build: [
       "--define=apple.add_debugger_entitlement=1",
       "--define=apple.propagate_embedded_extra_outputs=1",
-      "--define=apple.experimental.tree_artifact_outputs=1",
   ])
 
   /// Cache-able flags added by Tulsi for builds.
diff --git a/src/TulsiGenerator/TulsiOptionSet.swift b/src/TulsiGenerator/TulsiOptionSet.swift
index cdf972b..8642bad 100644
--- a/src/TulsiGenerator/TulsiOptionSet.swift
+++ b/src/TulsiGenerator/TulsiOptionSet.swift
@@ -34,6 +34,10 @@
       SuppressSwiftUpdateCheck,
       // Whether or not containing a Swift dependency forces dSYM generation (used for debugging).
       SwiftForcesdSYMs,
+      // Whether or not to use tree artifact outputs. Should only be disabled if it causes errors.
+      // Known issues:
+      // - Bundles with spaces in the name
+      TreeArtifactOutputs,
       // The path from a config file to its associated workspace root.
       WorkspaceRootPath,
 
@@ -318,6 +322,7 @@
     addBoolOption(.ProjectPrioritizesSwift, .Generic, false)
     addBoolOption(.UseArm64_32, .Generic, false)
     addBoolOption(.SwiftForcesdSYMs, .Generic, true)
+    addBoolOption(.TreeArtifactOutputs, .Generic, true)
 
     let defaultIdentifier = PlatformConfiguration.defaultConfiguration.identifier
     let platformCPUIdentifiers = PlatformConfiguration.allValidConfigurations.map { $0.identifier }
diff --git a/src/TulsiGenerator/en.lproj/Options.strings b/src/TulsiGenerator/en.lproj/Options.strings
index 15242aa..83b0594 100644
--- a/src/TulsiGenerator/en.lproj/Options.strings
+++ b/src/TulsiGenerator/en.lproj/Options.strings
@@ -55,6 +55,7 @@
 "PostBuildPhaseRunScript_DESC" = "Build phase run script that runs after the bazel_build.py script (i.e. `exec ${PATH_TO_SCRIPT}')";
 
 "SwiftForcesdSYMs" = "Swift code dependency enables dSYMs (required for debugging).";
+"TreeArtifactOutputs" = "Enable tree artifact outputs (--define=apple.experimental.tree_artifact_outputs=1). Disable if you're having issues.";
 
 "SuppressSwiftUpdateCheck" = "Suppress Xcode Swift update check";
 "SuppressSwiftUpdateCheck_DESC" = "Suppresses Xcode's update notification for projects containing Swift code. This asserts that the Swift code is at least version 2.1.";