首页 > 解决方案 > 打包构建环境为profile的build_requires,使用系统编译器代替

问题描述

我将首先尝试描述我的设置:

如果我尝试如下构建一个包:

$ conan create . foo/version --build=missing -pr linux-x86_64-Debug -pr cmake-3.18.2 -pr gcc-10.1.0

生成的配置是:

Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Debug
compiler=gcc
compiler.libcxx=libstdc++11
compiler.version=10.1
os=Linux
os_build=Linux
[options]
[build_requires]
*: gcc/10.1.0, cmake/3.18.2
[env]

在我看来是正确的...

然后柯南开始cmake为 gcc 10.1 x86_64 配置构建包:

cmake/3.18.2: WARN: Build folder is dirty, removing it: /home/manuel/.conan/data/cmake/3.18.2/_/_/build/46c0026dddc0e0537a797652343e8e1e9d0e39e7
cmake/3.18.2: Copying sources to build folder
cmake/3.18.2: Building your package in /home/manuel/.conan/data/cmake/3.18.2/_/_/build/46c0026dddc0e0537a797652343e8e1e9d0e39e7
cmake/3.18.2: Generator cmake created conanbuildinfo.cmake
cmake/3.18.2: Calling build()

但随后构建失败,因为cmake包 cmake config正在使用系统编译器

-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Conan: called by CMake conan helper
-- Conan: called inside local cache
-- Conan: Adjusting output directories
-- Conan: Using cmake global configuration
-- Conan: Adjusting default RPATHs Conan policies
-- Conan: Adjusting language standard
-- Conan: Compiler GCC>=5, checking major version 10.1
-- Conan: Checking correct version: 7.4
CMake Error at ../conanbuildinfo.cmake:510 (message):
  Detected a mismatch for the compiler version between your conan profile
  settings and CMake:

  Compiler version specified in your conan profile: 10.1

  Compiler version detected in CMake: 7.4

  Please check your conan profile settings (conan profile show
  [default|your_profile_name])

  P.S.  You may set CONAN_DISABLE_CHECK_COMPILER CMake variable in order to
  disable this check.
Call Stack (most recent call first):
  ../conanbuildinfo.cmake:592 (conan_error_compiler_version)
  ../conanbuildinfo.cmake:695 (check_compiler_version)
  ../conanbuildinfo.cmake:249 (conan_check_compiler)
  CMakeLists.txt:9 (conan_basic_setup)

这看起来与https://github.com/conan-io/conan/issues/1842非常相似,但该问题来自 3 年前。

标签: conan

解决方案


柯南在一些版本之前了解了主机构建上下文,并且能够为这些上下文管理不同的配置。这比旧的更受欢迎,os_build并且arch_buildConanCenter 中的设置和软件包正在朝着这个新功能发展。

在您的场景中,您正在尝试构建一个library使用包gcccmake作为构建要求。您正在为主library机构建并使用包并提供应在构建机器中运行的工具。即使您没有进行交叉编译,我们也可以同意原生构建只是一个特定的用例,其中主机构建是同一台机器,因此它们使用相同的柯南配置。gcccmake

回到你的例子。您需要主机平台的配置文件,即您要为其生成的配置文件library。这些是您在问题中列出的所有配置文件。但是您还需要构建上下文的配置文件,柯南将使用该配置文件来构建(或检索)gcccmake包。例如,您可能希望使用配置文件在调试模式下linux-x86_64-Debug编译您的文件,同时在 Release 中使用和。librarygcccmake

通常,构建上下文的配置文件可以是柯南检测到的默认配置文件。

试试这个命令而不是你的(注意--profile:build=default):

conan create <library/conanfile.py> foo/version --build=missing --profile:host linux-x86_64-Debug --profile:host cmake-3.18.2 --profile:host gcc-10.1.0 --profile:build=default 

现在柯南将使用新功能并将包分配给相应的上下文:

  • library并且它的所有依赖项都将分配给主机上下文,并将使用来自所有--profile:host配置文件的信息:您的 Debug 构建和 Conan 将添加cmakegcc作为构建要求。
  • gcccmake,因为它们是此命令中的构建要求,将被分配给构建上下文并使用来自--profile:build. 如果柯南需要构建这些包,它将使用该配置文件中的设置,而不是主机配置文件的设置。

使用此设置,您可以在一次运行中构建交叉构建场景中的所有包主机上下文中的包将使用您的 build-requiresgcc进行构建,而构建上下文中的包将使用--profile:build.

是的,在这种情况下,构建上下文中的包将使用系统中的编译器......除非您[build_requires]--profile:build.


推荐阅读