使用 Bazel 将编译和链接操作分开

Fed*_*Fed 2 c++ linker compilation bazel

我想知道是否有一种方法可以在单独的步骤中使用 Bazel 执行编译和链接操作。如果我执行命令

bazel build -s //main:hello-world
Run Code Online (Sandbox Code Playgroud)

所有 bazel 子命令都会被打印。我知道可以从命令行执行这些子命令,但我想知道如何使用 Bazel 仅执行编译操作,并且仅在单独的步骤中执行链接操作。预先感谢您的任何帮助!

Ond*_* K. 6

不确定您到底在追求什么,但本质上,您可以编写一个自定义规则,将cc_*目标作为源传递到其中,并尝试将其操作分开,仅获取您感兴趣的输出,例如:

def _impl(ctx):
    outs = []
    for src in ctx.attr.srcs:
        if hasattr(src, "actions"):
            for action in src.actions:
                if action.mnemonic == "CppCompile":
                    outs.append(action.outputs)
    return DefaultInfo(files = depset(transitive = outs))

just_compile = rule(
    _impl,
    attrs = {
        "srcs": attr.label_list(mandatory = True),
    },

)      
Run Code Online (Sandbox Code Playgroud)

如果我有以下BUILD文件:

load("//:just_compile.bzl", "just_compile")

just_compile(
    name = "compile_hello",
    srcs = [":hello"],
)

cc_binary(
    name = "hello",
    srcs = ["hello.cpp"],
)
Run Code Online (Sandbox Code Playgroud)

然后你运行(你可以添加-s到观看):

bazel build compile_hello
Run Code Online (Sandbox Code Playgroud)

您将只得到执行的编译步骤(因为我们实际上没有请求hello目标,并且没有其他需要按照请求链接到树中的内容)及其产生的结果:

bazel-bin/
bazel-bin/_objs
bazel-bin/_objs/hello
bazel-bin/_objs/hello/hello.pic.d
bazel-bin/_objs/hello/hello.pic.o
Run Code Online (Sandbox Code Playgroud)

链接助记符是CppLink.

所以,是的,你可以将自己投入到特定的行动中。为了便于辩论,这至少是我知道的一种选择。但同样,我并不完全确定你到底在追求什么,你想解决什么问题。