使用CMake为不同的构建类型创建构建树

Create build tree for different build types with CMake

本文关键字:构建 类型 创建 CMake 使用      更新时间:2023-10-16

我知道如何根据构建类型(发布、调试等)让CMake输出库和bin,但是,为了减少(重新)编译时间,我希望CMake在不同的子文件夹中构建它们。

假设我有这种树

|- CMakeLists.txt
|- build/
|- src/

如果我有调试、发布和relwithdebinfo构建,我希望CMake自动为我创建一个类似的树

|- CMakeLists.txt
|- build/
|--- Debug/
|--- Release/
|--- RelWithDebInfo/
|- src/

等等。这可能吗?如果可能,我该如何实现我的目标?

我不想要像"你应该从不同的文件夹运行CMake"这样的答案,因为对于visualstudio来说,这会导致多个解决方案,等等。我希望能够只从一个文件夹运行CMake,并让它自己处理子文件夹。

如果不使用CMake,它将自动为支持多种配置的生成器(如Visual Studio)执行此操作。

如果覆盖默认输出位置,则应通过*_OUTPUT_DIRECTORY目标属性进行覆盖,该属性支持生成器表达式:

set_property(TARGET my_lib
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/$<CONFIG>/bin)

注意$<CONFIG>生成器表达式,它将扩展到配置的名称(Debug、Release等)

还要注意,如果您希望配置目录位于目录树的底部,您甚至可能不必显式地给出生成器表达式:

此属性指定库目标文件所在的目录应该建造。属性值可以使用生成器表达式。多配置生成器(VS、Xcode)为每个配置附加一个子目录到指定目录,除非生成器表达式使用。

控制输出目录的三个属性是ARCHIVE_OUTPUT_DIRECTORYLIBRARY_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY。这一页解释了区别。

此外,您可能还需要为带有pdb调试符号的构建设置PDB_OUTPUT_DIRECTORY

现在,正如开头所提到的,所有这些都只适用于支持多种配置的生成器。对于像Makefiles这样的单配置生成器,情况有所不同。在这里,当运行CMake时,您必须满足于一个特定的配置(通过在命令行或CMake gui上设置CMAKE_BUILD_TYPE变量)。如果要切换配置,则必须使用该变量的不同设置重新运行CMake。

这些生成器不支持同时具有多个配置。因此,如果您使用单个配置生成器,并且您知道您需要定期调试和发布构建,那么最好为不同的配置保留单独的构建目录,并在每个目录中分别运行cmake。