configure()¶
configure()
方法应用于配置食谱中的设置和选项,以供后续在不同方法(如 generate()
、build()
或 package()
)中使用。此方法在构建依赖图并展开包依赖项时执行,这意味着当此方法执行时,依赖项尚未存在,因此无法访问 self.dependencies
。
例如,对于一个 C(非 C++)库,compiler.libcxx
和 compiler.cppstd
设置在 build()
期间甚至不应该存在。它们不仅不是 package_id
的一部分,而且根本不应该在构建过程中使用。它们将在配置文件中定义,因为图中其他包可能是 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")
将会移除 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()
方法时,如果在 implements ConanFile 属性中指定,Conan 可以自动管理一些常规选项。