Conan最有用的特性之一是打包可执行文件,如编译器或构建工具,并以受控的方式将它们分发给开发团队。通过这种方式,Conan不仅可以帮助应用程序本身的依赖关系图,还可以帮助生成项目所需的所有生态系统,使控制部署的应用程序中涉及的所有内容变得非常容易。
这些工具需要在工作机器 (构建机器) 中运行,而不管生成的二进制文件将在哪个主机平台运行。如果这些平台不同,我们就是交叉构建软件。
在本节中,我们将处理一般情况,其中库需要其他工具来编译,这些工具也与Conan一起打包。首先阅读本节,并在文档: 交叉构建的专用部分中获得更多关于交叉编译的具体信息。
Note Conan v1.24 引入了一个新功能来声明构建和主机的完整配置文件,这是处理这种情况的首选方法。旧版本应依赖不推荐使用的设置os_build和arch_build。下面有一小部分关于这些设置,完整的解释请阅读与您的柯南客户端匹配的文档。
用于工具的Conan包与具有可执行文件的任何其他包一样。这是一个包装nasm工具的配方,用于构建汇编程序:
import os
from conans import ConanFile, tools
from conans.errors import ConanInvalidConfiguration
class NasmConan(ConanFile):
name = "nasm"
version = "2.13.02"
license = "BSD-2-Clause"
url = "https://github.com/conan-community/conan-nasm-installer"
settings = "os", "arch"
description="Nasm for windows. Useful as a build_require."
def configure(self):
if self.settings.os != "Windows":
raise ConanInvalidConfiguration("Only windows supported for nasm")
@property
def nasm_folder_name(self):
return "nasm-%s" % self.version
def build(self):
suffix = "win32" if self.settings.arch == "x86" else "win64"
nasm_zip_name = "%s-%s.zip" % (self.nasm_folder_name, suffix)
tools.download("http://www.nasm.us/pub/nasm/releasebuilds/"
"%s/%s/%s" % (self.version, suffix, nasm_zip_name), nasm_zip_name)
self.output.info("Downloading nasm: "
"http://www.nasm.us/pub/nasm/releasebuilds"
"/%s/%s/%s" % (self.version, suffix, nasm_zip_name))
tools.unzip(nasm_zip_name)
os.unlink(nasm_zip_name)
def package(self):
self.copy("*", src=self.nasm_folder_name, dst="bin", keep_path=True)
self.copy("license*", dst="", src=self.nasm_folder_name, keep_path=False, ignore_case=True)
def package_info(self):
self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))
这个配方没有什么特别的: 它没有声明编译器和build_type设置,因为它正在下载已经可用的二进制文件,并且它像往常一样在package_info() 中为他们的消费者声明信息方法:
- Cpp_info未声明,因此它将采用其默认值: bindirs将指向打包nasm.exe可执行文件的bin文件夹。
- 在env_info属性中,它将bin文件夹添加到PATH环境变量。
这两个简单的声明足以在我们下面详细介绍的场景中重用该工具。