Conan最有用的特性之一是打包可执行文件,如编译器或构建工具,并以受控的方式将它们分发给开发团队。通过这种方式,Conan不仅可以帮助应用程序本身的依赖关系图,还可以帮助生成项目所需的所有生态系统,使控制部署的应用程序中涉及的所有内容变得非常容易。
    这些工具需要在工作机器 (构建机器) 中运行,而不管生成的二进制文件将在哪个主机平台运行。如果这些平台不同,我们就是交叉构建软件。
    在本节中,我们将处理一般情况,其中库需要其他工具来编译,这些工具也与Conan一起打包。首先阅读本节,并在文档: 交叉构建的专用部分中获得更多关于交叉编译的具体信息。

    Note Conan v1.24 引入了一个新功能来声明构建和主机的完整配置文件,这是处理这种情况的首选方法。旧版本应依赖不推荐使用的设置os_build和arch_build。下面有一小部分关于这些设置,完整的解释请阅读与您的柯南客户端匹配的文档。

    用于工具的Conan包与具有可执行文件的任何其他包一样。这是一个包装nasm工具的配方,用于构建汇编程序:

    1. import os
    2. from conans import ConanFile, tools
    3. from conans.errors import ConanInvalidConfiguration
    4. class NasmConan(ConanFile):
    5. name = "nasm"
    6. version = "2.13.02"
    7. license = "BSD-2-Clause"
    8. url = "https://github.com/conan-community/conan-nasm-installer"
    9. settings = "os", "arch"
    10. description="Nasm for windows. Useful as a build_require."
    11. def configure(self):
    12. if self.settings.os != "Windows":
    13. raise ConanInvalidConfiguration("Only windows supported for nasm")
    14. @property
    15. def nasm_folder_name(self):
    16. return "nasm-%s" % self.version
    17. def build(self):
    18. suffix = "win32" if self.settings.arch == "x86" else "win64"
    19. nasm_zip_name = "%s-%s.zip" % (self.nasm_folder_name, suffix)
    20. tools.download("http://www.nasm.us/pub/nasm/releasebuilds/"
    21. "%s/%s/%s" % (self.version, suffix, nasm_zip_name), nasm_zip_name)
    22. self.output.info("Downloading nasm: "
    23. "http://www.nasm.us/pub/nasm/releasebuilds"
    24. "/%s/%s/%s" % (self.version, suffix, nasm_zip_name))
    25. tools.unzip(nasm_zip_name)
    26. os.unlink(nasm_zip_name)
    27. def package(self):
    28. self.copy("*", src=self.nasm_folder_name, dst="bin", keep_path=True)
    29. self.copy("license*", dst="", src=self.nasm_folder_name, keep_path=False, ignore_case=True)
    30. def package_info(self):
    31. 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环境变量。

    这两个简单的声明足以在我们下面详细介绍的场景中重用该工具。