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"]
        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"]
    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"]
        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"]
    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"]
        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"]
    visionOS:
        version: ["1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.3", "2.4"]
        sdk: ["xros", "xrsimulator"]
        sdk_version: [null, "1.0", "1.1", "1.2", "1.3", "2.0", "2.1", "2.2", "2.4"]
    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"]
        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"]
        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"]
        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]
        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"]
        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)

请注意,compiler.version=193compiler.version=194 都映射到 v143 工具集,但映射到不同的工具集版本 14.3X14.4X,这是由于 Visual Studio 17.10 更新引入了编译器版本 19.40 和工具集版本 14.40,同时保留了工具集 v143 命名法,导致版本方案发生变化。

如果你想明确强制使用特定的 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 子设置添加自己的数字。

intel-cc

警告

此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。

此编译器旨在处理新的 Intel oneAPI DPC++/C++/Classic 编译器。它不是有 *n* 个不同的编译器,而是有 3 种不同的工作**模式**

  • icx 用于 Intel oneAPI C++。

  • dpcpp 用于 Intel oneAPI DPC++。

  • classic 用于 Intel C++ Classic。

此外,英特尔发布了一些带有修订号的版本,因此 update 字段应该代表所使用的英特尔编译器版本的任何可能的次要版本号,例如,compiler.version=2021.1compiler.update=311 表示英特尔版本是 2021.1.311

架构

在这里你可以找到对定义为 archarch_buildarch_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 (Emulation Compatible)。此架构支持处于**实验**阶段且不完整。在 CMake 的 VS 和 MSBuild 集成中受支持。如有必要,请在 Github 上报告新问题。

  • sparc: 由 Sun Microsystems 最初开发的 SPARC (可伸缩处理器架构)。

  • sparcv9: SPARC 版本 9 架构。

  • mips: 由 MIPS Technologies(前身为 MIPS Computer Systems)开发的 32 位 MIPS (无互锁流水线阶段微处理器)。

  • mips64: 由 MIPS Technologies(前身为 MIPS Computer Systems)开发的 64 位 MIPS (无互锁流水线阶段微处理器)。

  • avr: 由 Atmel (Microchip Technology) 开发的 8 位 AVR 微控制器架构。

  • s390: IBM 的 32 位地址企业系统架构 390。

  • s390x: IBM 的 64 位地址企业系统架构 390。

  • asm.js: JavaScript 的一个子集,可用作编译器的低级目标,并非真正的处理器架构,它由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统设计保持一致(例如 GNU auto tools 和 CMake)。

  • wasm: WebAssembly,并非真正的处理器架构,而是用于 Web 的字节码格式,它由 Emscripten 生成。Conan 将其视为一种架构,以与构建系统设计保持一致(例如 GNU auto tools 和 CMake)。

  • sh4le: Hitachi SH-4 SuperH 架构。

  • e2k-v2: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v2 512 位 VLIW (超长指令字) 架构 (Elbrus 2CM, Elbrus 2C+ CPUs)。

  • e2k-v3: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v3 512 位 VLIW (超长指令字) 架构 (Elbrus 2S, 又名 Elbrus 4C, CPU)。

  • e2k-v4: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v4 512 位 VLIW (超长指令字) 架构 (Elbrus 8C, Elbrus 8C1, Elbrus 1C+ 和 Elbrus 1CK CPUs)。

  • e2k-v5: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v5 512 位 VLIW (超长指令字) 架构 (Elbrus 8C2 ,又名 Elbrus 8CB, CPU)。

  • e2k-v6: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v6 512 位 VLIW (超长指令字) 架构 (Elbrus 2C3, Elbrus 12C 和 Elbrus 16C CPUs)。

  • e2k-v7: 由 MCST (Moscow Center of SPARC Technologies) 最初开发的 Elbrus 2000 v7 512 位 VLIW (超长指令字) 架构 (Elbrus 32C CPU)。

  • xtensalx6: 用于 ESP32 微控制器的 Xtensa LX6 DPU。

  • xtensalx106: 用于 ESP8266 微控制器的 Xtensa LX6 DPU。

  • xtensalx7: 用于 ESP32-S2 和 ESP32-S3 微控制器的 Xtensa LX7 DPU。

C++ 标准库 (又名 compiler.libcxx)

compiler.libcxx 子设置定义了要使用的 C++ 标准库实现。此子设置仅适用于某些编译器,例如,它适用于 clangapple-clanggcc,但不适用于 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=Windowsdistro=CentOS。虽然添加新设置完全可行,但将其作为 Linux 操作系统的新子设置可能更有意义

os:
    Windows:
        subsystem: [null, cygwin, msys, msys2, wsl]
    Linux:
        distro: [null, RHEL6, CentOS, Debian]

通过此定义,我们可以将配置文件定义为

[settings]
os = "Linux"
os.distro = "CentOS"
compiler = "gcc"

任何尝试为 Linux 以外的 os 值定义 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:

这在配置文件方面与上述类似,以及它们从配方中访问的方式。自定义编译器的主要问题是,内置的构建助手(如 CMakeMSBuild 等)内部包含代码,这些代码将检查这些值。例如,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.ymlsettings_user.yml)的组合。