C++ 是否可以使用C++;bazel中的20个模块有自定义规则?
Bazel不直接支持模块(请参阅) 但是,可以为bazel提供自定义交叉工具 发件人: 默认情况下,Bazel会自动为您的构建配置CROSSTOOL,但您可以选择手动配置它 而且可以使用自定义规则扩展bazel 发件人: Bazel本身有一些规则。这些本机规则,如cc_库和java_二进制,为某些语言提供了一些核心支持。通过定义自己的规则,可以为Bazel本机不支持的语言和工具添加类似的支持 Bazel的模块问题表明,即使没有本机支持,您也可以使用自定义交叉工具来支持模块: 关于模块的所有内容(仅用于clang)都已经是开源的。唯一缺少的是一个利用它们并提供所有必要功能的CROSSTOOLC++ 是否可以使用C++;bazel中的20个模块有自定义规则?,c++,bazel,c++20,c++-modules,C++,Bazel,C++20,C++ Modules,Bazel不直接支持模块(请参阅) 但是,可以为bazel提供自定义交叉工具 发件人: 默认情况下,Bazel会自动为您的构建配置CROSSTOOL,但您可以选择手动配置它 而且可以使用自定义规则扩展bazel 发件人: Bazel本身有一些规则。这些本机规则,如cc_库和java_二进制,为某些语言提供了一些核心支持。通过定义自己的规则,可以为Bazel本机不支持的语言和工具添加类似的支持 Bazel的模块问题表明,即使没有本机支持,您也可以使用自定义交叉工具来支持模块: 关于模块的所有内容(
有没有人可以展示如何为CLAN编写自定义交叉表,以及如何使用它为模块编写自定义的C++规则(例如,代码> CcMyMexs/Cuff>),这样您可以做这样的事情:
编写一个基本模块//helloworld.cc
模块;
#包括
导出模块helloworld;
导出void hello();
单元:私人;
void hello(){puts(“hello world!”);}
使用模块
//main.cc
导入helloworld;
int main(){hello();}
将部件集成到构建系统中
cc\u模块(
name=“helloworld”,
srcs=[“helloworld.cc”],
)#编译为预编译模块文件(PCM)
cc_二进制(
name=“main”,
srcs=[
“main.cc”,
],
deps=[
“:helloworld”,
],
)#针对helloworld PCM进行编译
是的,是的。这里有一个如何做的概要
为跟踪模块信息添加自定义提供程序:
ModuleCompileInfo = provider(doc = "", fields = [
"module_name",
"module_file",
"module_dependencies",
])
添加用于生成C++20模块的自定义规则cc_模块
。然后你可以写一些像
cc_module(
name = "A",
src = "a.cc", # a.cc exports the module A
impl_srcs = [
"a_impl1.cc", # optionally you can provide additional implementation sources for A
"a_impl2.cc",
],
deps = [
":B", # dependencies can be either other modules or other cc_libraries
":C",
],
)
自定义规则将
因为其他标准的BAZEL规则(例如CcBooX、CcLoCar)不知道C++ 20模块,所以还需要提供定制的CcMuleMe2二进制和CcMuleMeLoCultRealm规则,以便您可以使用其他C++构造的模块。比如说,
cc_module_binary(
name = "exe",
srcs = ["main.cc"], # main.cc can import A
deps = [":A"], # we can depend on modules
)
有关提供c++20模块规则的项目,请参阅。查看如何使用它的示例。对于SO的格式来说,这个问题有点过于宽泛。你在寻找教程还是什么?也请确保除了语言版本标签之外,还可以用C++来标注问题。我正在寻找如何建立一个使用模块的基本项目。这不是一个微不足道的问题,2)至少根据我链接的问题,可能使用自定义交叉工具。这是Bazel使用的合法问题,也是Starlark规则扩展的操作方法。投票决定重新开放。对于子孙后代:Bazel的语言支持具有高度的可扩展性,即使某些语言是本机实现的,并且更难对其进行更改,也不会阻止用户为Bazel创建自己的语言支持规则。