使用多个构建目录
Meson 的主要设计目标之一是构建所有项目时,将所有生成的构建文件放在一个单独的子目录中。这意味着所有构建过程中生成的所有文件都将放置在一个单独的子目录中。这与传统的 Unix 方式不同,传统的 Unix 方式会在源代码中构建项目。非源代码构建具有两大优势。
首先,这使得 VCS "忽略" 文件非常简单。在传统的构建系统中,您可能需要使用数十行的定义,其中大多数包含通配符。在非源代码构建中,所有这些繁琐的工作都消失了。Meson 项目的常见忽略文件只包含几行,即构建目录和 IDE 项目文件。(注意,从 Meson 0.57.0 开始,构建目录会自动被 git 和 mercurial 忽略,因为会在构建目录中生成一个忽略文件。)
其次,这使得清理项目变得非常容易:只需删除构建子目录即可。您无需猜测是否需要运行 make clean
、make distclean
、make mrproper
或其他命令。当您删除构建子目录时,不可能有任何来自旧构建的残留状态。
但真正的益处来自其他地方。
同一源代码树的多个构建目录
由于构建目录是完全独立的,并且将源代码树视为一个只读数据,因此您可以同时为任何源代码树创建任意数量的构建树。由于所有构建树都可以具有不同的配置,因此这非常强大。现在您可能想知道为什么要同时拥有多个构建设置。让我们通过设置一个假设的项目来研究这个问题。
首先,要设置默认构建,即我们 90% 的时间都会使用的构建。在这里,我们使用系统编译器,并启用调试和无优化,以便它尽可能快地构建。这是 Meson 的默认项目类型,因此设置它很简单。
mkdir builddir
meson setup builddir
另一个常见的设置是启用调试和优化来构建,例如,运行性能测试。设置它同样简单。
mkdir buildopt
meson --buildtype=debugoptimized buildopt
对于默认编译器为 GCC 的系统,我们还想使用 Clang 进行编译。因此,让我们这样做。
mkdir buildclang
CC=clang CXX=clang++ meson setup buildclang
您也可以添加交叉构建。例如,让我们使用 MinGW 设置一个 Linux -> Windows 交叉编译构建。
mkdir buildwine
meson --cross-file=mingw-cross.txt buildwine
交叉编译文件设置了 Wine,因此您不仅可以编译应用程序,还可以通过发出命令 meson test
来运行单元测试套件。
要编译任何这些构建类型,只需进入相应的构建目录并运行 meson compile
或指示您的 IDE 执行相同的操作。请注意,一旦您设置了构建目录,您只需运行 Ninja,Meson 将确保生成的构建根据源代码完全是最新的。即使您在几周内都没有触碰其中一个目录,并且对您的构建配置进行了重大更改,Meson 也会检测到这一点并将构建目录更新到最新状态 (或者如果无法做到这一点,则会打印错误)。这使您可以将大部分工作放在默认目录中,并在需要时使用其他目录,而无需管理您的构建目录。
专门用途
独立的构建目录可以轻松集成各种不同的工具。例如,Clang 附带一个静态分析器。它旨在从给定的源代码树中从头开始运行。使用 Meson 运行它的步骤非常简单。
rm -rf buildscan
mkdir buildscan
scan-build meson setup buildscan
cd buildscan
scan-build ninja
这些命令对每个 Meson 项目都相同,因此它们甚至可以放在一个脚本中,将静态分析转换为一个单一命令。
搜索结果是