当许多目标使用相同的 C++ 源代码时,如何加速 Meson 构建
How do I speed up Meson build when many targets use the same C++ sources
我有一个包含 58 个目标的新介子项目。它们中的许多使用相同的 *.cc 文件,meson 为每个目标构建每个 *.cc 文件一次,这比 autotools 慢得多。此外,目标之间的编译标志应该相同,因此理论上介子应该能够重新使用对象。
介子是否支持构建许多目标?对于这种情况是否有标准的解决方案?我可以尝试将项目中的所有源代码组织到共享库中,但随后我必须决定如何对它们进行分组,而使用 autotools 我不必做出决定。我还没有找到这方面的文档。
-BenRI
P.S。这是一个最小的例子:
-------- 文件:app1.cc ------
int f(int x ,int y) {return x;}
int main() { return f(0,1);}
------ 文件:meson.build -----
project('app12','cpp')
executable('app1',['app1.cc'])
executable('app2',['app1.cc'])
------------命令------------
% meson . meson
% cd meson
% meson configure -Dwarning_level=3
% ninja
您应该会看到两次未使用参数 'y' 的警告。
文件 compile_commands.json 也有两个条目 app1.cc .
再次使用相同的编译标志编译相同的源代码并且
再次只是浪费 CPU 的力量,因为它会产生相同的
二进制文件,除非你有 unreproducible build tricks 之类的日期和
时间。
如果您的意思是为所有目标构建通用代码,您可以
只需使用 static_library
来构建您的代码并从所有
你的目标二进制文件。
将你的 f()
移动到 lib.cc
并使用以下 meson.build
.
project('app12','cpp')
mylib = static_library('mylib', 'lib.cc')
executable('app1', 'app1.cc', link_with : mylib)
executable('app2', 'app1.cc', link_with : mylib)
我有一个包含 58 个目标的新介子项目。它们中的许多使用相同的 *.cc 文件,meson 为每个目标构建每个 *.cc 文件一次,这比 autotools 慢得多。此外,目标之间的编译标志应该相同,因此理论上介子应该能够重新使用对象。
介子是否支持构建许多目标?对于这种情况是否有标准的解决方案?我可以尝试将项目中的所有源代码组织到共享库中,但随后我必须决定如何对它们进行分组,而使用 autotools 我不必做出决定。我还没有找到这方面的文档。
-BenRI
P.S。这是一个最小的例子:
-------- 文件:app1.cc ------
int f(int x ,int y) {return x;}
int main() { return f(0,1);}
------ 文件:meson.build -----
project('app12','cpp')
executable('app1',['app1.cc'])
executable('app2',['app1.cc'])
------------命令------------
% meson . meson
% cd meson
% meson configure -Dwarning_level=3
% ninja
您应该会看到两次未使用参数 'y' 的警告。 文件 compile_commands.json 也有两个条目 app1.cc .
再次使用相同的编译标志编译相同的源代码并且 再次只是浪费 CPU 的力量,因为它会产生相同的 二进制文件,除非你有 unreproducible build tricks 之类的日期和 时间。
如果您的意思是为所有目标构建通用代码,您可以
只需使用 static_library
来构建您的代码并从所有
你的目标二进制文件。
将你的 f()
移动到 lib.cc
并使用以下 meson.build
.
project('app12','cpp')
mylib = static_library('mylib', 'lib.cc')
executable('app1', 'app1.cc', link_with : mylib)
executable('app2', 'app1.cc', link_with : mylib)