CMake

CMake 构建辅助工具是 cmake 命令行调用的封装。它将诸如 cmake --build . --config Release 这样的调用抽象成 Python 方法调用。它还会将 (来自生成器 CMakeToolchain 的) -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake 参数添加到 configure() 调用中,以及其他可能的参数,例如 -DCMAKE_BUILD_TYPE=<config>。将使用的参数将从生成的 CMakePresets.json 文件中获取。

该辅助工具旨在用于 build() 方法中,以便在包直接由 Conan (create, install) 构建时自动调用 CMake 命令。

from conan import ConanFile
from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"
    requires = "hello/0.1"
    options = {"shared": [True, False], "fPIC": [True, False]}
    default_options = {"shared": False, "fPIC": True}

    def generate(self):
        tc = CMakeToolchain(self)
        tc.generate()
        deps = CMakeDeps(self)
        deps.generate()

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

实验性功能。 CMake.configure()CMake.build()CMake.install() 方法具有 **subfolder** 参数,以防您在不同的文件夹中有多个 CMakeLists.txt。此功能允许您分别调用每个 CMakeLists.txt 的 **configure**、**build** 和 **install** 方法,而不会混合生成的 文件和构件,同时还在 **build folder** 和 **package folder** 中创建这些文件夹。

在下面的示例中,我们可以看到如果我们有两个不同的 **CMakeLists.txt** (cmake_1/CMakeLists.txtcmake_2/CMakeLists.txt) 在 folder1folder2 文件夹中,它会是什么样子。

def build(self):
    cmake = CMake(self)

    # Configure and build source_folder/cmake_1/CMakeLists.txt in folder1
    cmake.configure(build_script_folder="cmake_1", subfolder="folder1")
    cmake.build(subfolder="folder1")

    # Configure and build source_folder/cmake_2/CMakeLists.txt in folder2
    cmake.configure(build_script_folder="cmake_2" subfolder="folder2")
    cmake.build(subfolder="folder2")

参考

class CMake(conanfile)

与 CMakeToolchain 功能一起使用的 CMake 辅助工具

参数:

conanfile – 当前的配方对象。始终使用 self

configure(variables=None, build_script_folder=None, cli_args=None, stdout=None, stderr=None, subfolder=None)

读取 CMakeToolchain 生成的 CMakePresets.json 文件,以获取

  • 生成器,用于追加 -G="xxx"

  • 工具链路径,并追加 -DCMAKE_TOOLCHAIN_FILE=/path/conan_toolchain.cmake

  • 声明的 cache variables,并追加 -Dxxx

并调用 cmake

参数:
  • variables – 应为 CMake 变量和值的字典,它们将被映射到命令行 -DVAR=VALUE 参数。请注意,在一般情况下,信息应通过 CMakeToolchain 传递给 CMake,以便在 conan_toolchain.cmake 文件中提供。此 variables 参数仅用于在工具链方法中无法正常工作的情况。

  • build_script_folder – CMakeLists.txt 的路径,以防它不在 layout() 方法中声明的 self.folders.source 中。

  • cli_args – 参数列表 [arg1, arg2, ...],将作为额外的 CLI 参数传递给 cmake 调用。

  • subfolder – (实验性):一个子文件夹的名称,该子文件夹将在 build_folderpackage_folder 中创建。如果未提供,文件将被放置在 build_folderpackage_folder 的根目录中。

  • stdout – 用于将 stdout 重定向到此流

  • stderr – 用于将 stderr 重定向到此流

