Conan最有用的特性之一是打包可执行文件,如编译器或构建工具,并以受控的方式将它们分发给开发团队。通过这种方式,Conan不仅可以帮助应用程序本身的依赖关系图,还可以帮助生成项目所需的所有生态系统,使控制部署的应用程序中涉及的所有内容变得非常容易。
这些工具需要在工作机器 (构建机器) 中运行,而不管生成的二进制文件将在哪个主机平台运行。如果这些平台不同,我们就是交叉构建软件。
在本节中,我们将处理一般情况,其中库需要其他工具来编译,这些工具也与Conan一起打包。首先阅读本节,并在文档: 交叉构建的专用部分中获得更多关于交叉编译的具体信息。
Note Conan v1.24 引入了一个新功能来声明构建和主机的完整配置文件,这是处理这种情况的首选方法。旧版本应依赖不推荐使用的设置os_build和arch_build。下面有一小部分关于这些设置,完整的解释请阅读与您的柯南客户端匹配的文档。
用于工具的Conan包与具有可执行文件的任何其他包一样。这是一个包装nasm工具的配方,用于构建汇编程序:
import osfrom conans import ConanFile, toolsfrom conans.errors import ConanInvalidConfigurationclass 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")@propertydef nasm_folder_name(self):return "nasm-%s" % self.versiondef 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环境变量。
这两个简单的声明足以在我们下面详细介绍的场景中重用该工具。
