C++ 是否可以使用C++;bazel中的20个模块有自定义规则?

C++ 是否可以使用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的模块问题表明,即使没有本机支持,您也可以使用自定义交叉工具来支持模块: 关于模块的所有内容(

Bazel不直接支持模块(请参阅)

但是,可以为bazel提供自定义交叉工具

发件人:

默认情况下,Bazel会自动为您的构建配置CROSSTOOL,但您可以选择手动配置它

而且可以使用自定义规则扩展bazel

发件人:

Bazel本身有一些规则。这些本机规则,如cc_库和java_二进制,为某些语言提供了一些核心支持。通过定义自己的规则,可以为Bazel本机不支持的语言和工具添加类似的支持

Bazel的模块问题表明,即使没有本机支持,您也可以使用自定义交叉工具来支持模块:

关于模块的所有内容(仅用于clang)都已经是开源的。唯一缺少的是一个利用它们并提供所有必要功能的CROSSTOOL

有没有人可以展示如何为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",
   ],
)
自定义规则将

  • 为组件的模块依赖项创建模块映射
  • 生成打包a对象的静态库和a模块的cmi文件
  • 返回模块的提供程序和ModuleCompileInfo提供程序以跟踪模块信息
  • 因为其他标准的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创建自己的语言支持规则。