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.7", "17.8",
"18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6", "18.7",
"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", "15,7",
"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 工具集,但映射到不同的工具集版本 14.3X 和 14.4X。这是因为 Visual Studio 更新 17.10 更改了版本方案,引入了编译器版本 19.40 和工具集版本 14.40,同时保留了 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 位地址企业系统架构 390。
s390x:IBM 的 64 位地址企业系统架构 390。
asm.js:JavaScript 的子集,可用作编译器的低级目标,并非真正的处理器架构,它由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统设计(例如 GNU Auto Tools 和 CMake)保持一致。
wasm:Web Assembly,并非真正的处理器架构,而是 Web 的字节码格式,由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统设计(例如 GNU Auto Tools、CMake 等)保持一致。
wasm64:Web Assembly 64 位,与 **wasm** 相同但用于 64 位。Conan 将添加必要的标志到编译器以生成 64 位 Web Assembly 代码。
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:Xtensa LX6 DPU,用于 ESP32 微控制器。
xtensalx106:Xtensa LX6 DPU,用于 ESP8266 微控制器。
xtensalx7:Xtensa LX7 DPU,用于 ESP32-S2 和 ESP32-S3 微控制器。
C++ 标准库 (又称 compiler.libcxx)¶
compiler.libcxx 子设置定义了要使用的 C++ 标准库实现。该子设置仅适用于某些编译器,例如它适用于 *clang*、*apple-clang* 和 *gcc*,但不适用于 *Visual Studio*。
libstdc++ (gcc, clang, apple-clang, sun-cc, intel-cc, mcst-lcc, emcc):GNU C++ 库。请注意,这隐式定义了 **_GLIBCXX_USE_CXX11_ABI=0** 以使用旧 ABI。对于旧系统(如 CentOS 6)来说,这可能是一个明智的选择。在 Linux 系统上,您可能需要安装 libstdc++-dev(在不同发行版中的包名可能不同)才能使用标准库。请注意,在 Apple 系统上,**libstdc++** 的使用已被弃用。
libstdc++11 (gcc, clang, intel-cc, mcst-lcc, emcc):GNU C++ 库。请注意,这隐式定义了 **_GLIBCXX_USE_CXX11_ABI=1** 以使用新 ABI。对于较新的系统(如 Ubuntu 20)来说,这可能是一个明智的选择。在 Linux 系统上,您可能需要安装 libstdc++-dev(在不同发行版中的包名可能不同)才能使用标准库。请注意,在 Apple 系统上,**libstdc++** 的使用已被弃用。
libc++ (clang, apple-clang, intel-cc, emcc):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*。