Always build both armv7k and arm64_32 architectures when targeting a physical watchOS device or building an application for a physical iOS device that also includes a watch app.

When you build a watchOS target, Xcode does not provide a way to definitively determine the architecture of a connected watchOS device during the run script phase like it does for iOS devices (via the ARCHS environment variable) so we can't know which architecture to target when performing our bazel build.

To ensure we always have the proper application architecture that needs to be deployed, always build a fat binary that includes the slices for both archs.

Also removes alternate "Building for Apple Watch Series 4" option that is now unnecessary since we're always building for it.

PiperOrigin-RevId: 264886356
diff --git a/src/Tulsi/TulsiGeneratorConfigDocument.swift b/src/Tulsi/TulsiGeneratorConfigDocument.swift
index 2f4d290..490cd5a 100644
--- a/src/Tulsi/TulsiGeneratorConfigDocument.swift
+++ b/src/Tulsi/TulsiGeneratorConfigDocument.swift
@@ -469,7 +469,6 @@
         let compilationModeOption = optionSet[.ProjectGenerationCompilationMode]
         let platformConfigOption = optionSet[.ProjectGenerationPlatformConfiguration]
         let prioritizeSwiftOption = optionSet[.ProjectPrioritizesSwift]
-        let useArm64_32 = optionSet[.UseArm64_32]
         ruleEntryMap = try self.infoExtractor.ruleEntriesForLabels(selectedLabels,
                                                                    startupOptions: startupOptions,
                                                                    extraStartupOptions: extraStartupOptions,
@@ -477,7 +476,6 @@
                                                                    compilationModeOption: compilationModeOption,
                                                                    platformConfigOption: platformConfigOption,
                                                                    prioritizeSwiftOption: prioritizeSwiftOption,
-                                                                   useArm64_32Option: useArm64_32,
                                                                    features: self.enabledFeatures(options: optionSet))
       } catch TulsiProjectInfoExtractor.ExtractorError.ruleEntriesFailed(let info) {
         LogMessage.postError("Label resolution failed: \(info)")
@@ -808,7 +806,6 @@
                                                               compilationModeOption: options[.ProjectGenerationCompilationMode],
                                                               platformConfigOption: options[.ProjectGenerationPlatformConfiguration],
                                                               prioritizeSwiftOption: options[.ProjectPrioritizesSwift],
-                                                              useArm64_32Option: options[.UseArm64_32],
                                                               features: enabledFeatures(options: options))
     var unresolvedLabels = Set<BuildLabel>()
     var ruleInfos = [UIRuleInfo]()
diff --git a/src/TulsiGenerator/BazelAspectInfoExtractor.swift b/src/TulsiGenerator/BazelAspectInfoExtractor.swift
index 39ce0c7..36138b9 100644
--- a/src/TulsiGenerator/BazelAspectInfoExtractor.swift
+++ b/src/TulsiGenerator/BazelAspectInfoExtractor.swift
@@ -73,7 +73,6 @@
                                    compilationMode: String? = nil,
                                    platformConfig: String? = nil,
                                    prioritizeSwift: Bool? = nil,
-                                   useArm64_32: Bool? = nil,
                                    features: Set<BazelSettingFeature> = []) throws -> RuleEntryMap {
     guard !targets.isEmpty else {
       return RuleEntryMap()
@@ -85,7 +84,6 @@
                                           compilationMode: compilationMode,
                                           platformConfig: platformConfig,
                                           prioritizeSwift: prioritizeSwift,
-                                          useArm64_32: useArm64_32,
                                           features: features)
   }
 
@@ -97,7 +95,6 @@
                                           compilationMode: String?,
                                           platformConfig: String?,
                                           prioritizeSwift: Bool?,
-                                          useArm64_32: Bool?,
                                           features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     localizedMessageLogger.infoMessage("Build Events JSON file at \"\(buildEventsFilePath)\"")
 
@@ -119,7 +116,6 @@
                                                compilationMode: compilationMode,
                                                platformConfig: platformConfig,
                                                prioritizeSwift: prioritizeSwift,
-                                               useArm64_32: useArm64_32,
                                                features: features,
                                                progressNotifier: progressNotifier) {
                                                 (process: Process, debugInfo: String) -> Void in
@@ -179,7 +175,6 @@
                                             compilationMode: String?,
                                             platformConfig: String?,
                                             prioritizeSwift: Bool?,
-                                            useArm64_32: Bool?,
                                             features: Set<BazelSettingFeature>,
                                             progressNotifier: ProgressNotifier? = nil,
                                             terminationHandler: @escaping CompletionHandler) -> Process? {
@@ -205,10 +200,6 @@
       config = PlatformConfiguration.defaultConfiguration
     }
 
