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

Change get_tool_for_action to return absolute paths #97

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

widiba03304
Copy link

Problem

When getting the path of executables in a toolchain by calling get_tool_for_action, it returns a string containing relative paths, thereby prohibiting defining rules like below:

def _gen_c_bin_impl(ctx):
    """
    A rule that compiles C sources into an object, then extracts the .text section into a .bin file using objcopy.
    """
    toolchain = ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]

    feature_configuration = cc_common.configure_features(
        ctx = ctx,
        cc_toolchain = toolchain,
        requested_features = ctx.features,
        unsupported_features = ctx.disabled_features,
    )

    _, compilation_outputs = cc_common.compile(
        actions = ctx.actions,
        feature_configuration = feature_configuration,
        cc_toolchain = toolchain,
        name = ctx.label.name,
        srcs = ctx.files.srcs,
        public_hdrs = ctx.files.hdrs,
    )

    object_files = compilation_outputs.objects + compilation_outputs.pic_objects
    if len(object_files) == 0:
        fail("No object files produced from srcs = %s" % (ctx.files.srcs))
    object_file = object_files[0]

    bin_file = ctx.actions.declare_file(ctx.label.name + ".bin")

    objcopy_tool = cc_common.get_tool_for_action(
        feature_configuration = feature_configuration,
        action_name = "objcopy_embed_data",
    )
    if objcopy_tool == None:
        fail("The C/C++ toolchain does not provide an objcopy tool.")

    ctx.actions.run_shell(
        inputs = [object_file],
        outputs = [bin_file],
        command = """
            '{objcopy}' --only-section=.text -O binary '{in_o}' '{out_bin}'
        """.format(
            objcopy = objcopy_tool,
            in_o = object_file.path,
            out_bin = bin_file.path,
        ),
        mnemonic = "Objcopy",
        progress_message = "Extracting .text section from %s" % (object_file.path),
    )

    return [
        DefaultInfo(
            files = depset([bin_file]),
        ),
    ]

gen_c_kernel = rule(
    implementation = _gen_c_kernel_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = [".c"]),
        "hdrs": attr.label_list(allow_files = [".h"]),
        "_cc_toolchain": attr.label(
            default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
            providers = [cc_common.CcToolchainInfo],
        ),
    },
    fragments = ["cpp"],
    toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
)
INFO: Analyzed 5 targets (3 packages loaded, 5140 targets configured).
ERROR: /workspaces/orchestra-project/orchestra/data/BUILD:26:23: Extracting .text section from bazel-out/k8-fastbuild/bin/orchestra/data/_objs/test2/test2.o failed: (Exit 127): process-wrapper failed: error executing Objcopy command 
  (cd /root/.cache/bazel/_bazel_root/cdd8e368207b5916b649be52f184b097/sandbox/processwrapper-sandbox/574/execroot/_main && \
  exec env - \
    TMPDIR=/tmp \
  /root/.cache/bazel/_bazel_root/install/78ccbcf59b0fe2de7bbdccc470af78df/process-wrapper '--timeout=0' '--kill_delay=15' '--stats=/root/.cache/bazel/_bazel_root/cdd8e368207b5916b649be52f184b097/sandbox/processwrapper-sandbox/574/stats.out' /bin/bash -c '
            '\''external/rules_android_ndk~~android_ndk_repository_extension~androidndk/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy'\'' --only-section=.text -O binary '\''bazel-out/k8-fastbuild/bin/orchestra/data/_objs/test2/test2.o'\'' '\''bazel-out/k8-fastbuild/bin/orchestra/data/test2.bin'\''
        ')
/bin/bash: line 2: external/rules_android_ndk~~android_ndk_repository_extension~androidndk/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy: No such file or directory
ERROR: /workspaces/orchestra-project/orchestra/data/BUILD:20:23: Extracting .text section from bazel-out/k8-fastbuild/bin/orchestra/data/_objs/test1/test1.o failed: (Exit 127): process-wrapper failed: error executing Objcopy command 
  (cd /root/.cache/bazel/_bazel_root/cdd8e368207b5916b649be52f184b097/sandbox/processwrapper-sandbox/573/execroot/_main && \
  exec env - \
    TMPDIR=/tmp \
  /root/.cache/bazel/_bazel_root/install/78ccbcf59b0fe2de7bbdccc470af78df/process-wrapper '--timeout=0' '--kill_delay=15' '--stats=/root/.cache/bazel/_bazel_root/cdd8e368207b5916b649be52f184b097/sandbox/processwrapper-sandbox/573/stats.out' /bin/bash -c '
            '\''external/rules_android_ndk~~android_ndk_repository_extension~androidndk/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy'\'' --only-section=.text -O binary '\''bazel-out/k8-fastbuild/bin/orchestra/data/_objs/test1/test1.o'\'' '\''bazel-out/k8-fastbuild/bin/orchestra/data/test1.bin'\''
        ')
/bin/bash: line 2: external/rules_android_ndk~~android_ndk_repository_extension~androidndk/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy: No such file or directory

The directory run_shell runs in the sandboxed directory /root/.cache/bazel/_bazel_root/cdd8e368207b5916b649be52f184b097/sandbox/processwrapper-sandbox/573/execroot/_main so bin/objcopy could not be found.

List of changes

  • Add ndk_path to be propagated to ndk_cc_toolchain_config.bzl
  • Add clang_directory to be propagated to ndk_cc_toolchain_config.bzl
  • Revise tools and cxx_builtin_include_directories to have absolute paths
  • Resolves Proposal to change tools to have absolute paths #96

@@ -88,6 +88,8 @@ def _android_ndk_repository_impl(ctx):
"{clang_resource_directory}": clang_resource_directory,
"{sysroot_directory}": sysroot_directory,
"{executable_extension}": executable_extension,
"{ndk_path}": ndk_path,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't this break remote caching if different developers install their NDKs in different locations?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Proposal to change tools to have absolute paths
2 participants