问题标签 [starlark]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
918 浏览

c++ - Bazel C++ 预编译头文件实现

我为 Bazel (2.0) 编写了一个 MSVC预编译头文件(PCH) 实现,并希望得到一些反馈,因为我对此不满意。

快速回顾一下让 PCH 在 MSVC 中工作需要做的事情:

  1. 用/Yc/Fp编译PCH得到(1).pch文件和(2).obj文件。
  2. 使用 (1) 上的/Yu编​​译二进制文件,然后再次使用相同的/Fp选项。
  3. .obj使用文件 (2)链接二进制文件。

执行

我们定义了一个规则,它将pchsrc(for /Yc ) 和pchhdr(for /Fp ) 作为参数以及一些cc_*规则参数(以获取定义和包含)。然后我们调用编译器来获取PCH(主要按照这里演示的方法)。一旦我们有了 PCH,我们通过CcInfo传播位置和链接器输入,用户需要调用cc_pch_copts以获取/Yu/Fp选项。

pch.bzl

我们会使用它:

构建.bzl

项目包含:

主文件

常见的.h

常见的.cpp

问题

实施工作。但是,我的讨论点是:

  • 将附加编译标志传播到依赖目标的最佳方法是什么?我通过它解决它的方式cc_pch_copts似乎相当老套。我假设它涉及定义一个提供者,但我找不到一个允许我转发标志的提供者(CcToolChainConfigInfo在这个方向上有一些东西,但它似乎有点矫枉过正)。
  • 除了我上面实现的方法之外,还有其他方法可以获取所有编译标志(定义、包含等)吗?它真的很冗长,而且大多数情况下都没有涵盖很多极端情况。是否有可能做一些事情,比如empty.cpp在规则中编译一个文件cc_pch以获得一个可以直接访问所有标志的提供程序?

注意:我知道预编译头文件的缺点,但这是一个大型代码库,不幸的是不使用它不是一个选项。

0 投票
1 回答
322 浏览

bazel - 读取 WORKSPACE 中的文件内容

container_pull在我的 WORKSPACE 文件中使用。(它是bazel docker 规则的一部分)
如下所示:

但是,有一个包含 版本的文件base-image,我希望从该文件中读取它,而不是在 WORKSPACE 中进行硬编码。
如何在 WORKSPACE 中读取文件内容?

0 投票
1 回答
1998 浏览

environment-variables - Bazel - 如何从环境文件中读取字符串?

我的项目中有几个k8s_object规则,我为每个规则提供了相同的cluster名称,如下所示:

所以每当我想更改集群名称时,我必须在许多不同的地方进行更改。

目标

我希望在这样的.env文件中设置集群名称:

并让 Bazel 自动拾取这个值。

0 投票
1 回答
458 浏览

bazel - Bazel:在 genrule 中引用输出目录中的文件

我试图引用一个规则的输出,该规则嵌套在另一个规则的输出目录中genrule

例如,我使用rules_foreign_cc来构建 boost:

当我构建它时,我看到了输出:

Boost 工作正常,我可以在cc_library目标中引用它,并且二进制文件运行良好。

现在,我想引用一个 genrule 中的输出之一。我要引用的文件嵌套在boost/lib/目录中。我会期待类似的东西:$(location :boost/lib/libboost_program_options.so.1.72.0),但这不起作用。

引用目录中的输出的正确方法是什么?

0 投票
1 回答
619 浏览

bazel - 如何从starlark中的字符串创建路径?

我正在为 bazel 构建规则编写一些验证代码,我需要进行一些路径验证。我需要检查某个文件是否存在于与 BUILD 文件相同的目录中。我注意到有一个上下文属性build_file_path指向 BUILD 文件。我想从中提取父目录。

看起来我无法创建新path对象 - 我没有看到构造函数/初始化程序。Starlark 似乎也os.path不像 python 那样支持,因为不支持导入。

获取表示 Starlark 中路径的字符串对象的父目录的规范方法是什么?

0 投票
1 回答
68 浏览

bazel - 有没有办法直接访问 Bazel 中内置的 starlark 语言类型?

例如,有没有办法调用 File 类的构造函数来创建它的实例?

0 投票
0 回答
618 浏览

bazel - 如何使用 Bazel 正确处理测试覆盖率报告 (HTML) 生成?

目标

我想通过 Bazel 处理生成带有测试覆盖率数据的 HTML 报告的整个过程。

成分

