问题标签 [meson-build]

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.

0 投票
1 回答
4728 浏览

build - 'cmake rebuild_cache' 对于 *just* 一个子目录?

我对 CMake 的生成文件阶段很慢有一个问题,这类似于这个未回答的问题:

CMake 生成 makefile 的速度很慢

我的项目由一个顶级CMakeLists.txt文件组成,该文件add_subdirectory()用于为各个库和可执行组件添加各种子项目。

对于给定的组件,该CMakeLists.txt文件包含以下内容:

我可以使用以下方法仅构建该目录的内容:

如果我修改CMakeLists.txt子目录中的文件(作为从纯 Makefile 迁移到 CMake 的一部分,我已经做了很多工作)然后make正确运行它重新运行 CMake 以更新配置,就像我运行make rebuild_cache.

但是,我注意到它实际上重新配置了整个项目。我真的希望 CMake 足够聪明,知道它只需要在当前目录和子目录中重新生成 Makefile。

有没有更好的方法来构建 CMake 项目来实现这一目标? 我看到有些人在每个子项目中为每个 CMakeLists.txt使用project() 。一般来说,这是个好主意吗?

或者/另外是否有一些方法可以加快 CMake 的生成步骤?(目前我有 60 多岁以上)

如果您想讨论为什么 CMake 本身应该或不应该能够并行运行(想象一下cmake -j),则可以加分。


我添加了 meson-build 标签作为适度的赏金,但仅此一项还没有引起足够的关注来保证答案。正是这种问题可能会导致人们将构建系统切换到介子构建(假设它没有类似的问题)或类似的东西。

正确的答案可能是如果不将源代码修改为 CMake 就无法完成。为了获得赏金,我需要解释 CMake 的工作原理和/或存在缺陷的地方。


澄清:在我的情况下,生成步骤很慢。配置本身足够快,但 CMake 在输出"-- 配置完成""-- 生成完成"之间挂起很长一段时间。

对于完整的缓存重建,我运行:

在引擎盖下运行:

我认为-B是 的同义词--build。文档中没有正确描述这两个选项。-H是源目录的根目录(与--help您相信的文档不同)。

得到"Configuring done"的输出很快,但从那里开始很慢:

例如,

如果在子目录中编辑单个 CMakeLists.txt 文件,然后运行make -n,它将运行:

--check-build-system 是另一个未记录的选项。

效果是一样的——重新生成整个构建系统,而不仅仅是当前子树。源内构建和源外构建之间的行为没有区别。

如果我运行跟踪,例如:

花费的大部分时间似乎都花在(或之间)打开、访问和取消链接调用上。

每个任务的长度变化很大,但数量庞大。我不知道 Labels.json 和 Labels.txt 文件是关于什么的(CMake 内部的东西)。

一次运行:

再次运行相同的命令:

请注意,忍者生成器要快得多(尽管仍然不够出色)。例如,

请注意,该项目还没有为 Ninja 做好准备,因为存在如下错误:

待解决。这个问题实际上是关于为什么Makefile生成器很慢。我不确定 Ninja 显示的问题是这里有用的提示还是红鲱鱼。


构建具有更多优化的 CMake 并没有帮助。

根据我的跟踪输出它和时间的输出,它不太可能会。用户时间以及因此在 CMake 代码本身中花费的时间非常少。(参见例如“真实”、“用户”和“系统”在 time(1) 的输出中是什么意思?)。

这是我为完整性所做的尝试:

实际上使用更优化的 CMake确实使配置部分更快,但在我的情况下,生成部分很慢。从时间上看,这一步似乎是受 I/O 限制的。


我决定调查 Florian 的想法,即使用文件流的内存 insteam 存储临时文件可能会有所作为。

我决定尝试简单的方法并破解 CMake 将 .tmp 文件写入 RAM 磁盘。

然后我全力以赴,尝试在 RAM 磁盘上生成构建系统:

我很惊讶地发现这对挂钟时间没有任何影响:

与 ramfs 类似:

这里会发生什么?我在猜测子流程,但我无法确定哪些子流程正在消耗挂钟时间(如果有的话)。他们看起来很短暂。


为了完整起见,以下是 perf 的一些输出(使用 构建的 CMake -fno-omit-frame-pointer):

perf report -g graph -no-children

0 投票
2 回答
434 浏览

meson-build - 在介子中指定忍者版本?

我正在运行基于 Ubuntu 14.04LTS 的 Elementary OS。Ninja 的版本为 1.3.4。运行介子时,我收到错误:

根据http://www.mariocampos.io/blog/meson,-first-impressions/我可以通过获取更新版本的 Ninja 来解决这个问题。没关系,我能做到。但是,我更喜欢保留软件包 repos 中的软件,所以我的问题是:

