2017-06-14 66 views
0

我试图生成使用巴泽勒旧货服务定义Python绑定。据我所知,没有现成的.bzl这样做,所以我有点在我自己这里。我在过去写过.bzl规则,但在这种情况下我遇到的情况是不同的。如何生成Python绑定节俭在巴泽尔

一般的问题是,我不知道从thrift命令的输出文件的名称的构建开始,这意味着,因为我不,我不能生成py_library规则与srcs属性设置正确之前有文件的名称。我试图按照例子,其中输出文件由生成.zip文件的方式提前知道的,但py_library规则只允许.py文件作为索马里红新月所以这是行不通的。

我能想到的唯一的事情就是使用repository_rule来生成代码和BUILD文件,但是我试图完成的东西看起来没有什么特别之处,应该得到支持。

回答

0

有人尝试过这一点。

这里讨论: https://groups.google.com/forum/#!topic/bazel-dev/g3DVmhVhNZs

代码这里: https://github.com/wt/bazel_thrift

我就从那里开始。

编辑: 我在那里开始。我没有达到我所希望的程度。巴泽勒被扩展,以支持具有由一个输入而产生多个输出,但它不允许很容易只是还没有,每:

groups.google.com/forum/#!topic/bazel-discuss/3WQhHm194yU

无论如何,我的确尝试了一些C++ thrift绑定,它们有相同的问题。 Java示例通过使用源代码库作为构建源解决了这个问题,这对我们来说不起作用。为了使它工作,我通过了我关心的源文件列表,这些文件将由节俭生成器创建。然后我将这些文件报告为将在impl中生成的输出。这似乎工作。这有点令人讨厌,因为在构建之前,你必须知道你正在寻找哪些文件,但它确实有效。也可以让一个小程序读取thift文件,并确定它会输出的文件。这会更好,但我没有时间。此外,目前的方法很好,因为它明确地定义了你正在寻找节俭产生的文件,这使得BUILD文件对于像我这样的新手来说更容易理解。

一些代码第一遍,也许我会清理干净,并提交它作为一个补丁(也许不是):

########### 
# CPP gen 
########### 

# Create Generated cpp source files from thrift idl files. 
# 
def _gen_thrift_cc_src_impl(ctx): 
    out = ctx.outputs.outs 

    if not out: 
     # empty set 
     # nothing to do, no inputs to build 
     return DefaultInfo(files=depset(out)) 

    # Used dir(out[0]) to see what 
    # we had available in the object. 
    # dirname attribute tells us the directory 
    # we should be putting stuff in, works nicely. 
    # ctx.genfile_dir is not the output directory 
    # when called as an external repository 
    target_genfiles_root = out[0].dirname 
    thrift_includes_root = "/".join(
     [ target_genfiles_root, "thrift_includes"]) 
    gen_cpp_dir = "/".join([target_genfiles_root,"." ]) 

    commands = [] 

    commands.append(_mkdir_command_string(target_genfiles_root)) 
    commands.append(_mkdir_command_string(thrift_includes_root)) 

    thrift_lib_archive_files = ctx.attr.thrift_library._transitive_archive_files 
    for f in thrift_lib_archive_files: 
     commands.append(
      _tar_extract_command_string(f.path, thrift_includes_root)) 

    commands.append(_mkdir_command_string(gen_cpp_dir)) 
    thrift_lib_srcs = ctx.attr.thrift_library.srcs 
    for src in thrift_lib_srcs: 
     commands.append(_thrift_cc_compile_command_string(
      thrift_includes_root, gen_cpp_dir, src)) 


    inputs = (
     list(thrift_lib_archive_files) + thrift_lib_srcs) 

    ctx.action(
     inputs = inputs, 
     outputs = out, 
     progress_message = "Generating CPP sources from thift archive %s" % target_genfiles_root, 
     command = " && ".join(commands), 
    ) 
    return DefaultInfo(files=depset(out)) 


thrift_cc_gen_src= rule(
    _gen_thrift_cc_src_impl, 
     attrs = { 
      "thrift_library": attr.label(
       mandatory=True, providers=['srcs', '_transitive_archive_files']), 
      "outs" : attr.output_list(mandatory=True, non_empty=True), 
     },output_to_genfiles = True, 
    ) 

# wraps cc_library to generate a library from one or more .thrift files 
# provided as a thrift_library bundle. 
# 
# Generates all src and hdr files needed, but you must specify the expected 
# files. This is a bug in bazel: https://groups.google.com/forum/#!topic/bazel-discuss/3WQhHm194yU 
# 
# Instead of src and hdrs, requires: cpp_srcs and cpp_hdrs. These are required. 
# 
# Takes: 
#   name: The library name, like cc_library 
# 
# thrift_library: The library of source .thrift files from which our 
#     code will be built from. 
# 
#  cpp_srcs: The expected source that will be generated and built. Passed to 
#     cc_library as src. 
# 
#  cpp_hdrs: The expected header files that will be generated. Passed to 
#     cc_library as hdrs. 
# 
# Rest of options are documented in native.cc_library 
# 

def thrift_cc_library(name, thrift_library, 
         cpp_srcs=[],cpp_hdrs=[], 
         build_skeletons=False, 
         deps=[], alwayslink=0, copts=[], 
         defines=[], include_prefix=None, 
         includes=[], linkopts=[], 
         linkstatic=0, nocopts=None, 
         strip_include_prefix=None, 
         textual_hdrs=[], 
         visibility=None): 
    # from our thrift_library tarball source bundle, 
    # create a generated cpp source directory. 
    outs = [] 
    for src in cpp_srcs: 
     outs.append("//:"+src) 
    for hdr in cpp_hdrs:  
     outs.append("//:"+hdr) 
    thrift_cc_gen_src( 
     name = name + 'cc_gen_src', 
     thrift_library = thrift_library, 
     outs = outs, 
    ) 

    # Then make the library for the given name. 
    native.cc_library(
     name = name, 
     deps = deps, 
     srcs = cpp_srcs, 
     hdrs = cpp_hdrs, 
     alwayslink = alwayslink, 
     copts = copts, 
     defines=defines, 
     include_prefix=include_prefix, 
     includes=includes, 
     linkopts=linkopts, 
     linkstatic=linkstatic, 
     nocopts=nocopts, 
     strip_include_prefix=strip_include_prefix, 
     textual_hdrs=textual_hdrs, 
     visibility=visibility, 
    ) 
+0

是的,我想过只是,明确指出要生成的文件。这很糟糕,所以尽管我知道它会起作用,但我没有沿着这条路走下去。我也想过使用存储库规则,但看起来很充实。最后,我想过为生成的文件生成一个'.zip',并构建一个存根'.py'来解压包含源文件的'.zip'。我敢肯定它会起作用,但再次,这似乎是一个破解。 –