-    if let useArm64_32 = useArm64_32 {
-      PlatformConfiguration.useArm64_32 = useArm64_32
-    }
-
     let tulsiFlags = bazelSettingsProvider.tulsiFlags(hasSwift: hasSwift,
                                                       options: nil,
                                                       features: features).getFlags(forDebug: isDbg)
diff --git a/src/TulsiGenerator/BazelBuildSettingsFeatures.swift b/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
index 11e95d4..3693a22 100644
--- a/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
+++ b/src/TulsiGenerator/BazelBuildSettingsFeatures.swift
@@ -33,7 +33,11 @@
     }
 
     if case .ios = platform {
-      flags.append("--\(PlatformType.watchos.bazelCPUPlatform)_cpus=\(cpu.watchCPU.rawValue)")
+      // Xcode doesn't provide a way to determine the architecture of a paired
+      // watch so target both watchOS cpus when building for iOS, otherwise we
+      // might unintentionally install a watch app with the wrong architecture.
+      let cpus = "\(CPU.armv7k.rawValue),\(CPU.arm64_32.rawValue)"
+      flags.append("--\(PlatformType.watchos.bazelCPUPlatform)_cpus=\(cpus)")
     }
 
     return flags
diff --git a/src/TulsiGenerator/BazelSettingsProvider.swift b/src/TulsiGenerator/BazelSettingsProvider.swift
index dfe61a5..6205db9 100644
--- a/src/TulsiGenerator/BazelSettingsProvider.swift
+++ b/src/TulsiGenerator/BazelSettingsProvider.swift
@@ -275,10 +275,6 @@
       defaultConfig = PlatformConfiguration.defaultConfiguration
     }
 
-    if let useArm64_32 = options[.UseArm64_32].commonValueAsBool {
-      PlatformConfiguration.useArm64_32 = useArm64_32
-    }
-
     return BazelBuildSettings(bazel: bazel,
                               bazelExecRoot: bazelExecRoot,
                               defaultPlatformConfigIdentifier: defaultConfig.identifier,
diff --git a/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift b/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
index 8d643cb..ef6812c 100644
--- a/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
+++ b/src/TulsiGenerator/BazelWorkspaceInfoExtractor.swift
@@ -101,7 +101,6 @@
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,
                             prioritizeSwiftOption: TulsiOption,
-                            useArm64_32Option: TulsiOption,
                             features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     func isLabelMissing(_ label: BuildLabel) -> Bool {
       return !ruleEntryCache.hasAnyRuleEntry(withBuildLabel: label)
@@ -120,7 +119,6 @@
     let compilationMode = compilationModeOption.commonValue
     let platformConfig = platformConfigOption.commonValue
     let prioritizeSwift = prioritizeSwiftOption.commonValueAsBool
-    let useArm64_32Option = useArm64_32Option.commonValueAsBool
 
     do {
       let ruleEntryMap =
@@ -130,7 +128,6 @@
                                                         compilationMode: compilationMode,
                                                         platformConfig: platformConfig,
                                                         prioritizeSwift: prioritizeSwift,
-                                                        useArm64_32: useArm64_32Option,
                                                         features: features)
       ruleEntryCache = RuleEntryMap(ruleEntryMap)
     } catch BazelAspectInfoExtractor.ExtractorError.buildFailed {
diff --git a/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift b/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
index d76f9f2..49d2f0a 100644
--- a/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
+++ b/src/TulsiGenerator/BazelWorkspaceInfoExtractorProtocol.swift
@@ -33,7 +33,6 @@
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,
                             prioritizeSwiftOption: TulsiOption,
-                            useArm64_32Option: TulsiOption,
                             features: Set<BazelSettingFeature>) throws -> RuleEntryMap
 
   /// Extracts labels for the files referenced by the build infrastructure for the given set of
diff --git a/src/TulsiGenerator/DeploymentTarget.swift b/src/TulsiGenerator/DeploymentTarget.swift
index 68d91ba..c4eb0f2 100644
--- a/src/TulsiGenerator/DeploymentTarget.swift
+++ b/src/TulsiGenerator/DeploymentTarget.swift
@@ -39,8 +39,7 @@
   }
 
   var watchCPU: CPU {
-    let armCPU = PlatformConfiguration.useArm64_32 ? CPU.arm64_32 : .armv7k
-    return isARM ? armCPU : .i386
+    return isARM ? .armv7k : .i386
   }
 }
 
@@ -49,7 +48,6 @@
 
   public let platform: PlatformType
   public let cpu: CPU