build(build_type=None, target=None, cli_args=None, build_tool_args=None, stdout=None, stderr=None, subfolder=None)
参数:
  • build_type – 仅用于覆盖多配置生成器(例如 Visual Studio, XCode)中 settings.build_type 的值。对于单配置生成器,将忽略此值,它们将在安装步骤期间使用工具链文件中定义的值。

  • target – 要构建的单个目标名称(字符串),或要传递给 --target 参数的多个目标名称列表(字符串)。

  • cli_args – 参数列表 [arg1, arg2, ...],将直接传递给 cmake --build ... arg1 arg2 命令。

  • build_tool_args – 底层构建系统的参数列表 [barg1, barg2, ...],将通过 -- 指示符传递给命令行:cmake --build ... -- barg1 barg2

  • subfolder – (实验性):一个子文件夹的名称,该子文件夹将在 build_folderpackage_folder 中创建。如果未提供,文件将被放置在 build_folderpackage_folder 的根目录中。

  • stdout – 用于将 stdout 重定向到此流

  • stderr – 用于将 stderr 重定向到此流

install(build_type=None, component=None, cli_args=None, stdout=None, stderr=None, subfolder=None)

相当于运行 cmake --install

参数:
  • component – 要安装的特定组件(如果存在)

  • build_type – 仅用于覆盖 settings.build_type 的值。如果构建是单配置的(例如 Unix Makefiles),则可能会失败,因为在这种情况下,必须在配置时而不是构建时指定构建类型。

  • cli_args – 底层构建系统的参数列表 [arg1, arg2, ...],将传递给命令行:cmake --install ... arg1 arg2

  • subfolder – (实验性):一个子文件夹的名称,该子文件夹将在 build_folderpackage_folder 中创建。如果未提供,文件将被放置在 build_folderpackage_folder 的根目录中。

  • stdout – 用于将 stdout 重定向到此流

  • stderr – 用于将 stderr 重定向到此流

test(build_type=None, target=None, cli_args=None, build_tool_args=None, env='', stdout=None, stderr=None)

相当于运行 cmake –build . –target=RUN_TESTS。

参数:
  • build_type – 仅用于覆盖 settings.build_type 的值。如果构建是单配置的(例如 Unix Makefiles),则可能会失败,因为在这种情况下,必须在配置时而不是构建时指定构建类型。

  • target – 要运行的构建目标名称,默认为 RUN_TESTStest

  • cli_args – 与上面 build() 相同,参数列表 [arg1, arg2, ...],将作为底层构建系统的额外参数传递。

  • build_tool_args – 与上面 build() 相同。

  • stdout – 用于将 stdout 重定向到此流

  • stderr – 用于将 stderr 重定向到此流

ctest(cli_args=None, env='', stdout=None, stderr=None)

相当于运行 ctest …

参数:
  • cli_args – 参数列表 [arg1, arg2, ...],将作为额外的 ctest 命令行参数传递。

  • env – 要激活的环境文件,默认为 conanbuild + conanrun。

  • stdout – 用于将 stdout 重定向到此流

  • stderr – 用于将 stderr 重定向到此流

conf

CMake() 构建辅助工具受以下 [conf] 变量的影响:

  • tools.build:verbosity 将接受 quietverbose 中的一个,并在使用 Visual Studio 生成器(MSBuild 构建系统)用于 CMake 时传递给 CMake.build() 命令。它通过调用 cmake --build . --config Release -- /verbosity:Diagnostic 作为参数传递给底层构建系统。

  • tools.compilation:verbosity 将接受 quietverbose 中的一个,并传递给 CMake,它将设置 -DCMAKE_VERBOSE_MAKEFILE(如果为 verbose)。

  • tools.build:jobs 参数用于在运行 Ninja 生成器时使用 --jobs 参数。

  • tools.microsoft.msbuild:max_cpu_count 参数用于在运行 MSBuild 时使用 /m/maxCpuCount)。如果 max_cpu_count=0,则使用不带参数的 /m,这意味着使用所有可用的 CPU。

  • tools.cmake:cmake_program 指定 CMake 可执行文件的位置,而不是使用在 PATH 中找到的那个。

  • tools.cmake:install_strip(**已弃用**,请使用 tools.build:install_strip)如果设置为 True,将把 --strip 传递给 cmake --install 调用。

  • tools.build:install_strip(自 Conan 2.18.0 起)如果设置为 True,将把 --strip 传递给 cmake --install 调用。