2

我正在使用柯南作为 C++ 的依赖项管理器,我想创建一个包,它需要来自另一个已经创建的柯南包的编译文件。我目前正在尝试为 OpenStreetMap-Library OSM-binary ( https://github.com/scrosby/OSM-binary.git ) 创建一个包。

该项目的 Makefile(可以在./OSM-binary/src/Makefile中找到)需要来自protobuf 项目https://github.com/google/protobuf )的名为 protoc 的文件。这个protoc文件可以在./protobuf/src中编译protobuf 项目后找到。

如果没有此文件,编译 OSM 源将失败并出现错误:make: ../protoc: Command not found


问题

正如柯南的文档建议将我需要的文件复制到我的包中的文件夹,例如头文件到./include,库到 . /lib等。据此,在通过 make 构建protobuf-project之后,我将通过复制提到的文件

def package(self):
    self.copy("*.so", dst="lib", keep_path=False)
    self.copy("protoc", dst="scripts", src="./protobuf/src")

到一个名为“脚本”的文件夹。

但此时黑魔法开始了。我的第一个问题是,我如何从另一个包中访问任何这些打包文件(例如 *.so 文件或包中存在的任何其他文件(这里是 protoc 文件))?对我来说,即使在阅读了柯南的文档之后,也不清楚柯南如何存储它的打包文件以及如何访问这些或任何其他在上一步中打包的文件。


现在回到OSM 项目tools.replace,我的方法是通过命令在 Makefile 中手动设置正确的路径。首先,我将 protobuf-packaged 声明为一项要求

requires = "protobuf/2.5.0@test/testing"

并将 osm-Makefile 中的相应行(在 1.3.3 版中,第 7 行)替换为protoc -file 的正确路径。

tools.replace_in_file("OSM-binary/src/Makefile",
                      "PROTOC   ?= protoc",
                      "PROTOC   ?= <path-to-file>/protoc")

现在这将我们引向我的实际问题:如何获取protoc -file 的路径,该路径可以在名为scripts的文件夹中的protobuf -package 中找到,或者还有其他方法吗?

谢谢,克里斯

4

1 回答 1

2

有多种方法可以从依赖项中访问文件:

  • 如果你想直接从你的依赖项中运行一些文件,你可以使用self.run(...., run_environment=True),它会自动设置 PATH、LD_LIBRARY_PATH 等,以便在安装包的位置找到二进制文件。在此处查找更多信息

  • 您可以直接import从依赖项中获取您想要的文件,将这些文件复制(在build()方法之前完成)到构建文件夹中,以便可以直接在那里使用它们。您可以在脚本中使用的路径是当前路径,或者self.build_folder. 导入的文件会在构建后自动删除,因此不会意外重新打包。检查导入文档

  • 您可以从self.deps_cpp_info属性的依赖项中获取信息。检查参考here。这意味着您可以通过protobuf类似的方式获取依赖项的路径

def build(self):
   # Get the directory where protobuf package is installed
   protoc_root = self.deps_cpp_info["protobuf"].rootpath
   # Note this is a list
   protoc_bin_paths = self.deps_cpp_info["protobuf"].bin_paths
于 2018-07-24T09:20:12.987 回答