Bazel 简单的cc_库规则作为云雀规则

Bazel 简单的cc_库规则作为云雀规则,bazel,Bazel,我有一个非常简单的cc_library()规则,我想将其转换为Skylark规则 cc\u library()规则是: cc_library( name = 'cc_library_a', srcs = [ 'a.c' ], ) 我面临的挑战是涉及通过不同方法传递的编译标志,例如命令行。 因此,假设我运行以下命令行: #bazel构建:a--copt-H 这将在编译命令中添加-H标志。这里的问题是如何将-H标志传播到云雀规则 我尝试了以下方法,但无效: def _my_rule(ctx

我有一个非常简单的
cc_library()
规则,我想将其转换为Skylark规则

cc\u library()
规则是:

cc_library(
  name = 'cc_library_a',
  srcs = [ 'a.c' ],
)
我面临的挑战是涉及通过不同方法传递的编译标志,例如命令行。 因此,假设我运行以下命令行:

#bazel构建:a--copt-H

这将在编译命令中添加
-H
标志。这里的问题是如何将
-H
标志传播到云雀规则

我尝试了以下方法,但无效:

def _my_rule(ctx):
    _arguments = [ '-c' ]
    _arguments.append(ctx.file.src.path)
    _arguments += ctx.fragments.cpp.c_options
    _arguments += [ '-o', ctx.outputs.out.path ]

    ctx.actions.run(
        outputs = [ ctx.outputs.out ],
        inputs = [ ctx.file.src ],
        arguments = _arguments,
        executable = ctx.fragments.cpp.compiler_executable,
    )

my_rule = rule(
    implementation = _my_rule,
    attrs = {
        'src': attr.label(allow_single_file = True),
    },
    outputs = {
        'out': '%{name}.o',
    },
    fragments = [ 'cpp' ],
)
生成的文件内容如下所示:

load(':rules.bzl', 'my_rule')

my_rule(
    name = 'skylark_a',
    src = 'a.c',
)


cc_library(
    name = 'cc_library_a',
    srcs = [ 'a.c' ],
)
构建云雀规则的输出清楚地表明,
--copt
被忽略:

# bazel build skylark_a --copt -H --subcommands
INFO: Found 1 target...
>>>>> # //:skylark_a [action 'SkylarkAction skylark_a.o']
(cd /bazel/jbasila/_bazel_jbasila/4d692aace2e7e1a45eec9fac3922ea8d/execroot/__main__ && \
  exec env - \
  /usr/bin/gcc -c a.c -o bazel-out/local-fastbuild/bin/skylark_a.o)
INFO: From SkylarkAction skylark_a.o:
a.c: In function 'a':
a.c:3:5: warning: implicit declaration of function 'puts' [-Wimplicit-function-declaration]
     puts("a");
     ^~~~
Target //:skylark_a up-to-date:
  bazel-bin/skylark_a.o
INFO: Elapsed time: 0.578s, Critical Path: 0.05s
<>我错过了什么?

< p>因为 COPT -H < /C>参数是C和C++的通用,需要使用<代码> CTX.Frask.CPP.CopySeriOrthOp[[] ] < /C>。您使用的
ctx.fragments.cpp.c_选项
代码仅用于特定于c的选项


同样,也有一个<代码> CTX.Fract.CPP.CXXORIONS选项[/]>函数>代码>函数,它提供C++特定选项。

如果这是关于C++代码的,请您的问题提供一个代码。否则,只需删除C++标签即可。