首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单cc_library规则作为天空云雀规则

简单cc_library规则作为天空云雀规则
EN

Stack Overflow用户
提问于 2017-08-15 13:11:58
回答 1查看 411关注 0票数 3

我有一个非常简单的cc_library()规则,我想转换成一个云雀规则。

cc_library()规则是:

代码语言:javascript
复制
cc_library(
  name = 'cc_library_a',
  srcs = [ 'a.c' ],
)

我面临的挑战是关注通过不同方法传递的编译标志--其中之一是命令行。因此,假设我运行以下命令行:

# bazel build :a --copt -H

这将将-H标志添加到编译命令中。这里的问题是,我如何才能让-H旗传播到云雀规则?

我试过以下几种方法,但都没有用:

代码语言:javascript
复制
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' ],
)

构建文件内容如下:

代码语言:javascript
复制
load(':rules.bzl', 'my_rule')

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


cc_library(
    name = 'cc_library_a',
    srcs = [ 'a.c' ],
)

构建Skylark规则的输出清楚地表明,--copt被忽略了:

代码语言:javascript
复制
# 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

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 12:04:52

因为--copt -H参数对于C和C++是通用的,所以需要使用ctx.fragments.cpp.compiler_options([])来获取标志。您所使用的ctx.fragments.cpp.c_options代码仅用于特定于C的选项。

同样,还有一个ctx.fragments.cpp.cxx_options([])函数为您提供C++特定的选项。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45693576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档