问题标签 [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 中作为 #defines 传递的包含依赖项?
我正在尝试使用 Bazel 构建遗留的 C/C++ 嵌入式代码库。代码被分成软件集。因为系统是嵌入式的,所以有一个环境头包含作为参数传递给每个软件集的编译器。标头路径使用#define 定义:
software_set_b 的源文件可能以:
编译指令会将 MY_ENV 定义为 software_set_a 中环境头的绝对路径,例如:
是否可以使用 Bazel 来实现这一点,而无需显式传入/path/to/software_set_a/headers/MyEnvironment.h
参数--define
,bazel build
或硬编码 software_set_b 的 BUILD 文件中的值,例如:
理想情况下,程序员可以选择带有参数的包,例如bazel build //:software_set_b --//:from_env=software_set_a
在 BUILD 脚本中使用类似于以下内容的片段:
python-3.x - 在 py_binary 的 args 字段中传递命名参数
考虑我有一个 py_binary :
如果 mock.py 接受--somearg
使用参数解析器命名的命令行参数,我如何通过 bazel 文件中的 args 字段传递这个参数而不在bazel build
命令中传递参数?
protocol-buffers - Bazel + rules_proto:实例化Base +多个Impls
语境
我正在尝试在Bazel中做一些 protobuf 代码生成,最终使用rules_proto_grpc,但正如我所见,内核正在使用rules_proto,我们现在可以专注于这些。
总体思路是构建一个包含多个 API 实例的monorepo,所有实例都共享/专门化一个公共基础/核心 API。
简化后,它看起来像:
目标
service_a
构建过程应该为两个 ( + service_b
) 实例准备必要的目标:
- 最终我们想要一些具有通用部分和
service_a
专业化(消息SpecificServiceInfo
)的语言 X 代码 - 最终我们想要一些具有通用部分和
service_b
专业化(消息SpecificServiceInfo
)的语言 X 代码
这两个输出是独立的。他们只是共享这个核心并生活在同一个存储库中。
没有巴泽尔
一个不像Bazel那样严格的简单工具链,可能只需准备2 个基本部分的先验副本到2 个隔离目录中,添加特定的实现并实例化/编译它们。
我不认为这有任何问题,除了最初的目标是在 bazel 中表达这一点,因为事情在某些时候会变得更加复杂。
尝试/问题
嗯...事实上我什至不知道从哪里开始。
我想尝试模拟上述孤立的复制方法,但我无法做到这一点。我尝试了一些宏和genrule的组合(据我了解,类似复制的方法与 genrule背后的构建时固定文件基数的想法相悖),但随着各种问题的出现,我似乎错过了一些基本概念。
核心问题似乎得到了以下两个,而不是直接连接的东西同步:
- bazel 类目标管理(例如将 base + service_a 表示为一个整体)
- 保持路径结构,以便
imports
在这些.proto
文件中工作- 特别是:
import "generic-api/specific_impl/X/specific_service_info.proto";
在service_info.proto
- 特别是:
似乎,rules_proto
旨在与WORKSPACE 相关的导入一起使用。这似乎使这变得更加困难,因为在没有相对导入的那些导入中指定service_a
vs看起来很麻烦。service_b
我不知道是否import_prefix
或strip_import_prefix
可以提供帮助。import public / exports
也可能是一种成分,但我害怕不支持 java免责声明(在 protobuf 页面上)。
有人知道如何实现这样的目标吗?是否有可能的宏/通用路径或是否需要更复杂的方法?
bazel - Bazel 问题:`filegroup` 到 `declare_directory`
我有一个关于如何制作filegroup
成declare_directory
.
所以我能想到的是,
filegroup
-> pkg_tar
-> untar_to_dir
(将 tarball 解压到declare_directory
.
它会起作用,而且我已经证明了这一点。但是,我想知道是否有其他更优雅的方法来避免 tar 和 untar 文件组?
我尝试过的一个想法,但非常复杂,是将它们declare_directory
逐个文件复制到文件中。但棘手的一点是,它无法优雅地处理在新目录中保持相同的目录结构。(就像我之前要mkdir
很多子目录一样cp
)。
bazel - 如何将用户定义的构建设置传递给现有的 Bazel 规则?
我想从--define
标志中迁移出来并根据以下内容构建设置:https ://docs.bazel.build/versions/5.0.0/skylark/config.html
这是我想传递命令行值的规则。
- 在使用加载规则时,这可以在实践中完成吗?
- 可以访问 .bazel 文件的规则字段中的构建设置值,还是只能访问 Starlark 配置?
- 有没有办法有效地“子类化”加载的规则而无需访问已发布的实现?如果
_impl
是公开的,似乎我可以用我自己的实现来包装它,并传递标志。
我对 Bazel 有点陌生,并且仍在寻找正确的方法来概念化这些东西。任何指导表示赞赏!
当前方法
后端/BUILD.bazel:
然后我运行:
我试过的
几种变体:
后端/rules.bzl:
然后我运行:
返回:
bazel - 如何将别名值传递给 bazel 函数?
我在 BUILD 文件中定义了以下别名:
如何将“实际”字符串传递给这样的函数?
我正在尝试最天真的事情,它不明白它是别名,而不是字符串: