避免在柯南配置文件和 CMake 之间重复配置

Posted

技术标签:

【中文标题】避免在柯南配置文件和 CMake 之间重复配置【英文标题】:Avoid repeating config between Conan profile and CMake 【发布时间】:2021-02-10 05:47:22 【问题描述】:

我一直在为个人项目学习柯南,但我有一个问题无法通过查看文档和示例来回答。

柯南的“个人资料”和 CMake 之间似乎存在尴尬的缺乏互动。我的意思是:有许多不同的构建参数必须手动保持同步 - 使用与 conan install 期间选择的参数不同的参数运行 CMake 将导致构建错误。

举一个更具体的例子,这是我的两个配置以及我将如何使用它们来构建:

$ cat ~/.conan/profiles/gcc_debug
[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
compiler=gcc
compiler.version=10
compiler.libcxx=libstdc++11
build_type=Debug
[options]
[build_requires]
[env]

$ export CC=/usr/bin/gcc
$ export CXX=/usr/bin/g++
$ conan install ../src --profile gcc_debug
$ cmake ../src -GNinja -DCMAKE_BUILD_TYPE=Debug
$ cmake --build .
$ cat ~/.conan/profiles/clang_cl_release
[settings]
os=Windows
os_build=Windows
arch=x86_64
arch_build=x86_64
compiler=Visual Studio
compiler.version=16
compiler.toolset=ClangCL
build_type=Release
[options]
[build_requires]
[env]

$ conan install ../src --profile clang_cl_release
$ cmake ../src -G"Visual Studio 16 2019" -TClangCL
$ cmake --build . --config=Release

在第一个示例中,我必须重复 gccDebug。 在第二个中,我必须重复Visual Studio16ClangCLRelease

不得不重复自己这么多次感觉很糟糕,尤其是当这些选项分布在多个长时间运行的命令中时,并且忘记一个选项可能会导致不明显的错误消息。对我来说,当您调用 cmake_basic_setup() 时,柯南不仅仅强制(覆盖)适当的 CMake 变量,这对我来说也很奇怪;它已经知道它所期望的值,如果它们不匹配就会爆炸。

推荐的处理方法是什么?

【问题讨论】:

【参考方案1】:

通常您会使用 Conan 设置所有外部库,然后从 CMake 中使用它们。但是,您可以采取其他方式:让 CMake 调用 Conan 来安装外部依赖项。

来自How to launch conan install from cmake的示例代码:

cmake_minimum_required(VERSION 2.8)
project(myproject CXX)

# Download automatically, you can also just copy the conan.cmake file
if(NOT EXISTS "$CMAKE_BINARY_DIR/conan.cmake")
   message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
   file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake"
                  "$CMAKE_BINARY_DIR/conan.cmake")
endif()

include($CMAKE_BINARY_DIR/conan.cmake)

conan_cmake_run(REQUIRES Catch2/2.6.0@catchorg/stable
                BASIC_SETUP)

add_executable(main main.cpp)
target_link_libraries(main $CONAN_LIBS)

【讨论】:

啊,有趣的想法。我得调查一下。【参考方案2】:

我刚开始研究conan build,这似乎很有希望。我最初跳过了这个,因为它看起来只适用于发布柯南包的人,但现在我认为它也适用于消费者。事实上,this page 甚至明确提到了我的问题陈述:

conan build 将使用conan install 中使用的设置,这些设置已缓存在本地conaninfo.txt 和您的构建文件夹中的文件中。这简化了流程并减少了已安装包与当前项目配置不匹配的错误。 [...] 实施和使用 conanfile.py build() 方法可确保我们在安装需求和构建项目时始终使用相同的设置,并简化构建系统的调用。

【讨论】:

【参考方案3】:

查看推荐的柯南用法:https://github.com/conan-io/cmake-conan

set(CONAN_PROFILE_NAME $CMAKE_SYSTEM_NAME-$CMAKE_GENERATOR)
execute_process(COMMAND $CONAN_CMD profile new $CONAN_PROFILE_NAME --detect ERROR_QUIET)
conan_cmake_autodetect(settings)

# REPEAT THIS FOR EACH OF YOUR REMOTES
conan_cmake_configure(REQUIRES zlib/1.2.0 GENERATORS cmake_find_package)
conan_cmake_install(PATH_OR_REFERENCE .
                BUILD missing
                REMOTE conancenter
                PROFILE $CONAN_PROFILE_NAME
                SETTINGS $settings)
  
find_package(zlib)

【讨论】:

以上是关于避免在柯南配置文件和 CMake 之间重复配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用柯南遥控器配置 gitlab-runner?

在调试和发布配置之间切换

柯南和 Cmake:目标已经存在

Docker配置文件daemon.json解析

CMake 和 CPack。配置文件中的安装路径

cmake 怎么配置才能生成预编译文件和汇编文件