Add a new option to Tulsi: ProjectGenerationBazelStartupOptions

PiperOrigin-RevId: 252471587
diff --git a/src/Tulsi/TulsiGeneratorConfigDocument.swift b/src/Tulsi/TulsiGeneratorConfigDocument.swift
index a84a34a..2f4d290 100644
--- a/src/Tulsi/TulsiGeneratorConfigDocument.swift
+++ b/src/Tulsi/TulsiGeneratorConfigDocument.swift
@@ -464,6 +464,7 @@
       let ruleEntryMap: RuleEntryMap
       do {
         let startupOptions = optionSet[.BazelBuildStartupOptionsDebug]
+        let extraStartupOptions = optionSet[.ProjectGenerationBazelStartupOptions]
         let buildOptions = optionSet[.BazelBuildOptionsDebug]
         let compilationModeOption = optionSet[.ProjectGenerationCompilationMode]
         let platformConfigOption = optionSet[.ProjectGenerationPlatformConfiguration]
@@ -471,6 +472,7 @@
         let useArm64_32 = optionSet[.UseArm64_32]
         ruleEntryMap = try self.infoExtractor.ruleEntriesForLabels(selectedLabels,
                                                                    startupOptions: startupOptions,
+                                                                   extraStartupOptions: extraStartupOptions,
                                                                    buildOptions: buildOptions,
                                                                    compilationModeOption: compilationModeOption,
                                                                    platformConfigOption: platformConfigOption,
@@ -801,6 +803,7 @@
     let options = optionSet!
     let ruleEntryMap = try infoExtractor.ruleEntriesForLabels(concreteBuildTargetLabels,
                                                               startupOptions: options[.BazelBuildStartupOptionsDebug],
+                                                              extraStartupOptions: options[.ProjectGenerationBazelStartupOptions],
                                                               buildOptions: options[.BazelBuildOptionsDebug],
                                                               compilationModeOption: options[.ProjectGenerationCompilationMode],
                                                               platformConfigOption: options[.ProjectGenerationPlatformConfiguration],
diff --git a/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift b/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
index 4aa6e57..8d643cb 100644
--- a/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
+++ b/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
@@ -96,6 +96,7 @@
 
   func ruleEntriesForLabels(_ labels: [BuildLabel],
                             startupOptions: TulsiOption,
+                            extraStartupOptions: TulsiOption,
                             buildOptions: TulsiOption,
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,
@@ -114,7 +115,7 @@
       return commandLineSplitter.splitCommandLine(options) ?? []
     }
 
-    let startupOptions = splitOptionString(startupOptions.commonValue)
+    let startupOptions = splitOptionString(startupOptions.commonValue) + splitOptionString(extraStartupOptions.commonValue)
     let buildOptions = splitOptionString(buildOptions.commonValue)
     let compilationMode = compilationModeOption.commonValue
     let platformConfig = platformConfigOption.commonValue
diff --git a/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift b/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
index 18cd837..d76f9f2 100644
--- a/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
+++ b/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
@@ -28,6 +28,7 @@
   /// omitted from the returned dictionary).
   func ruleEntriesForLabels(_ labels: [BuildLabel],
                             startupOptions: TulsiOption,
+                            extraStartupOptions: TulsiOption,
                             buildOptions: TulsiOption,
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,
diff --git a/src/TulsiGenerator/TulsiOptionSet.swift b/src/TulsiGenerator/TulsiOptionSet.swift
index 8642bad..fa65e68 100644
--- a/src/TulsiGenerator/TulsiOptionSet.swift
+++ b/src/TulsiGenerator/TulsiOptionSet.swift
@@ -59,6 +59,9 @@
       // Platform configuration to use during project generation.
       ProjectGenerationPlatformConfiguration,
 
+      // Startup options for project generation.
+      ProjectGenerationBazelStartupOptions,
+
       // Improve auto-completion for include/import statements.
       ImprovedImportAutocompletionFix,
 
@@ -118,6 +121,7 @@
   typealias PersistenceType = [String: TulsiOption.PersistenceType]
 
   static let OptionKeyGroups: [TulsiOptionKey: TulsiOptionKeyGroup] = [
+      .ProjectGenerationBazelStartupOptions: .BazelBuildStartupOptions,
       .BazelBuildOptionsDebug: .BazelBuildOptions,
       .BazelBuildOptionsRelease: .BazelBuildOptions,
       .BazelBuildStartupOptionsDebug: .BazelBuildStartupOptions,
@@ -329,6 +333,7 @@
     addStringEnumOption(.ProjectGenerationPlatformConfiguration, .Generic,
                         defaultIdentifier, platformCPUIdentifiers)
     addStringEnumOption(.ProjectGenerationCompilationMode, .Generic, "dbg", ["dbg", "opt"])
+    addStringOption(.ProjectGenerationBazelStartupOptions, [.SupportsInheritKeyword])
 
     addStringOption(.CommandlineArguments, [.TargetSpecializable, .SupportsInheritKeyword])
     addStringOption(.EnvironmentVariables, [.TargetSpecializable, .SupportsInheritKeyword])
diff --git a/src/TulsiGenerator/TulsiProjectInfoExtractor.swift b/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
index c29139e..32d87e5 100644
--- a/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
+++ b/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
@@ -54,6 +54,7 @@
 
   public func ruleEntriesForInfos(_ infos: [RuleInfo],
                                   startupOptions: TulsiOption,
+                                  extraStartupOptions: TulsiOption,
                                   buildOptions: TulsiOption,
                                   compilationModeOption: TulsiOption,
                                   platformConfigOption: TulsiOption,
@@ -62,6 +63,7 @@
                                   features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     return try ruleEntriesForLabels(infos.map({ $0.label }),
                                     startupOptions: startupOptions,
+                                    extraStartupOptions: extraStartupOptions,
                                     buildOptions: buildOptions,
                                     compilationModeOption: compilationModeOption,
                                     platformConfigOption: platformConfigOption,
@@ -72,6 +74,7 @@
 
   public func ruleEntriesForLabels(_ labels: [BuildLabel],
                                    startupOptions: TulsiOption,
+                                   extraStartupOptions: TulsiOption,
                                    buildOptions: TulsiOption,
                                    compilationModeOption: TulsiOption,
                                    platformConfigOption: TulsiOption,
@@ -81,6 +84,7 @@
     do {
       return try workspaceInfoExtractor.ruleEntriesForLabels(labels,
                                                              startupOptions: startupOptions,
+                                                             extraStartupOptions: extraStartupOptions,
                                                              buildOptions: buildOptions,
                                                              compilationModeOption: compilationModeOption,
                                                              platformConfigOption: platformConfigOption,
diff --git a/src/TulsiGenerator/XcodeProjectGenerator.swift b/src/TulsiGenerator/XcodeProjectGenerator.swift
index 8be6a37..823232c 100644
--- a/src/TulsiGenerator/XcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/XcodeProjectGenerator.swift
@@ -579,6 +579,7 @@
       let features = BazelBuildSettingsFeatures.enabledFeatures(options: config.options)
       return try workspaceInfoExtractor.ruleEntriesForLabels(config.buildTargetLabels,
                                                              startupOptions: config.options[.BazelBuildStartupOptionsDebug],
+                                                             extraStartupOptions: config.options[.ProjectGenerationBazelStartupOptions],
                                                              buildOptions: config.options[.BazelBuildOptionsDebug],
                                                              compilationModeOption: config.options[.ProjectGenerationCompilationMode],
                                                              platformConfigOption: config.options[.ProjectGenerationPlatformConfiguration],
diff --git a/src/TulsiGenerator/en.lproj/Options.strings b/src/TulsiGenerator/en.lproj/Options.strings
index 83b0594..992919b 100644
--- a/src/TulsiGenerator/en.lproj/Options.strings
+++ b/src/TulsiGenerator/en.lproj/Options.strings
@@ -19,6 +19,9 @@
 "ProjectGenerationPlatformConfiguration" = "Bazel Apple platform and cpu for project generation";
 "ProjectGenerationPlatformConfiguration_DESC" = "Modify this to the expected configuration for your project. Setting this incorrectly won't break your builds but it will potentially make them slower and may potentially alter the generated project if your project depends on Bazel `select`s.";
 
+"ProjectGenerationBazelStartupOptions" = "'build' startup options used for project generation.";
+"ProjectGenerationBazelStartupOptions_DESC" = "Modify this to add startup options for bazel invocations during project generation. Note: Modifying this will trigger a server restart between project generation and building, so the first build after generating the project will be slower than usual.";
+
 "BazelBuildStartupOptions" = "'build' startup options";
 "BazelBuildStartupOptions_DESC" = "Startup options for bazel 'build' invocations.";
 "BazelBuildStartupOptionsDebug" = "Debug";
diff --git a/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift b/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
index c98b6f7..6e46319 100644
--- a/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
+++ b/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
@@ -64,6 +64,7 @@
 
   func ruleEntriesForLabels(_ labels: [BuildLabel],
                             startupOptions: TulsiOption,
+                            extraStartupOptions: TulsiOption,
                             buildOptions: TulsiOption,
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,