2017-08-15 83 views
3

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

cc_library()规则是:

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

我面对的是concerining是打通不同的方法通过编译标志的challange - 为一体,在命令行。 所以以为我运行以下命令行:

# bazel build :a --copt -H

这将-H标志添加到编译命令。这里的问题是我怎样才能将-H标志传播到Skylark规则?

我曾尝试以下,但它没有工作:

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' ], 
) 

BUILD文件内容如下:

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

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


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

建设云雀规则的输出清楚的显示被忽略:

# 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 

我错过了什么?

+0

如果这应该是关于C++代码,请编辑您的问题以提供该代码的[mcve]。否则,只需删除C++标记。 –

回答

3

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

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