CMake¶
CMake 构建助手是 cmake 命令行的封装。它会将类似 cmake --build . --config Release 这样的调用抽象为 Python 方法调用。它还会将参数 -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake(来自生成器 CMakeToolchain)添加到 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 文件夹** 和 **package 文件夹** 中创建这些文件夹。
在下面的示例中,我们可以看到如果我们在 **folder1** 和 **folder2** 文件夹中有两个不同的 **CMakeLists.txt**(**cmake_1/CMakeLists.txt** 和 **cmake_2/CMakeLists.txt**)会是什么样子。
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)¶
CMake 助手,与 CMakeToolchain 功能一起使用
- 参数:
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 的路径,如果它不在声明的
self.folders.source中,则在layout()方法中。cli_args – 参数列表
[arg1, arg2, ...],这些参数将作为额外的 CLI 参数传递给 cmake 调用subfolder – (实验性):要在
build_folder和package_folder中创建的子文件夹。如果未提供,文件将放置在build_folder和package_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 – 仅用于覆盖
settings.build_type中定义的值,用于多配置生成器(例如 Visual Studio、XCode)。对于单配置生成器,此值将被忽略,它们将使用工具链文件在安装步骤期间定义的那个值。target – 要构建的单个构建目标的名称(字符串),或要传递给
--target参数的多个构建目标的名称(字符串列表)。cli_args – 参数列表
[arg1, arg2, ...],这些参数将传递给cmake --build ... arg1 arg2命令。build_tool_args – 参数列表
[barg1, barg2, ...],用于底层构建系统,这些参数将在--指示符之后传递给命令行:cmake --build ... -- barg1 barg2subfolder – (实验性):要在
build_folder和package_folder中创建的子文件夹。如果未提供,文件将放置在build_folder和package_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 arg2subfolder – (实验性):要在
build_folder和package_folder中创建的子文件夹。如果未提供,文件将放置在build_folder和package_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_TESTS或testcli_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将接受quiet或verbose,以传递给CMake.build()命令,当使用 Visual Studio 生成器(MSBuild 构建系统)用于 CMake 时。它作为参数传递给底层构建系统,通过调用cmake --build . --config Release -- /verbosity:Diagnostictools.compilation:verbosity将接受quiet或verbose,以传递给 CMake,如果为verbose,则设置-DCMAKE_VERBOSE_MAKEFILEtools.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:ctest_args(自 Conan 2.23.0 起)会将参数列表注入到CMake.ctest()运行器。例如,tools.cmake:ctest_args=["--debug", "--output-junit myfile"]将这些参数添加到 ctest 命令。tools.cmake:install_strip(**已弃用**,使用tools.build:install_strip)如果设置为True,则会将--strip传递给cmake --install调用。tools.build:install_strip(自 Conan 2.18.0 起) 如果设置为True,会将--strip传递给cmake --install调用。