build()¶
build() 方法用于定义包的源码构建。实际上这意味着调用某个构建系统,这可以显式完成,也可以使用 Conan 提供的任何构建助手。
from conan.tools.cmake import CMake
class Pkg(ConanFile):
def build(self):
# Either using some of the Conan built-in helpers
cmake = CMake(self)
cmake.configure() # equivalent to self.run("cmake . <other args>")
cmake.build() # equivalent to self.run("cmake --build . <other args>")
cmake.test() # equivalent to self.run("cmake --target=RUN_TESTS")
# Or it could run your own build system or scripts
self.run("mybuildsystem . --configure")
self.run("mybuildsystem . --build")
有关现有内置构建系统集成的更多信息,请访问 配方工具。
build() 方法应该尽可能简单,只需包装开发人员以最简单的方式执行的命令行调用。 generate() 方法负责准备构建,创建工具链文件、CMake 预设或开发人员可以轻松地手动调用构建系统的任何其他文件。这可以实现与 IDE 的更好集成并改善开发人员体验。实际上,build() 方法应该相对简单。
build() 方法针对每个唯一配置运行一次,因此如果存在有条件地应用于不同配置的某些源码操作(例如应用补丁),它们也可以在 build() 方法中应用,在实际构建之前。重要的是要注意,在这种情况下,no_copy_source 属性不能设置为 True。
build() 方法是构建和运行单元测试的正确位置,在打包之前,如果这些测试失败则引发错误,中断该过程,甚至不打包最终的二进制文件。内置助手将在定义 tools.build:skip_test 配置时跳过单元测试。对于自定义集成,预计该方法会检查此 conf 值,以便跳过构建和运行测试,这在某些 CI 场景中可能很有用。
在交叉构建场景中运行测试:在某些情况下,您可能希望构建测试但无法运行它们,例如在交叉构建场景中。对于这些罕见的情况,可以使用 conan.tools.build.can_run 工具,如下所示
...
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
if can_run(self):
cmake.test()
注意
最佳实践
build()方法应该尽可能简单,繁重的构建准备工作应该发生在generate()方法中,以便实现良好的开发人员体验,只需使用conan install .,即可轻松地在本地构建,或者直接调用构建系统或打开他们的 IDE。
另请参阅
有关构建源码的更多信息,请参阅 构建包教程。