settings.yml¶
此配置文件位于 Conan 用户主目录中,即 [CONAN_HOME]/settings.yml
。它看起来像这样:
# This file was generated by Conan. Remove this comment if you edit this file or Conan
# will destroy your changes.
os:
Windows:
subsystem: [null, cygwin, msys, msys2, wsl]
WindowsStore:
version: ["8.1", "10.0"]
WindowsCE:
platform: [ANY]
version: ["5.0", "6.0", "7.0", "8.0"]
Linux:
iOS:
version: &ios_version
["7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4", "9.0", "9.1", "9.2", "9.3",
"10.0", "10.1", "10.2", "10.3",
"11.0", "11.1", "11.2", "11.3", "11.4",
"12.0", "12.1", "12.2", "12.3", "12.4", "12.5",
"13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7",
"14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "14.8",
"15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "15.7", "15.8",
"16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6", "16.7",
"17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", "17.8",
"18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6",
"26.0"]
sdk: ["iphoneos", "iphonesimulator"]
sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4",
"13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7",
"14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "15.0", "15.2", "15.4",
"15.5", "16.0", "16.1", "16.2", "16.4", "17.0", "17.1", "17.2", "17.4", "17.5",
"18.0", "18.1", "18.2", "18.4", "18.5",
"26.0"]
watchOS:
version: ["4.0", "4.1", "4.2", "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2", "6.3",
"7.0", "7.1", "7.2", "7.3", "7.4", "7.5", "7.6",
"8.0", "8.1", "8.3", "8.4", "8.5", "8.6", "8.7",
"9.0","9.1", "9.2", "9.3", "9.4", "9.5", "9.6",
"10.0", "10.1", "10.2", "10.3", "10.4", "10.5", "10.6",
"11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6",
"26.0"]
sdk: ["watchos", "watchsimulator"]
sdk_version: [null, "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2",
"7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.0.1", "8.3", "8.5", "9.0", "9.1",
"9.4", "10.0", "10.1", "10.2", "10.4", "10.5",
"11.0", "11.1", "11.2", "11.4", "11.5",
"26.0"]
tvOS:
version: ["11.0", "11.1", "11.2", "11.3", "11.4",
"12.0", "12.1", "12.2", "12.3", "12.4",
"13.0", "13.2", "13.3", "13.4",
"14.0", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7",
"15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6",
"16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6",
"17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6",
"18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6",
"26.0"]
sdk: ["appletvos", "appletvsimulator"]
sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4",
"13.0", "13.2", "13.3", "13.4", "14.0", "14.2", "14.3", "14.4", "14.5", "15.0",
"15.2", "15.4", "15.5", "16.0", "16.1", "16.4", "17.0", "17.1", "17.2", "17.4", "17.5",
"18.0", "18.1", "18.2", "18.4", "18.5",
"26.0"]
visionOS:
version: ["1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6",
"26.0"]
sdk: ["xros", "xrsimulator"]
sdk_version: [null, "1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.4", "2.5",
"26.0"]
Macos:
version: [null, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15",
"11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6", "11.7",
"12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6", "12.7",
"13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7",
"14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7",
"15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6",
"26.0"]
sdk_version: [null, "10.13", "10.14", "10.15", "11.0", "11.1", "11.2", "11.3", "12.0", "12.1",
"12.3", "12.4", "13.0", "13.1", "13.3", "14.0", "14.2", "14.4", "14.5",
"15.0", "15.1", "15.2", "15.4", "15.5",
"26.0"]
subsystem:
null:
catalyst:
ios_version: *ios_version
Android:
api_level: [ANY]
ndk_version: [null, ANY]
FreeBSD:
SunOS:
AIX:
Arduino:
board: [ANY]
Emscripten:
Neutrino:
version: ["6.4", "6.5", "6.6", "7.0", "7.1"]
baremetal:
VxWorks:
version: ["7"]
arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64,
armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, arm64ec,
sparc, sparcv9,
mips, mips64, avr, s390, s390x, asm.js, wasm, wasm64, sh4le,
e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7,
riscv64, riscv32,
xtensalx6, xtensalx106, xtensalx7,
tc131, tc16, tc161, tc162, tc18]
compiler:
sun-cc:
version: ["5.10", "5.11", "5.12", "5.13", "5.14", "5.15"]
threads: [null, posix]
libcxx: [libCstd, libstdcxx, libstlport, libstdc++]
gcc:
version: ["4.1", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9",
"5", "5.1", "5.2", "5.3", "5.4", "5.5",
"6", "6.1", "6.2", "6.3", "6.4", "6.5",
"7", "7.1", "7.2", "7.3", "7.4", "7.5",
"8", "8.1", "8.2", "8.3", "8.4", "8.5",
"9", "9.1", "9.2", "9.3", "9.4", "9.5",
"10", "10.1", "10.2", "10.3", "10.4", "10.5",
"11", "11.1", "11.2", "11.3", "11.4", "11.5",
"12", "12.1", "12.2", "12.3", "12.4", "12.5",
"13", "13.1", "13.2", "13.3", "13.4",
"14", "14.1", "14.2", "14.3",
"15", "15.1", "15.2"]
libcxx: [libstdc++, libstdc++11]
threads: [null, posix, win32, mcf] # Windows MinGW
exception: [null, dwarf2, sjlj, seh] # Windows MinGW
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]
cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]
msvc:
version: [170, 180, 190, 191, 192, 193, 194, 195]
update: [null, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
runtime: [static, dynamic]
runtime_type: [Debug, Release]
cppstd: [null, 14, 17, 20, 23]
toolset: [null, v110_xp, v120_xp, v140_xp, v141_xp]
cstd: [null, 11, 17]
clang:
version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0",
"5.0", "6.0", "7.0", "7.1",
"8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21"]
libcxx: [null, libstdc++, libstdc++11, libc++, c++_shared, c++_static]
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]
runtime: [null, static, dynamic]
runtime_type: [null, Debug, Release]
runtime_version: [null, v140, v141, v142, v143, v144]
cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]
apple-clang:
version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3", "8.0", "8.1", "9.0", "9.1",
"10.0", "11.0", "12.0", "13", "13.0", "13.1", "14", "14.0", "15", "15.0",
"16", "16.0", "17", "17.0"]
libcxx: [libstdc++, libc++]
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]
cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]
intel-cc:
version: ["2021.1", "2021.2", "2021.3", "2021.4", "2022.1", "2022.2",
"2022.3", "2023.0", "2023.1", "2023.2", "2024.0", "2024.1",
"2025.0", "2025.1"]
update: [null, ANY]
mode: ["icx", "classic", "dpcpp"]
libcxx: [null, libstdc++, libstdc++11, libc++]
cppstd: [null, 98, gnu98, "03", gnu03, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
runtime: [null, static, dynamic]
runtime_type: [null, Debug, Release]
qcc:
version: ["4.4", "5.4", "8.3"]
libcxx: [cxx, gpp, cpp, cpp-ne, accp, acpp-ne, ecpp, ecpp-ne]
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17]
mcst-lcc:
version: ["1.19", "1.20", "1.21", "1.22", "1.23", "1.24", "1.25"]
libcxx: [libstdc++, libstdc++11]
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
emcc:
# From https://github.com/emscripten-core/emscripten/blob/main/ChangeLog.md
# There is no ABI compatibility guarantee between versions
version: [ANY]
libcxx: [null, libstdc++, libstdc++11, libc++]
threads: [null, posix, wasm_workers]
cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23, 26, gnu26]
cstd: [null, 99, gnu99, 11, gnu11, 17, gnu17, 23, gnu23]
build_type: [null, Debug, Release, RelWithDebInfo, MinSizeRel]
正如您所见,settings
的可能值在同一文件中定义。这样做是为了确保命名和拼写匹配,并为用户和开源社区定义通用的设置模型。有关设置的一些一般信息:
如果允许设置设置为任何值,您可以使用
ANY
。如果允许设置设置为任何值,或者也可以将其取消设置,您可以使用
[null, ANY]
。
但是,此配置文件可以根据任何需求进行修改,包括新的设置或子设置及其值。如果您想分发统一的 *settings.yml* 文件,可以使用 conan config install 命令。
操作系统¶
baremetal
操作系统是一种约定,表示二进制文件直接在硬件上运行,没有操作系统或等效层。这与 null
值区分开来,后者与“未定义此值”的语义相关。 baremetal
是嵌入式微处理器和微控制器代码的常见命名约定。预计用户可能会使用 baremetal
设置中的子设置来指定他们的特定硬件平台、板卡、系列等。目前 os=baremetal
值尚未被 Conan 内置工具链和助手使用,但预计它们会发展并开始使用它。
编译器¶
关于不同编译器的说明
msvc¶
名为 msvc
的编译器设置使用实际的 cl.exe
编译器版本,即 190 (19.0)、191 (19.1) 等,而不是 Visual Studio IDE 版本(15、16 等)。
当使用 msvc
编译器时,Visual Studio 工具集版本(实际的 vcvars
激活和 MSBuild
位置)将由该编译器版本的默认值定义。
msvc
编译器版本“190”:Visual Studio 14 2015 (工具集 v140)msvc
编译器版本“191”:Visual Studio 15 2017 (工具集 v141)msvc
编译器版本“192”:Visual Studio 16 2019 (工具集 v142)msvc
编译器版本“193”:Visual Studio 17 2022 (工具集 v143,编译器版本最高 19.39,工具集版本 14.3X)msvc
编译器版本“194”:Visual Studio 17 2022 (工具集 v143,编译器版本从 19.40 开始,工具集版本 14.4X,Visual Studio 更新 17.10)msvc
编译器版本“195”:Visual Studio 18 2027 (工具集 v145,编译器版本从 19.50 开始,工具集版本 14.5X)
请注意,compiler.version=193
和 compiler.version=194
都映射到 v143
工具集,但由于 Visual Studio 更新 17.10 引入了编译器版本 19.40 和工具集版本 14.40 的版本控制方案更改,它们映射到不同的工具集版本 14.3X
和 14.4X
,同时保留了 v143
工具集命名法。Visual Studio 18 跳到了 v145
工具集,因此 v144
实际上不存在。
如果您想显式强制使用特定的 Visual Studio IDE 版本,可以使用 tools.microsoft.msbuild:vs_version
配置。
[settings]
compiler=msvc
compiler.version=190
[conf]
tools.microsoft.msbuild:vs_version = 16
在这种情况下,vcvars
将激活 Visual Studio 16 安装,但仍将使用 190
编译器版本,因为将设置 toolset=v140
。
设置定义了最后一个数字 update: [null, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
,默认值为 null
,表示 Conan 假定编译器补丁的二进制兼容性,这对于 Microsoft 编译器来说通常是有效的。如果需要更精细的控制,只需将 update
部分添加到您的配置文件中。
[settings]
compiler=msvc
compiler.version=191
compiler.update=3
这将等同于完整版本 1913 (19.13)
。如果需要更多详细信息,您甚至可以向 settings.yml
中的 update
子设置添加自己的数字。
注意
使用
cmake
时,需要有现代版本才能确保 CMake 正确查找和处理正确的工具集版本(取决于更新)。请注意,即使通过 MS VS 安装程序安装了最新的编译器更新,CMake 在未指定时也可能不会将其作为默认版本。CMake 从位于
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build
的Microsoft.VCToolsVersion.v143.default
和Microsoft.VCToolsVersion.v143.default.props
文件中获取信息。检查输出日志以验证正在使用的工具集和编译器版本。
intel-cc¶
警告
此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。
此编译器旨在处理新的 Intel oneAPI DPC++/C++/Classic 编译器。与其有 *n* 个不同的编译器,不如有 3 种不同的*工作模式*:
icx
用于 Intel oneAPI C++。dpcpp
用于 Intel oneAPI DPC++。classic
用于 Intel C++ Classic。
此外,Intel 发布的一些版本包含修订号,因此 update
字段应该是用于 Intel 编译器版本的任何可能的次要数字,例如,compiler.version=2021.1
和 compiler.update=311
表示 Intel 版本是 2021.1.311
。
架构¶
此处提供了 arch
、arch_build
和 arch_target
设置中定义的每种架构的简要说明。
x86:流行的 32 位 x86 架构。
x86_64:流行的 64 位 x64 架构。
ppc64le:PowerPC 64 位大端架构。
ppc32:PowerPC 32 位架构。
ppc64le:PowerPC 64 位小端架构。
ppc64:PowerPC 64 位大端架构。
armv5el:ARM 32 位版本 5 架构,软浮点。
armv5hf:ARM 32 位版本 5 架构,硬浮点。
armv6:ARM 32 位版本 6 架构。
armv7:ARM 32 位版本 7 架构。
armv7hf:ARM 32 位版本 7 硬浮点架构。
armv7s:ARM 32 位版本 7 *swift* 架构,主要用于 iPhone 5、iPhone 5C 和 iPad 4 的 Apple A6 和 A6X 芯片。
armv7k:ARM 32 位版本 7 *k* 架构,主要用于 Apple 的 WatchOS。
armv8:ARM 64 位和 32 位兼容版本 8 架构。它仅涵盖
aarch64
指令集。armv8_32:ARM 32 位版本 8 架构。它仅涵盖
aarch32
指令集(又名ILP32
)。armv8.3:ARM 64 位和 32 位兼容版本 8.3 架构。也称为
arm64e
,它用于最新的 iPhone 型号(XS/XS Max/XR)中添加的 A12 芯片组。arm64ec:Windows 11 ARM64EC(仿真兼容)。此架构支持是**实验性**的且不完整。CMake 支持 VS 和 MSBuild 集成。如有必要,请在 Github 上报告新问题。
sparc:SPARC(可伸缩处理器架构),最初由 Sun Microsystems 开发。
sparcv9:SPARC 版本 9 架构。
mips:32 位 MIPS(无锁流水线阶段的微处理器),由 MIPS Technologies(前身为 MIPS Computer Systems)开发。
mips64:64 位 MIPS(无锁流水线阶段的微处理器),由 MIPS Technologies(前身为 MIPS Computer Systems)开发。
avr:8 位 AVR 微控制器架构,由 Atmel(Microchip Technology)开发。
s390:IBM 的 32 位地址 Enterprise Systems Architecture 390。
s390x:IBM 的 64 位地址 Enterprise Systems Architecture 390。
asm.js:JavaScript 的子集,可用作编译器的低级目标,并非真正的处理器架构,它由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统(例如 GNU auto tools 和 CMake)保持一致。
wasm:Web Assembly,并非真正的处理器架构,而是 Web 的字节码格式,它由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统(例如 GNU auto tools 和 CMake)保持一致。
sh4le:日立 SH-4 SuperH 架构。
e2k-v2:Elbrus 2000 v2 512 位 VLIW(超长指令字)架构(Elbrus 2CM、Elbrus 2C+ CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
e2k-v3:Elbrus 2000 v3 512 位 VLIW(超长指令字)架构(Elbrus 2S,又名 Elbrus 4C,CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
e2k-v4:Elbrus 2000 v4 512 位 VLIW(超长指令字)架构(Elbrus 8C、Elbrus 8C1、Elbrus 1C+ 和 Elbrus 1CK CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
e2k-v5:Elbrus 2000 v5 512 位 VLIW(超长指令字)架构(Elbrus 8C2,又名 Elbrus 8CB,CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
e2k-v6:Elbrus 2000 v6 512 位 VLIW(超长指令字)架构(Elbrus 2C3、Elbrus 12C 和 Elbrus 16C CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
e2k-v7:Elbrus 2000 v7 512 位 VLIW(超长指令字)架构(Elbrus 32C CPU),最初由 MCST(莫斯科 SPARC 技术中心)开发。
xtensalx6:ESP32 微控制器的 Xtensa LX6 DPU。
xtensalx106:ESP8266 微控制器的 Xtensa LX6 DPU。
xtensalx7:ESP32-S2 和 ESP32-S3 微控制器的 Xtensa LX7 DPU。
C++ 标准库(又名 compiler.libcxx)¶
compiler.libcxx
子设置定义了要使用的 C++ 标准库实现。该子设置仅适用于某些编译器,例如,它适用于 *clang*、*apple-clang* 和 *gcc*,但不适用于 *Visual Studio*。
libstdc++(gcc、clang、apple-clang、sun-cc):GNU C++ 库。请注意,这隐含定义了 **_GLIBCXX_USE_CXX11_ABI=0** 以使用旧 ABI。对于像 CentOS 6 这样的旧系统来说,这可能是一个明智的选择。在 Linux 系统上,您可能需要安装 libstdc++-dev(在不同发行版中包名可能不同)才能使用标准库。请注意,在 Apple 系统上,**libstdc++** 的使用已被弃用。
libstdc++11(gcc、clang、apple-clang):GNU C++ 库。请注意,这隐含定义了 **_GLIBCXX_USE_CXX11_ABI=1** 以使用新 ABI。对于像 Ubuntu 20 这样的新系统来说,这可能是一个明智的选择。在 Linux 系统上,您可能需要安装 libstdc++-dev(在不同发行版中包名可能不同)才能使用标准库。请注意,在 Apple 系统上,**libstdc++** 的使用已被弃用。
libc++(clang、apple-clang):LLVM libc++。在 Linux 系统上,您可能需要安装 libc++-dev(在不同发行版中包名可能不同)才能使用标准库。
c++_shared(clang、仅限 Android):将 LLVM libc++ 用作共享库。有关更多详细信息,请参阅C++ 库支持。
c++_static(clang、仅限 Android):将 LLVM libc++ 用作静态库。有关更多详细信息,请参阅C++ 库支持。
libCstd(sun-cc):Rogue Wave 的 stdlib。请参阅比较 C++ 标准库 libCstd、libstlport 和 libstdcxx。
libstlport(sun-cc):STLport。请参阅比较 C++ 标准库 libCstd、libstlport 和 libstdcxx。
libstdcxx(sun-cc):Apache C++ 标准库。请参阅比较 C++ 标准库 libCstd、libstlport 和 libstdcxx。
gpp(qcc):GNU C++ 库。请参阅QCC 文档。
cpp(qcc):Dinkum C++ 库。请参阅QCC 文档。
cpp-ne(qcc):Dinkum C++ 库(无异常)。请参阅QCC 文档。
acpp(qcc):Dinkum 简写 C++ 库。请参阅QCC 文档。
acpp-ne(qcc):Dinkum 简写 C++ 库(无异常)。请参阅QCC 文档。
ecpp(qcc):嵌入式 Dinkum C++ 库。请参阅QCC 文档。
ecpp-ne(qcc):嵌入式 Dinkum C++ 库(无异常)。请参阅QCC 文档。
cxx(qcc):LLVM C++。请参阅QCC 文档。
自定义设置¶
设置也是可定制的,您可以添加自己的设置。
添加新设置¶
可以在 *settings.yml* 文件的根目录下添加新设置,例如:
os:
Windows:
subsystem: [null, cygwin, msys, msys2, wsl]
distro: [null, RHEL6, CentOS, Debian]
如果我们想从配方中为定义此新设置创建不同的二进制文件,我们需要在配方中添加:
class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch", "distro"
值 null
允许不定义它(这将是默认值,适用于所有其他发行版)。也可以在配置文件中为它定义值:
[settings]
os = "Linux"
distro = "CentOS"
compiler = "gcc"
并根据需要使用它们的值来影响我们的构建。
class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch", "distro"
def generate(self):
tc = CMakeToolchain(self)
if self.settings.distro == "CentOS":
tc.cache_variables["SOME_CENTOS_FLAG"] = "Some CentOS Value"
...
添加新子设置¶
上述方法需要修改所有配方以进行处理。还可以定义某种不兼容的设置,例如 os=Windows
和 distro=CentOS
。虽然添加新设置是完全可行的,但将其作为 Linux
OS 的新子设置可能更有意义:
os:
Windows:
subsystem: [null, cygwin, msys, msys2, wsl]
Linux:
distro: [null, RHEL6, CentOS, Debian]
使用此定义,我们可以定义我们的配置文件为:
[settings]
os = "Linux"
os.distro = "CentOS"
compiler = "gcc"
任何尝试为 os
值(非 Linux
)定义 os.distro
的尝试都将引发错误。
由于这是一个子设置,它将被自动包含在声明了 os
设置的所有配方中。请注意,能够拥有 distro=null
值很重要,如果您想保留之前创建的二进制文件,否则将强制始终定义一个特定的发行版值,并且没有此子设置创建的二进制文件将不再可用。
子设置也可以从配方中访问:
class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch" # Note, no "distro" defined here
def generate(self):
tc = CMakeToolchain(self)
if self.settings.os == "Linux" and self.settings.os.distro == "CentOS":
tc.cache_variables["SOME_CENTOS_FLAG"] = "Some CentOS Value"
可以设置 ANY
来定义嵌套子设置,其中 ANY
是任何不匹配已定义值的备用值。
os:
ANY:
version: [null, ANY]
Ubuntu:
version: ["18.04", "20.04"]
这将允许设置如 -s os=MyOS -s os.version=1.2.3
,因为对于 os!=Ubuntu
,版本可以是 ANY
,但如果我们尝试 -s os=Ubuntu -s os.version=1.2.3
,它将报错,因为 Ubuntu
只接受已定义的版本。
添加新值¶
与添加新 distro
子设置的方式相同,可以为现有设置和子设置添加新值。例如,如果某个编译器版本不在接受的值范围内,您可以添加这些新值。
您也可以添加一个全新的编译器:
os:
Windows:
subsystem: [null, cygwin, msys, msys2, wsl]
...
compiler:
gcc:
...
mycompiler:
version: [1.1, 1.2]
msvc:
这与关于配置文件以及它们如何从配方中访问的方式相同。自定义编译器的主要问题是内置的构建助手,例如 CMake
、MSBuild
等,内部包含检查这些值的代码。例如,MSBuild
构建助手将只知道如何管理 msvc
设置和子设置,但不知道新编译器。对于这些情况,可以在配方中实现自定义逻辑:
class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch"
def build(self):
if self.settings.compiler == "mycompiler":
my_custom_compile = ["some", "--flags", "for", "--my=compiler"]
self.run(["mycompiler", "."] + my_custom_compile)
注意
您可以从 *settings.yml* 文件中删除条目:编译器、操作系统、架构等。只有当您确实想防止为非主要支持的平台创建二进制文件时才执行此操作。在一般情况下,您可以保留它们,二进制配置在**配置文件**中管理,您希望在配置文件中定义支持的配置,而不是通过限制 *settings.yml*。
注意
如果您自定义了 *settings.yml*,可以使用 conan config install 命令与您的团队和 CI 机器共享、分发和同步此配置。
settings_user.yml¶
上一节解释了如何自定义 Conan 的 *settings.yml*,但您也可以创建自己的 *settings_user.yml*。此文件将仅包含您想在配方中使用的新字段-值,因此最终结果将是两个文件的组合:*settings.yml* 和 *settings_user.yml*。