-  public static var useArm64_32 = false
 
   /// Default to iOS 64-bit simulator.
   public static let defaultConfiguration = PlatformConfiguration(platform: .ios, cpu: .x86_64)
diff --git a/src/TulsiGenerator/TulsiOptionSet.swift b/src/TulsiGenerator/TulsiOptionSet.swift
index a7a7728..f931b9d 100644
--- a/src/TulsiGenerator/TulsiOptionSet.swift
+++ b/src/TulsiGenerator/TulsiOptionSet.swift
@@ -75,11 +75,7 @@
       PreBuildPhaseRunScript,
 
       // Custom build phase run script that runs after bazel build.
-      PostBuildPhaseRunScript,
-
-      // When building an iOS app with a companion watchOS app, the default architecture for the
-      // watchOS app will be armv7k. This option overrides the default and uses arm64_32 instead.
-      UseArm64_32
+      PostBuildPhaseRunScript
 
   // Options for build invocations.
   case BazelBuildOptionsDebug,
@@ -324,7 +320,6 @@
     addBoolOption(.ImprovedImportAutocompletionFix, .Generic, true)
     addBoolOption(.GenerateRunfiles, .Generic, false)
     addBoolOption(.ProjectPrioritizesSwift, .Generic, false)
-    addBoolOption(.UseArm64_32, .Generic, false)
     addBoolOption(.SwiftForcesdSYMs, .Generic, true)
     addBoolOption(.TreeArtifactOutputs, .Generic, true)
 
diff --git a/src/TulsiGenerator/TulsiProjectInfoExtractor.swift b/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
index 32d87e5..a5dc9f1 100644
--- a/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
+++ b/src/TulsiGenerator/TulsiProjectInfoExtractor.swift
@@ -59,7 +59,6 @@
                                   compilationModeOption: TulsiOption,
                                   platformConfigOption: TulsiOption,
                                   prioritizeSwiftOption: TulsiOption,
-                                  useArm64_32Option: TulsiOption,
                                   features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     return try ruleEntriesForLabels(infos.map({ $0.label }),
                                     startupOptions: startupOptions,
@@ -68,7 +67,6 @@
                                     compilationModeOption: compilationModeOption,
                                     platformConfigOption: platformConfigOption,
                                     prioritizeSwiftOption: prioritizeSwiftOption,
-                                    useArm64_32Option: useArm64_32Option,
                                     features: features)
   }
 
@@ -79,7 +77,6 @@
                                    compilationModeOption: TulsiOption,
                                    platformConfigOption: TulsiOption,
                                    prioritizeSwiftOption: TulsiOption,
