configure()¶
在配方中,应使用 configure() 方法来配置设置和选项,以便在后续方法中使用,例如 generate()、build() 或 package()。此方法在构建依赖图并扩展包依赖项时执行,这意味着当此方法执行时,依赖项尚不存在,无法访问 self.dependencies。
例如,对于 C(而非 C++)库,compiler.libcxx 和 compiler.cppstd 设置在 build() 期间甚至不应该存在。这不仅是因为它们不是 package_id 的一部分,而且不应该在构建过程中使用它们。它们将在 profile 中定义,因为图中的其他包可能是 C++ 包,需要它们,但删除它们以避免在配方中使用它们是此配方的责任
settings = "os", "compiler", "build_type", "arch"
def configure(self):
# Not all compilers have libcxx subsetting, so we use rm_safe
# to avoid exceptions
self.settings.rm_safe("compiler.libcxx")
self.settings.rm_safe("compiler.cppstd")
def package_id(self):
# No need to delete those settings here, they were already deleted
pass
注意
从 Conan 2.4 开始,如果定义了 languages = "C" 配方属性(实验性),则上述 configure() 方法是不必要的。
对于希望删除设置的所有子设置的包,可以使用 rm_safe 方法和通配符
settings = "os", "compiler", "build_type", "arch"
def configure(self):
self.settings.rm_safe("compiler.*")
这将删除 compiler 设置的所有子设置,例如 compiler.libcxx 或 compiler.cppstd,但保留 compiler 设置本身(而 self.settings.rm_safe("compiler") 会删除它)。
同样,对于包含库的包,fPIC 选项仅在库编译为静态库时适用,否则,fPIC 选项没有意义,因此应将其删除
options = {"shared": [True, False], "fPIC": [True, False]}
default_options = {"shared": False, "fPIC": True}
def configure(self):
if self.options.shared:
# fPIC might have been removed in config_options(), so we use rm_safe
self.options.rm_safe("fPIC")
可用的自动实现¶
警告
此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。
如果未定义 configure() 方法,Conan 可以自动管理 implements ConanFile 属性中指定的某些常规选项