为了实现我的目标,我了解以下组件是必要的:

  • lcov .dat 文件 提供有关在运行特定测试用例时程序的哪些部分实际执行(即“覆盖”)的信息。我可以通过运行为我的项目生成所需的 lcov 文件(我的./bazelw query "attr(name, '.*test_main', //...)" | xargs ./bazelw coverage --combined_report=lcov所有测试目标都命名为test_main,这就是我可以coverage在所有这些目标中执行命令并将结果与--combined_report=lcov​​ ;
  • genhtml : 一个可执行文件,可以解析 lcov 文件并从中生成 HTML 测试报告(最终目标);
  • coverage.blz:一个自定义的 bazel 规则,将.dat文件和genrule二进制文件作为输入并吐出最终的 HTML 及其 deps(图像和其他 HTML);

到目前为止我能做的...

为 genhtml 创建一个可执行脚本

我不确定这是否是最好的方法,但是,在这一点上对我来说似乎是合理的:

创建文件组以访问存储库中的 .dat

遵循 -使用 Bazel 生成覆盖率报告的建议;

这存在于我的存储库的根BUILD文件中

开始我的自定义规则

存档coverage_report.bzl

在自定义规则实现的上下文中,我有以下问题:

  • 问题 1:我不知道此时 .dat 文件是否已经生成,因为它需要bazel coverage运行。我可以从这里强制 bazel 覆盖吗?
  • 问题 2:我不知道如何genhtml在这里引用我的可执行工具。我的计划是做类似的事情genhtml *.dat -o output
  • 问题 3:我不知道如何指定 的输出文件genhtml作为此规则的输出(如您所见,这是我第一次尝试实现自己的规则);

很感谢任何形式的帮助!

参考资料

0 投票
2 回答
420 浏览

bazel - Bazel Starlark:如何以程序方式生成 BUILD 文件?

通过 http_archive 下载存档后,我想运行一个脚本以从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前是手动完成的,它很容易编写脚本)。我在 starlark 文档中没有找到任何关于如何打开、读取和写入文件的信息,但是由于 http_archive 本身是从 bzl 文件加载的(虽然还没有找到该文件的源......)并生成 BUILD 文件(通过从档案中解压缩它们)我想必须可以为 http_archive 编写一个包装器,它也会生成 BUILD 文件?

0 投票
1 回答
239 浏览

bazel - 在 Bazel 工具链配置文件中获取包的运行时路径

在 Bazel 处理的任意文件中引用外部包路径的最佳方法是什么?

我试图了解 Bazel 如何预处理 BUILD 和 .bzl 文件。我看到字符串包含对 package() 的调用的实例,我想知道它是如何工作的(并且找不到任何相关文档)。这是一个例子:

我有一个工具链,其中 BUILD 文件包含以下表达式:

据我了解,cxx_builtin_include_directories定义了一个字符串列表作为--sysroot传递给 GCC 的选项,详见https://docs.bazel.build/versions/0.23.0/skylark/lib/cc_common.html这些字符串的格式为%sysroot%.

例如,由于package(@host_gcc8_toolchain//include/c++/8)对 GCC 没有任何意义,因此 bazel 必须以某种方式扩展此函数以生成包中包含的文件的实际路径,然后再将它们传递给编译器驱动程序。

但是它如何确定这需要扩展并且它不是常规字符串?那么 Bazel 是如何预处理 BUILD 文件的呢?是因为% ... %图案吗?这是在哪里记录的?

"%package(@external_package//target)%"一种可以在其他地方使用的模式吗?在任何 BUILD 文件中?我在哪里可以找到显示其工作原理的 Bazel 文档?

0 投票
1 回答
34 浏览

bazel - 有没有办法改进 starlark 的 unittest 错误报告?

我正在根据https://docs.bazel.build/versions/master/skylark/testing.html为我的项目编写分析时间测试,我想知道报告失败的最有用的方法是什么。

使用unittest.bzl模块,我正在使用asserts.equalsasserts.true,发现日志中的错误报告有些缺乏。例如,如果asserts.true失败,则错误消息是Expected condition to be true, but was false,没有提及哪一行,或者它预期为真的条件是什么。在一个包含大量测试的文件中,这不是很有用!我知道可以将消息作为参数添加到这些断言中,但是为每个断言定制消息也感觉不理想。有没有办法获得由断言失败引起的回溯?或者访问断言失败的行号/详细信息的任何其他方式?