-                                   useArm64_32Option: TulsiOption,
                                    features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     do {
       return try workspaceInfoExtractor.ruleEntriesForLabels(labels,
@@ -89,7 +86,6 @@
                                                              compilationModeOption: compilationModeOption,
                                                              platformConfigOption: platformConfigOption,
                                                              prioritizeSwiftOption: prioritizeSwiftOption,
-                                                             useArm64_32Option: useArm64_32Option,
                                                              features: features)
     } catch BazelWorkspaceInfoExtractorError.aspectExtractorFailed(let info) {
       throw ExtractorError.ruleEntriesFailed(info)
diff --git a/src/TulsiGenerator/XcodeProjectGenerator.swift b/src/TulsiGenerator/XcodeProjectGenerator.swift
index 0de351f..66554ac 100644
--- a/src/TulsiGenerator/XcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/XcodeProjectGenerator.swift
@@ -613,7 +613,6 @@
                                                              compilationModeOption: config.options[.ProjectGenerationCompilationMode],
                                                              platformConfigOption: config.options[.ProjectGenerationPlatformConfiguration],
                                                              prioritizeSwiftOption: config.options[.ProjectPrioritizesSwift],
-                                                             useArm64_32Option: config.options[.UseArm64_32],
                                                              features: features)
     } catch BazelWorkspaceInfoExtractorError.aspectExtractorFailed(let info) {
       throw ProjectGeneratorError.labelAspectFailure(info)
diff --git a/src/TulsiGenerator/en.lproj/Options.strings b/src/TulsiGenerator/en.lproj/Options.strings
index 992919b..5dc8af7 100644
--- a/src/TulsiGenerator/en.lproj/Options.strings
+++ b/src/TulsiGenerator/en.lproj/Options.strings
@@ -33,8 +33,6 @@
 
 "GenerateRunfiles" = "Generate the runfiles directory used as TEST_SRCDIR";
 
-"UseArm64_32" = "Building for Apple Watch Series 4";
-"UseArm64_32_DESC" = "Enable this option only if you are building to a Series 4 device in Xcode 10 or greater. The default when building for a iOS device with a watch app is the 32bit armv7k architecture.";
 "ProjectPrioritizesSwift" = "Prioritize for Swift development instead of (Obj-)C(++)";
 "ProjectPrioritizesSwift_DESC" = "Tulsi uses this to try to improve Bazel caching; set this if you anticipate that most of your builds inside of the generated xcodeproj depend on Swift in some way. Setting this incorrectly won't break your builds but it will potentially make them slower.";
 "CLANG_CXX_LANGUAGE_STANDARD" = "C++ language standard";
diff --git a/src/TulsiGeneratorTests/BazelSettingsProviderTests.swift b/src/TulsiGeneratorTests/BazelSettingsProviderTests.swift
index 8f1df22..7ba542f 100644
--- a/src/TulsiGeneratorTests/BazelSettingsProviderTests.swift
+++ b/src/TulsiGeneratorTests/BazelSettingsProviderTests.swift
@@ -23,7 +23,7 @@
   let bazelSettingsProvider = BazelSettingsProvider(universalFlags: BazelFlags())
 
 
-  func testBazelBuildSettingsProviderWithoutArm64_32Flag() {
+  func testBazelBuildSettingsProviderForWatchOS() {
     let options = TulsiOptionSet()
     let settings = bazelSettingsProvider.buildSettings(bazel:bazel,
                                                        bazelExecRoot: bazelExecRoot,
@@ -31,40 +31,16 @@
                                                        features: features,
                                                        buildRuleEntries: buildRuleEntries)
 
-    let arm64_32Flag = "--watchos_cpus=arm64_32"
-    // Check that the arm64_32 flag is not set anywhere it shouldn't be by default.
+    let expectedFlag = "--watchos_cpus=armv7k,arm64_32"
+    let expectedIdentifiers = Set(["watchos_armv7k", "watchos_arm64_32"])
+    // Check that both watchos flags are set for both architectures.
     for (identifier, flags) in settings.platformConfigurationFlags {
-      if identifier != "watchos_arm64_32" {
-        XCTAssert(!flags.contains(arm64_32Flag),
-                  "arm64_32 flag was unexpectedly set for \(identifier) by default. \(flags)")
-      }
-    }
-  }
-
-  func testBazelBuildSettingsProviderWithArm64_32Flag() {
-    let options = TulsiOptionSet()
-    // Manually enable the Tulsi option to force use arm64_32.
-    options.options[.UseArm64_32]?.projectValue = "YES"
-
-    let settings = bazelSettingsProvider.buildSettings(bazel:bazel,
-                                                        bazelExecRoot: bazelExecRoot,
-                                                        options: options,
-                                                        features: Set<BazelSettingFeature>(),
-                                                        buildRuleEntries: Set<RuleEntry>())
-
-    let arm64_32Flag = "--watchos_cpus=arm64_32"
-    // The flags corresponding to these identifiers will contain '--watchos_cpus=armv7k' which
-    // must be overidden.
-    let identifiersToOverride = Set(["ios_armv7", "ios_arm64", "ios_arm64e", "watchos_armv7k"])
-
-    // Test that the arm64_32 flag is set in the proper locations.
-    for (identifier, flags) in settings.platformConfigurationFlags {
-      if identifier == "watchos_arm64_32" || identifiersToOverride.contains(identifier) {
-        XCTAssert(flags.contains(arm64_32Flag),
-                  "arm64_32 flag was not set for \(identifier) by the UseArm64_32 option. \(flags)")
+      if (expectedIdentifiers.contains(identifier)) {
+        XCTAssert(flags.contains(expectedFlag),
+                  "\(expectedFlag) flag was not set for \(identifier).")
       } else {
-        XCTAssert(!flags.contains(arm64_32Flag),
-                  "arm64_32 flag was unexpectedly set for \(identifier) by the UseArm64_32 option. \(flags)")
+        XCTAssert(!flags.contains(expectedFlag),
+                  "\(expectedFlag) flag was unexpectedly set for \(identifier).")
       }
     }
   }
diff --git a/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift b/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
index e6024f3..1d80cfc 100644
--- a/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
+++ b/src/TulsiGeneratorTests/MockWorkspaceInfoExtractor.swift
@@ -73,7 +73,6 @@
                             compilationModeOption: TulsiOption,
                             platformConfigOption: TulsiOption,
                             prioritizeSwiftOption: TulsiOption,
-                            useArm64_32Option: TulsiOption,
                             features: Set<BazelSettingFeature>) throws -> RuleEntryMap {
     invalidLabels.removeAll(keepingCapacity: true)
     let ret = RuleEntryMap()