From 7ab34a613af09a79cb372d67a07875e6dd38b093 Mon Sep 17 00:00:00 2001 From: Martin Kosiba Date: Thu, 31 Jul 2025 12:49:39 +0100 Subject: [PATCH 1/2] fix: Relax exec_compatible_with requirement on dtrace rules. --- apple/BUILD | 8 ++++++++ apple/dtrace.bzl | 20 ++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/apple/BUILD b/apple/BUILD index dad2d35e6e..35dce14c1c 100644 --- a/apple/BUILD +++ b/apple/BUILD @@ -1,6 +1,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//apple/internal/aspects:resource_aspect_hint.bzl", "apple_resource_hint", "apple_resource_hint_action") load(":cc_toolchain_forwarder.bzl", "cc_toolchain_forwarder") +load(":dtrace.bzl", "dtrace_wrapper") package(default_visibility = ["//visibility:public"]) @@ -319,3 +320,10 @@ apple_resource_hint( name = "suppress_resources", action = apple_resource_hint_action.suppress, ) + +dtrace_wrapper( + name = "dtrace_wrapper", + target_compatible_with = [ + "@platforms//os:macos", + ], +) diff --git a/apple/dtrace.bzl b/apple/dtrace.bzl index 3c110aebc0..a81aa0a957 100644 --- a/apple/dtrace.bzl +++ b/apple/dtrace.bzl @@ -41,9 +41,7 @@ def _dtrace_compile_impl(ctx): output_hdrs = [] include_dir = None - dtrace = "/usr/sbin/dtrace" - if ctx.executable.dtrace: - dtrace = ctx.executable.dtrace + dtrace = ctx.executable.dtrace for src in ctx.files.srcs: owner_relative_path = bundle_paths.owner_relative_path(src) @@ -88,6 +86,7 @@ dtrace_compile = rule( mandatory = False, executable = True, cfg = "exec", + default = "//apple:dtrace_wrapper", ), "srcs": attr.label_list( allow_files = [".d"], @@ -95,9 +94,6 @@ dtrace_compile = rule( doc = "dtrace(.d) source files to be compiled.", ), }), - exec_compatible_with = [ - "@platforms//os:macos", - ], fragments = ["apple"], doc = """ Compiles @@ -116,3 +112,15 @@ and a target named `dtrace_gen` the header path would be `/dtrace_gen/foo/bar.h`. """, ) + +def _dtrace_wrapper_impl(ctx): + dtrace_wrapper = ctx.actions.declare_file("%s.sh" % ctx.label.name) + contents = """#!/bin/bash +exec /usr/sbin/dtrace "$@" +""" + ctx.actions.write(dtrace_wrapper, contents, is_executable = True) + return [DefaultInfo(files = depset([dtrace_wrapper]), executable = dtrace_wrapper)] + +dtrace_wrapper = rule( + implementation = _dtrace_wrapper_impl, +) From cb3daddcd7f7d7bed81bf5b7bdc2336e5214b63a Mon Sep 17 00:00:00 2001 From: Martin Kosiba Date: Thu, 4 Sep 2025 14:33:20 +0100 Subject: [PATCH 2/2] use a toolchain instead --- MODULE.bazel | 2 ++ apple/BUILD | 20 +++++++++++++++---- apple/dtrace.bzl | 45 +++++++++++++++++++++++------------------- apple/repositories.bzl | 2 ++ 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 323eaf5cde..63937b387f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -43,3 +43,5 @@ use_repo(provisioning_profile_repository, "local_provisioning_profiles") apple_cc_configure = use_extension("@build_bazel_apple_support//crosstool:setup.bzl", "apple_cc_configure_extension") use_repo(apple_cc_configure, "local_config_apple_cc") + +register_toolchains("//apple:dtrace_toolchain") diff --git a/apple/BUILD b/apple/BUILD index 35dce14c1c..fc64090496 100644 --- a/apple/BUILD +++ b/apple/BUILD @@ -1,7 +1,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//apple/internal/aspects:resource_aspect_hint.bzl", "apple_resource_hint", "apple_resource_hint_action") load(":cc_toolchain_forwarder.bzl", "cc_toolchain_forwarder") -load(":dtrace.bzl", "dtrace_wrapper") +load(":dtrace.bzl", "dtrace_toolchain") package(default_visibility = ["//visibility:public"]) @@ -321,9 +321,21 @@ apple_resource_hint( action = apple_resource_hint_action.suppress, ) -dtrace_wrapper( - name = "dtrace_wrapper", - target_compatible_with = [ +toolchain_type( + name = "dtrace_toolchain_type", +) + +dtrace_toolchain( + name = "dtrace_toolchain_impl", + # If no label specified the system dtrace binary is used. + dtrace = None, +) + +toolchain( + name = "dtrace_toolchain", + exec_compatible_with = [ "@platforms//os:macos", ], + toolchain = ":dtrace_toolchain_impl", + toolchain_type = ":dtrace_toolchain_type", ) diff --git a/apple/dtrace.bzl b/apple/dtrace.bzl index a81aa0a957..dab7248a5b 100644 --- a/apple/dtrace.bzl +++ b/apple/dtrace.bzl @@ -33,6 +33,27 @@ load( "bundle_paths", ) +def _dtrace_toolchain_impl(ctx): + """Implementation for dtrace_toolchain.""" + return [ + platform_common.ToolchainInfo( + dtrace_executable = ctx.executable.dtrace or "/usr/sbin/dtrace", + ), + ] + +dtrace_toolchain = rule( + implementation = _dtrace_toolchain_impl, + attrs = { + "dtrace": attr.label( + doc = "dtrace binary to use. If not set /usr/sbin/dtrace is used.", + mandatory = False, + executable = True, + cfg = "exec", + ), + }, + doc = "Defines a toolchain for dtrace_compile rules.", +) + def _dtrace_compile_impl(ctx): """Implementation for dtrace_compile.""" apple_fragment = ctx.fragments.apple @@ -41,7 +62,9 @@ def _dtrace_compile_impl(ctx): output_hdrs = [] include_dir = None - dtrace = ctx.executable.dtrace + # Get dtrace executable from toolchain + dtrace_toolchain = ctx.toolchains["//apple:dtrace_toolchain_type"] + dtrace = dtrace_toolchain.dtrace_executable for src in ctx.files.srcs: owner_relative_path = bundle_paths.owner_relative_path(src) @@ -81,19 +104,13 @@ def _dtrace_compile_impl(ctx): dtrace_compile = rule( implementation = _dtrace_compile_impl, attrs = dicts.add(apple_support.action_required_attrs(), { - "dtrace": attr.label( - doc = "dtrace binary to use.", - mandatory = False, - executable = True, - cfg = "exec", - default = "//apple:dtrace_wrapper", - ), "srcs": attr.label_list( allow_files = [".d"], allow_empty = False, doc = "dtrace(.d) source files to be compiled.", ), }), + toolchains = ["//apple:dtrace_toolchain_type"], fragments = ["apple"], doc = """ Compiles @@ -112,15 +129,3 @@ and a target named `dtrace_gen` the header path would be `/dtrace_gen/foo/bar.h`. """, ) - -def _dtrace_wrapper_impl(ctx): - dtrace_wrapper = ctx.actions.declare_file("%s.sh" % ctx.label.name) - contents = """#!/bin/bash -exec /usr/sbin/dtrace "$@" -""" - ctx.actions.write(dtrace_wrapper, contents, is_executable = True) - return [DefaultInfo(files = depset([dtrace_wrapper]), executable = dtrace_wrapper)] - -dtrace_wrapper = rule( - implementation = _dtrace_wrapper_impl, -) diff --git a/apple/repositories.bzl b/apple/repositories.bzl index 7c9f70ef32..2c6d8e97aa 100644 --- a/apple/repositories.bzl +++ b/apple/repositories.bzl @@ -138,6 +138,8 @@ def apple_rules_dependencies(ignore_version_differences = False, include_bzlmod_ ignore_version_differences = ignore_version_differences, ) + native.register_toolchains("//apple:dtrace_toolchain") + _maybe( http_archive, name = "xctestrunner",