cmake_layout

cmake_layout() 设置 folderscpp 属性以遵循典型的 CMake 项目结构。

from conan.tools.cmake import cmake_layout

def layout(self):
    cmake_layout(self)

注意

要尝试它,你可以使用 conan new cmake_lib -d name=hello -d version=1.0 模板。

分配的值取决于将要使用的 CMake 生成器。它可以通过 tools.cmake.cmaketoolchain:generator [conf] 条目定义,或者在 recipe 中传递给 cmake_layout(self, cmake_generator) 函数。 如果是多配置生成器(如 Visual Studio 或 Xcode)或单配置生成器(如 Unix Makefiles),则分配的值是不同的。

这些是 cmake_layout 分配的值

  • conanfile.folders.source: src_folder 参数,或者如果未指定则为 .

  • conanfile.folders.build:
    • build: 如果 CMake 生成器是多配置的。

    • build/Debugbuild/Release: 如果 CMake 生成器是单配置的,具体取决于 build_type。

    • "build" 字符串可以通过 build_folder 参数定义为其他值。

  • conanfile.folders.generators: build/generators

  • conanfile.cpp.source.includedirs: ["include"]

  • conanfile.cpp.build.libdirsconanfile.cpp.build.bindirs
    • ["Release"]["Debug"] 对于多配置 CMake 生成器。

    • . 对于单配置 CMake 生成器。

参考

cmake_layout(conanfile, generator=None, src_folder='.', build_folder='build')
参数:
  • conanfile – 当前的 recipe 对象。始终使用 self

  • generator – 允许定义 CMake 生成器。在大多数情况下,不需要传递它,因为它将从配置 tools.cmake.cmaketoolchain:generator 中获取值,或者它将从 settings 中自动推断生成器。

  • src_folderconanfile.folders.source 的值,如果你的源代码(和 CMakeLists.txt)在子文件夹中,请更改它。

  • build_folder – 指定 “base” 构建文件夹的名称。 默认值为 “build”,但如果该文件夹名称被项目使用,则可以定义一个不同的名称。

conf

cmake_layout 受这些 [conf] 变量的影响

  • tools.cmake.cmake_layout:build_folder_vars 设置、选项、 self.nameself.version 以及常量 const.xxx 的列表,用于自定义 conanfile.folders.build 文件夹。 请参阅下面的 多设置/选项 cmake_layout 部分。

  • tools.cmake.cmake_layout:build_folder (Conan 2.2.0 版本新增)(实验性) 将其值用作本地构建的 conanfile.folders.build 的 base 文件夹。

  • tools.cmake.cmake_layout:test_folder (Conan 2.2.0 版本新增)(实验性) 将其值用作 test_package 构建的 conanfile.folders.build 的 base 文件夹。 如果该值为 $TMP,Conan 将创建并使用一个临时文件夹。

多设置/选项 cmake_layout

folders.buildconanfile.folders.generators 可以自定义以考虑 settingsoptions ,而不仅仅是 build_type。 使用 tools.cmake.cmake_layout:build_folder_vars conf 来声明设置、选项和/或 self.name 以及 self.version 和用户常量的列表

conan install . -c tools.cmake.cmake_layout:build_folder_vars="['settings.compiler', 'options.shared']"

对于前面的示例, cmake_layout (安装 Release/static 默认配置) 分配的值将是

  • conanfile.folders.build:
    • build/apple-clang-shared_false: 如果 CMake 生成器是多配置的。

    • build/apple-clang-shared_false/Debug: 如果 CMake 生成器是单配置的。

  • conanfile.folders.generators: build/generators

如果我们使用不同的配置重复之前的安装

conan install . -o shared=True -c tools.cmake.cmake_layout:build_folder_vars="['settings.compiler', 'options.shared']"

cmake_layout (安装 Release/shared 配置) 分配的值将是

  • conanfile.folders.build:
    • build/apple-clang-shared_true: 如果 CMake 生成器是多配置的。

    • build/apple-clang-shared_true/Debug: 如果 CMake 生成器是单配置的。

  • conanfile.folders.generators: build-apple-clang-shared_true/generators

因此,我们可以为我们想要安装的任意数量的不同配置保留单独的文件夹。 Recipe 属性(如名称和版本)和用户常量也可以使用

$ conan install . -c tools.cmake.cmake_layout:build_folder_vars="['const.myvalue, 'self.name']"

它将创建像 build/myvalue-pkgname 这样的文件夹。

CMakeToolchain 生成器处生成的 CMakePresets.json 文件,也将考虑此 tools.cmake.cmake_layout:build_folder_vars 配置,以为预设生成不同的名称,这对于安装 N 个配置并通过选择所选预设来为其中任何一个构建我们的项目非常方便。