问题标签 [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.
c++ - Bazel C++ 预编译头文件实现
我为 Bazel (2.0) 编写了一个 MSVC预编译头文件(PCH) 实现,并希望得到一些反馈,因为我对此不满意。
快速回顾一下让 PCH 在 MSVC 中工作需要做的事情:
- 用/Yc和/Fp编译PCH得到(1)
.pch
文件和(2).obj
文件。 - 使用 (1) 上的/Yu编译二进制文件,然后再次使用相同的/Fp选项。
.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
以获得一个可以直接访问所有标志的提供程序?
注意:我知道预编译头文件的缺点,但这是一个大型代码库,不幸的是不使用它不是一个选项。
bazel - 读取 WORKSPACE 中的文件内容
我container_pull
在我的 WORKSPACE 文件中使用。(它是bazel docker 规则的一部分)
如下所示:
但是,有一个包含 版本的文件base-image
,我希望从该文件中读取它,而不是在 WORKSPACE 中进行硬编码。
如何在 WORKSPACE 中读取文件内容?
environment-variables - Bazel - 如何从环境文件中读取字符串?
我的项目中有几个k8s_object
规则,我为每个规则提供了相同的cluster
名称,如下所示:
所以每当我想更改集群名称时,我必须在许多不同的地方进行更改。
目标
我希望在这样的.env
文件中设置集群名称:
并让 Bazel 自动拾取这个值。
bazel - Bazel:在 genrule 中引用输出目录中的文件
我试图引用一个规则的输出,该规则嵌套在另一个规则的输出目录中genrule
。
例如,我使用rules_foreign_cc来构建 boost:
当我构建它时,我看到了输出:
Boost 工作正常,我可以在
cc_library
目标中引用它,并且二进制文件运行良好。
现在,我想引用一个 genrule 中的输出之一。我要引用的文件嵌套在boost/lib/
目录中。我会期待类似的东西:$(location :boost/lib/libboost_program_options.so.1.72.0)
,但这不起作用。
引用目录中的输出的正确方法是什么?
bazel - 如何从starlark中的字符串创建路径?
我正在为 bazel 构建规则编写一些验证代码,我需要进行一些路径验证。我需要检查某个文件是否存在于与 BUILD 文件相同的目录中。我注意到有一个上下文属性build_file_path
指向 BUILD 文件。我想从中提取父目录。
看起来我无法创建新path
对象 - 我没有看到构造函数/初始化程序。Starlark 似乎也os.path
不像 python 那样支持,因为不支持导入。
获取表示 Starlark 中路径的字符串对象的父目录的规范方法是什么?
bazel - 有没有办法直接访问 Bazel 中内置的 starlark 语言类型?
例如,有没有办法调用 File 类的构造函数来创建它的实例?
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
作为此规则的输出(如您所见,这是我第一次尝试实现自己的规则);
很感谢任何形式的帮助!
参考资料
bazel - Bazel Starlark:如何以程序方式生成 BUILD 文件?
通过 http_archive 下载存档后,我想运行一个脚本以从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前是手动完成的,它很容易编写脚本)。我在 starlark 文档中没有找到任何关于如何打开、读取和写入文件的信息,但是由于 http_archive 本身是从 bzl 文件加载的(虽然还没有找到该文件的源......)并生成 BUILD 文件(通过从档案中解压缩它们)我想必须可以为 http_archive 编写一个包装器,它也会生成 BUILD 文件?
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 文档?
bazel - 有没有办法改进 starlark 的 unittest 错误报告?
我正在根据https://docs.bazel.build/versions/master/skylark/testing.html为我的项目编写分析时间测试,我想知道报告失败的最有用的方法是什么。
使用unittest.bzl
模块,我正在使用asserts.equals
等asserts.true
,发现日志中的错误报告有些缺乏。例如,如果asserts.true
失败,则错误消息是Expected condition to be true, but was false
,没有提及哪一行,或者它预期为真的条件是什么。在一个包含大量测试的文件中,这不是很有用!我知道可以将消息作为参数添加到这些断言中,但是为每个断言定制消息也感觉不理想。有没有办法获得由断言失败引起的回溯?或者访问断言失败的行号/详细信息的任何其他方式?