当前位置: 首页 > 知识库问答 >
问题:

如何使用Bazel build从生成的源文件中构建静态库

谷梁弘深
2023-03-14
py_binary(
    name = "sample_script",
    srcs = ["sample_script.py"],
)
genrule(
    name = "sample_genrule",
    tools = [":sample_script"],
    cmd = "$(location :sample_script)",
    outs = ["cpp_output_fixed.cc"], #or shall also the files with random names be defined here?
)
cc_library(
    name = "autolib",
    srcs = ["cpp_output_fixed.cc"],
    #srcs = glob([ #here should all generated .cc files be named
    #    "./*.cc",
    #    "./**/*.cc",
    #    ])+["cpp_output_fixed.cc"], 
)

Python文件sample_script.py:

#!/usr/bin/env python
import hashlib
import time

time_stamp = time.time()

time_1 = str(time_stamp)
time_2 = str(time_stamp + 1)

random_part_1 = hashlib.sha1(time_1).hexdigest()[-4:]
random_part_2 = hashlib.sha1(time_1).hexdigest()[-4:]

fixed_file = "cpp_output_fixed" + ".cc"
file_1 = "cpp_output_" + random_part_1 + ".cc"
file_2 = "cpp_output3_" + random_part_2 + ".cc"

with open(fixed_file, "w") as outfile:
    outfile.write("#include <iostream>"
                   "int main() {"
                   "  std::cout <<'''Hello_world'''    <<std::endl;"
                   "  return 0"
                   "}")

with open(file_1, "w") as outfile:
    outfile.write("#include <iostream>"
                   "int main() {"
                   "  std::cout <<'''Hello_world'''    <<std::endl;"
                   "  return 0"
                   "}")

with open(file_2, "w") as outfile_new:
    outfile_new.write("#include <iostream>"
                   "int main() {"
                   "  std::cout <<'''Hello_world''' <<std::endl;"
                   "  return 0"
                   "}")

print ".cc generation DONE"

共有1个答案

宋琛
2023-03-14

[大编辑,因为我找到了让它工作的方法:)]

如果您确实需要发出在分析阶段未知的文件,您唯一的方法是我们内部称为树构件的方法。您可以将其视为一个目录,其中包含只在执行阶段才会检查的文件。您可以使用ctx.actions.declare_directory从Skylark声明树构件。

下面是一个工作示例。注意3件事:

    null
def _impl(ctx):
  tree = ctx.actions.declare_directory(ctx.attr.name + ".cc")
  ctx.actions.run(
    inputs = [],
    outputs = [ tree ],
    arguments = [ tree.path ],
    progress_message = "Generating cc files into '%s'" % tree.path,
    executable = ctx.executable._tool,
  )

  return [ DefaultInfo(files = depset([ tree ])) ]

genccs = rule(
  implementation = _impl,
  attrs = {
    "_tool": attr.label(
      executable = True,
      cfg = "host",
      allow_files = True,
      default = Label("//:genccs"),
    )
  }
)
load(":genccs.bzl", "genccs")

genccs(
    name = "gen_tree",
)

cc_library(
    name = "main",
    srcs = [ "gen_tree" ]
)

cc_binary(
    name = "genccs",
    srcs = [ "genccs.cpp" ],
)
#include <fstream>
#include <sys/stat.h>
using namespace std;

int main (int argc, char *argv[]) {
  mkdir(argv[1], S_IRWXU);
  ofstream myfile;
  myfile.open(string(argv[1]) + string("/foo.cpp"));
  myfile << "int main() { return 42; }";
  return 0;
}
 类似资料:
  • 我正在尝试从转移到。在中,我有一个任务,将所有文件和文件夹从/statig/folder复制到/build/folder。如何对执行同样的操作?我需要一些插件吗?

  • 我已经构建了一个静态的next.js站点,并希望从一个标记文档文件夹中生成一组静态页面(但这个问题的目的可能是任何东西--文本文件等)。假设我有这个文档文件夹: 发现完整URL slug的唯一方法是在构建时,在构建时可以递归文档文件夹并发现以下路径: 通常情况下,如果我知道diff子路由,我可以像这样添加文件: ...然而,我不知道这些子文件夹在代码时能够做到这一点,只有在构建时当我递归文档。 我

  • 请修改配置文件caches\configs\system.php中 'html_root' => '/html',//生成静态文件路径 为 'html_root' => '',//生成静态文件路径

  • 我想用jQuery开发一个动态表单生成器,用户可以在其中构建自己的表单并更改表单名称、输入类型、大小等。我知道有一些很酷的拖放在线表单生成器,但我想开发一个非常简单的表单生成器。 我已经开始发展这一点,我面临着一些问题。 当用户单击标签(输入字段)时,它会使用jquery和edit and delete按钮动态创建一个输入字段。 下面的代码在div中附加输入字段,该字段现在是空的。 点击文本输入,

  • 我必须在运行时动态生成一个xml文件。请帮助我使用PHP动态生成下面的XML文件。 null

  • 我想从OkHttp库源代码构建一个jar文件,以便在我的android应用程序中使用快照版本。我不知道怎么做。 欢迎任何帮助。谢了。