我可以告诉 Meson 生成一个不需要这么高版本的 Ninja 构建文件,还是 Meson 使用仅在 1.5.1 中可用的 Ninja 功能?

0 投票
1 回答
840 浏览

meson-build - 为 Meson Build 运行特定测试

使用介子构建,如果我在 中定义了多个测试meson.build,如此处所示是否可以构建和运行特定的单个测试?假设我正在开发一个特定的模块,并且想使用命令提示符只运行该模块的测试?

0 投票
4 回答
8535 浏览

python - 如何在 Windows 上运行介子构建系统?

我想在 Windows 上使用介子构建系统。我是蟒蛇菜鸟。它看起来像我安装了它,但我不知道如何运行它。

我已经安装了 python 3.6。我已经从“cmd”安装了介子:

我尝试运行介子:

我怎样才能使用/运行这个东西?

0 投票
1 回答
557 浏览

c++ - 在 Mac 上使用带有介子的 Qt 出现问题

我偶然发现了构建系统介子 ( http://mesonbuild.com/ ),它因其简单性和原生 Qt 支持而吸引了我。

但是,当我按照教程进行操作时,我收到了错误消息

这很奇怪,因为当我使用 Qt Creator 时,我可以轻松地创建、编译和执行 Qt 项目。我正在使用 MacOS Sierra。我能以某种方式告诉介子 qmake 的位置吗?

0 投票
1 回答
6939 浏览

c++ - 为介子设置编译器

我正在尝试按照http://mesonbuild.com/samples.html上的教程在我的 Mac(使用 macOS Sierra)上使用 Meson 构建系统构建一个基本的 Qt 应用程序。

我的 meson.build 文件如下所示:

我有一个只包含四个文件的小型测试程序:main.cpp、mainwindow.h、mainwindow.cpp 和 mainwindow.ui。

源代码如下。

主.cpp:

主窗口.h:

主窗口.cpp:

当我使用 qmake 作为构建系统并使用以下 qmake 文件时,程序会按预期编译和执行:

当我执行

它工作正常,除了警告:

当我切换到构建目录并调用时,它也可以毫无错误地编译

但是当我执行程序时出现以下错误:

链接器似乎找不到库?这很奇怪,因为在 Qt Creator(使用 qmake)中,源代码编译得很好。

提前感谢您的帮助。

0 投票
2 回答
3532 浏览

qt-creator - 如何使用 Qt creator 设置介子

我通常使用 Qt creator 和 cmake 来编写 C++ 项目。最近我读了很多关于介子的文章,它很简单,我喜欢测试它。这个例子解释了如何设置介子。

然而,当使用介子时,我仍然喜欢使用 Qt 创建者的快捷方式来构建 ( ctrl + B) 或运行 ( ctrl + R)。当我使用“通用项目”时,如何配置 Qt 创建者来构建介子项目?

0 投票
1 回答
1045 浏览

meson-build - 构建类型为调试时如何定义调试?

当构建类型以“debug”开头时,我想将“-DDEBUG”传递给 C++ 编译器,如下所示:

但是没有meson.build_type(),所以我从介子那里得到这个错误信息:

如何获得构建类型?DEBUG或者在调试版本中有不同的定义方式吗?

0 投票
2 回答
3900 浏览

meson-build - 如何包含来自我的另一个 Meson 项目的库和头文件?

我有两个项目在进行中,一个是一个库,另一个想使用那个库中的一些。

我的目录结构是:

假设两个项目都是用 meson-build 构建的,projectA 是库。

1- 如何让 ProjectB 看到 ProjectA 的包含文件?2-如何链接projectA的.lib文件?(当前位于 build 文件夹中)

当我尝试使用相对路径创建依赖项时,我找不到获取 .lib 文件的东西?我只能使用以下方法获取头文件:

注意我使用的是windows,但也将使用linux。

0 投票
2 回答
640 浏览

meson-build - 如何在 Meson 中将多个文件连接成一个文件?

我在 Meson 的一项基本任务中遇到了麻烦,我需要在构建过程中将多个文件连接成一个;基本上:

或者

custom_target()但是,无论我使用generator()还是任何其他功能,Meson 都找不到compiled.txt或无法处理从多个输入文件到单个输出文件的转换。

有没有简单的方法来实现这一目标?

更新:

使用run_command()我已经设法构建compiled.txt并让它出现在源目录中。最终我希望compiled.txt(我在 gresource.xml 中列出)由gnome.compile_resources(). 有没有办法可以运行此命令并将文件直接传递给该函数进行处理?