上述方法需要修改所有配方以考虑到它。 也可以定义不兼容的设置种类,例如os = Windows和distro = CentOS。 虽然完全可以添加新设置,但是在其他情况下可能更有意义,但是对于此示例,将其添加为上述Linux OS子集就足够了:
os:
Windows:
subsystem: [None, cygwin, msys, msys2, wsl]
Linux:
distro: [None, RHEL6, CentOS, Debian]
通过此定义,我们可以将配置文件定义为:
[settings]
os = "Linux"
os.distro = "CentOS"
compiler = "gcc"
任何为另一个os值而不是Linux定义os.distro的尝试都会引发错误。
由于这是一个子设置,因此在声明os设置的所有配方中都会自动考虑它。 请注意,如果要保留以前创建的二进制文件,则必须将Distro = None的值设置为重要,否则,您将不得不始终定义一个特定的Distro值,并且在没有此子设置的情况下创建的二进制文件将不再可用。
也可以从配方中访问子设置:
class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch" # Note, no "distro" defined here
def build(self):
cmake = CMake(self)
if self.settings.os == "Linux" and self.settings.os.distro == "CentOS":
cmake.definitions["SOME_CENTOS_FLAG"] = "Some CentOS Value"