Add Skylark code that exports the current Xcode version and the Apple SDK versions as flags.
This will serve to replace AppleConfiguration#lateBoundOptionDefaults(). That one has to go away so that AppleConfiguration doesn't need to know the contents of the xcode_config rule anymore.
Progress towards #3424.
RELNOTES: None.
PiperOrigin-RevId: 172569961
diff --git a/src/test/shell/bazel/apple/bazel_apple_test.sh b/src/test/shell/bazel/apple/bazel_apple_test.sh
index ec655bb..fca1d6c 100755
--- a/src/test/shell/bazel/apple/bazel_apple_test.sh
+++ b/src/test/shell/bazel/apple/bazel_apple_test.sh
@@ -255,4 +255,98 @@
|| fail "expected output binary to be for armv7k architecture"
}
+function test_xcode_config_select() {
+ mkdir -p a
+ cat > a/BUILD <<'EOF'
+xcode_config(
+ name = "xcodes",
+ default = ":version10",
+ versions = [ ":version10", ":version20", ":version30" ],
+ visibility = ["//visibility:public"],
+)
+
+xcode_version(
+ name = "version10",
+ default_ios_sdk_version = "1.1",
+ default_macos_sdk_version = "1.2",
+ default_tvos_sdk_version = "1.3",
+ default_watchos_sdk_version = "1.4",
+ version = "1.0",
+)
+
+xcode_version(
+ name = "version20",
+ default_ios_sdk_version = "2.1",
+ default_macos_sdk_version = "2.2",
+ default_tvos_sdk_version = "2.3",
+ default_watchos_sdk_version = "2.4",
+ version = "2.0",
+)
+
+xcode_version(
+ name = "version30",
+ default_ios_sdk_version = "3.1",
+ default_macos_sdk_version = "3.2",
+ default_tvos_sdk_version = "3.3",
+ default_watchos_sdk_version = "3.4",
+ version = "3.0",
+)
+
+config_setting(
+ name = "xcode10",
+ flag_values = { "@bazel_tools//tools/osx:xcode_version_flag": "1.0" },
+)
+
+config_setting(
+ name = "xcode20",
+ flag_values = { "@bazel_tools//tools/osx:xcode_version_flag": "2.0" },
+)
+
+config_setting(
+ name = "ios11",
+ flag_values = { "@bazel_tools//tools/osx:ios_sdk_version_flag": "1.1" },
+)
+
+config_setting(
+ name = "ios21",
+ flag_values = { "@bazel_tools//tools/osx:ios_sdk_version_flag": "2.1" },
+)
+
+genrule(
+ name = "xcode",
+ srcs = [],
+ outs = ["xcodeo"],
+ cmd = "echo " + select({
+ ":xcode10": "XCODE 1.0",
+ ":xcode20": "XCODE 2.0",
+ "//conditions:default": "XCODE UNKNOWN",
+ }) + " >$@",)
+
+genrule(
+ name = "ios",
+ srcs = [],
+ outs = ["ioso"],
+ cmd = "echo " + select({
+ ":ios11": "IOS 1.1",
+ ":ios21": "IOS 2.1",
+ "//conditions:default": "IOS UNKNOWN",
+ }) + " >$@",)
+
+EOF
+
+ bazel build //a:xcode //a:ios --xcode_version_config=//a:xcodes || fail "build failed"
+ assert_contains "XCODE 1.0" bazel-genfiles/a/xcodeo
+ assert_contains "IOS 1.1" bazel-genfiles/a/ioso
+
+ bazel build //a:xcode //a:ios --xcode_version_config=//a:xcodes \
+ --xcode_version=2.0 || fail "build failed"
+ assert_contains "XCODE 2.0" bazel-genfiles/a/xcodeo
+ assert_contains "IOS 2.1" bazel-genfiles/a/ioso
+
+ bazel build //a:xcode //a:ios --xcode_version_config=//a:xcodes \
+ --xcode_version=3.0 || fail "build failed"
+ assert_contains "XCODE UNKNOWN" bazel-genfiles/a/xcodeo
+ assert_contains "IOS UNKNOWN" bazel-genfiles/a/ioso
+}
+
run_suite "apple_tests"
diff --git a/tools/osx/BUILD b/tools/osx/BUILD
index f9c5b8e..be32162 100644
--- a/tools/osx/BUILD
+++ b/tools/osx/BUILD
@@ -47,3 +47,22 @@
load("//tools/osx:alias_rules.bzl", "xcode_config_alias")
xcode_config_alias(name = "current_xcode_config")
+
+load(
+ "//tools/osx:xcode_version_flag.bzl",
+ "xcode_version_flag",
+ "ios_sdk_version_flag",
+ "tvos_sdk_version_flag",
+ "watchos_sdk_version_flag",
+ "macos_sdk_version_flag",
+)
+
+xcode_version_flag(name = "xcode_version_flag")
+
+ios_sdk_version_flag(name = "ios_sdk_version_flag")
+
+tvos_sdk_version_flag(name = "tvos_sdk_version_flag")
+
+watchos_sdk_version_flag(name = "watchos_sdk_version_flag")
+
+macos_sdk_version_flag(name = "macos_sdk_version_flag")
diff --git a/tools/osx/xcode_version_flag.bzl b/tools/osx/xcode_version_flag.bzl
new file mode 100644
index 0000000..5503749
--- /dev/null
+++ b/tools/osx/xcode_version_flag.bzl
@@ -0,0 +1,89 @@
+# Copyright 2017 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Rules that allows select() to differentiate between Apple OS versions."""
+
+def _xcode_version_flag_impl(ctx):
+ """A rule that allows select() to differentiate between Xcode versions."""
+ xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
+
+ return struct(providers = [
+ config_common.FeatureFlagInfo(value = str(xcode_config.xcode_version()))])
+
+
+def _ios_sdk_version_flag_impl(ctx):
+ """A rule that allows select() to select based on the iOS SDK version."""
+ xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
+
+ return struct(providers = [config_common.FeatureFlagInfo(value = str(
+ xcode_config.sdk_version_for_platform(
+ apple_common.platform.ios_device)))])
+
+
+def _tvos_sdk_version_flag_impl(ctx):
+ """A rule that allows select() to select based on the tvOS SDK version."""
+ xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
+
+ return struct(providers = [config_common.FeatureFlagInfo(value = str(
+ xcode_config.sdk_version_for_platform(
+ apple_common.platform.tvos_device)))])
+
+
+def _watchos_sdk_version_flag_impl(ctx):
+ """A rule that allows select() to select based on the watchOS SDK version."""
+ xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
+
+ return struct(providers = [config_common.FeatureFlagInfo(value = str(
+ xcode_config.sdk_version_for_platform(
+ apple_common.platform.watchos_device)))])
+
+
+def _macos_sdk_version_flag_impl(ctx):
+ """A rule that allows select() to select based on the macOS SDK version."""
+ xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
+
+ return struct(providers = [config_common.FeatureFlagInfo(value = str(
+ xcode_config.sdk_version_for_platform(
+ apple_common.platform.macos_device)))])
+
+
+xcode_version_flag = rule(
+ implementation = _xcode_version_flag_impl,
+ attrs = {
+ "_xcode_config": attr.label(default=Label("//tools/osx:current_xcode_config")),
+ })
+
+ios_sdk_version_flag = rule(
+ implementation = _ios_sdk_version_flag_impl,
+ attrs = {
+ "_xcode_config": attr.label(default=Label("//tools/osx:current_xcode_config")),
+ })
+
+tvos_sdk_version_flag = rule(
+ implementation = _tvos_sdk_version_flag_impl,
+ attrs = {
+ "_xcode_config": attr.label(default=Label("//tools/osx:current_xcode_config")),
+ })
+
+watchos_sdk_version_flag = rule(
+ implementation = _watchos_sdk_version_flag_impl,
+ attrs = {
+ "_xcode_config": attr.label(default=Label("//tools/osx:current_xcode_config")),
+ })
+
+macos_sdk_version_flag = rule(
+ implementation = _macos_sdk_version_flag_impl,
+ attrs = {
+ "_xcode_config": attr.label(default=Label("//tools/osx:current_xcode_config")),
+ })