Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conditionally handle --apple_compiler & --apple_grte_top #798

Merged
merged 2 commits into from
Oct 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ use_repo(
"rules_apple_api",
)

rules_ios_bazel_version_deps = use_extension("//rules:module_extensions.bzl", "rules_ios_bazel_version_deps")
use_repo(
rules_ios_bazel_version_deps,
"rules_ios_bazel_version",
)

# Load non-bzlmod dependencies from rules_ios
non_module_deps = use_extension("//rules:module_extensions.bzl", "non_module_deps")
use_repo(
Expand Down
2 changes: 2 additions & 0 deletions rules/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ bzl_library(
srcs = ["transition_support.bzl"],
visibility = ["//visibility:public"],
deps = [
"//rules/internal:bazel_version",
"@build_bazel_apple_support//lib:apple_support",
"@rules_apple_api//:api",
"@rules_ios_bazel_version//:api",
],
)

Expand Down
6 changes: 6 additions & 0 deletions rules/internal/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")

bzl_library(
name = "bazel_version",
srcs = ["bazel_version.bzl"],
visibility = ["//rules:__pkg__"],
)

bzl_library(
name = "objc_provider_utils",
srcs = ["objc_provider_utils.bzl"],
Expand Down
20 changes: 20 additions & 0 deletions rules/internal/bazel_version.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"Bazel version parsing"

def get_bazel_version(bazel_version = getattr(native, "bazel_version", "")):
"""
Parse the Bazel version into a `struct`.

Args:
bazel_version: String representing the Bazel version.

Returns:
Bazel version represented as a `struct` with the major, minor, and path
attributes.
"""
if bazel_version:
parts = bazel_version.split(".")
if len(parts) > 2:
return struct(major = parts[0], minor = parts[1], patch = parts[2])

# Unknown, but don't crash
return struct(major = 0, minor = 0, patch = 0)
8 changes: 8 additions & 0 deletions rules/module_extensions.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
load(
"//rules:repositories.bzl",
"rules_apple_api",
"rules_ios_bazel_version",
"rules_ios_dependencies",
"rules_ios_dev_dependencies",
)
Expand All @@ -19,6 +20,13 @@ def _rules_apple_api(_):

rules_apple_api_deps = module_extension(implementation = _rules_apple_api)

def _rules_ios_bazel_version(_):
rules_ios_bazel_version(
name = "rules_ios_bazel_version",
)

rules_ios_bazel_version_deps = module_extension(implementation = _rules_ios_bazel_version)

def _non_module_deps_impl(_):
rules_ios_dependencies(
load_bzlmod_dependencies = False,
Expand Down
46 changes: 35 additions & 11 deletions rules/repositories.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ load(
"@bazel_tools//tools/build_defs/repo:git.bzl",
"new_git_repository",
)
load(
"//rules/internal:bazel_version.bzl",
"get_bazel_version",
)

def _maybe(repo_rule, name, **kwargs):
"""Executes the given repository rule if it hasn't been executed already.
Expand Down Expand Up @@ -48,16 +52,6 @@ def github_repo(name, project, repo, ref, sha256 = None, **kwargs):
**kwargs
)

def _get_bazel_version():
bazel_version = getattr(native, "bazel_version", "")
if bazel_version:
parts = bazel_version.split(".")
if len(parts) > 2:
return struct(major = parts[0], minor = parts[1], patch = parts[2])

# Unknown, but don't crash
return struct(major = 0, minor = 0, patch = 0)

def rules_ios_dependencies(
load_bzlmod_dependencies = True,
load_rules_apple_2_dependencies = False):
Expand Down Expand Up @@ -98,6 +92,7 @@ def _rules_apple_api_impl(ctx):
# This simply symlinks the diretory rules/rules_apple_api/$vesrion onto "@rules_apple_api" where we import
# the interface.
base_path = str(ctx.path(ctx.attr.rules_ios).dirname)

path = base_path + "/rules/rules_apple_api/" + ctx.attr.version
ctx.symlink(path, "")

Expand All @@ -110,12 +105,41 @@ rules_apple_api = repository_rule(
local = True,
)

def _rules_ios_bazel_version_impl(ctx):
ctx.file("BUILD.bazel", content = """
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")

bzl_library(
name = "api",
srcs = [
"version.bzl",
],
visibility = ["//visibility:public"],
)
""")

# Write Bazel version to a file
ctx.file("version.bzl", content = "bazel_version = \"{}\"".format(ctx.attr._bazel_version))

rules_ios_bazel_version = repository_rule(
implementation = _rules_ios_bazel_version_impl,
attrs = {
"_bazel_version": attr.string(default = getattr(native, "bazel_version", "")),
},
local = True,
)

def _rules_ios_bzlmod_dependencies(load_rules_apple_2_dependencies = False):
"""Fetches repositories that are dependencies of `rules_ios`

These are only included when using WORKSPACE, when using bzlmod they're loaded in MODULE.bazel
"""
bazel_version = _get_bazel_version()
_maybe(
rules_ios_bazel_version,
name = "rules_ios_bazel_version",
)

bazel_version = get_bazel_version()
if bazel_version.major == "5":
# For rules_apple 1.x, we maintained a tag rules_ios_1.0

Expand Down
28 changes: 23 additions & 5 deletions rules/transition_support.bzl
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
"""Starlark transition support for Apple rules."""

load("@rules_apple_api//:version.bzl", "apple_api_version")
load("@rules_ios_bazel_version//:version.bzl", "bazel_version")
load(
"//rules/internal:bazel_version.bzl",
"get_bazel_version",
)

def _current_apple_platform(apple_fragment, xcode_config):
"""Returns a struct containing the platform and target os version"""
Expand Down Expand Up @@ -101,13 +106,13 @@ def _apple_rule_transition_impl(settings, attr):
"//command_line_option:apple configuration distinguisher": "applebin_" + platform_type,
"//command_line_option:apple_platform_type": platform_type,
"//command_line_option:apple_split_cpu": settings["//command_line_option:apple_split_cpu"],
"//command_line_option:compiler": settings["//command_line_option:apple_compiler"],
"//command_line_option:compiler": settings["//command_line_option:apple_compiler"] if _supports_clo_apple_compiler else None,
"//command_line_option:cpu": cpu_string,
"//command_line_option:crosstool_top": (
settings["//command_line_option:apple_crosstool_top"]
),
"//command_line_option:fission": [],
"//command_line_option:grte_top": settings["//command_line_option:apple_grte_top"],
"//command_line_option:grte_top": settings["//command_line_option:apple_grte_top"] if _supports_clo_apple_grte_top else None,
"//command_line_option:ios_minimum_os": _min_os_version_or_none(attr, attr_platforms, "ios", platform_type),
"//command_line_option:ios_multi_cpus": ios_multi_cpus,
"//command_line_option:macos_minimum_os": _min_os_version_or_none(attr, attr_platforms, "macos", platform_type),
Expand All @@ -118,25 +123,38 @@ def _apple_rule_transition_impl(settings, attr):

_supports_visionos = hasattr(apple_common.platform_type, "visionos")

_bazel_version = get_bazel_version(bazel_version)
_bazel_major_version = int(_bazel_version.major)

# `--apple_compiler` was removed in https://github.com/bazelbuild/bazel/commit/1acdfc422e724b4fe12c7bf5248086ab514ec4be
_supports_clo_apple_compiler = _bazel_major_version < 7

# `--apple_grte_top` was removed in https://github.com/bazelbuild/bazel/commit/fb4106bdbd23c365337ea99704921ada7b86c2df
_supports_clo_apple_grte_top = _bazel_major_version < 7

# These flags are a mix of options defined in native Bazel from the following fragments:
# - https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
# - https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
# - https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
_apple_rule_transition = transition(
implementation = _apple_rule_transition_impl,
inputs = [
"//command_line_option:apple_compiler",
"//command_line_option:apple_crosstool_top",
"//command_line_option:apple_platform_type",
"//command_line_option:apple_grte_top",
"//command_line_option:cpu",
"//command_line_option:ios_multi_cpus",
"//command_line_option:macos_cpus",
"//command_line_option:tvos_cpus",
"//command_line_option:watchos_cpus",
"//command_line_option:apple_split_cpu",
"//command_line_option:macos_minimum_os",
] + (["//command_line_option:visionos_cpus"] if _supports_visionos else []),
] + (
["//command_line_option:visionos_cpus"] if _supports_visionos else []
) + (
["//command_line_option:apple_compiler"] if _supports_clo_apple_compiler else []
) + (
["//command_line_option:apple_grte_top"] if _supports_clo_apple_grte_top else []
),
outputs = [
"//command_line_option:apple configuration distinguisher",
"//command_line_option:apple_platform_type",
Expand Down