我正在使用柯南作为C ++的依赖项管理器,我想创建一个程序包,该程序包需要另一个已经创建的柯南程序包中的已编译文件。 我目前正在尝试为OpenStreetMap-Library OSM-binary (https://github.com/scrosby/OSM-binary.git)创建一个程序包。
该项目的Makefile(可在 ./ OSM-binary / src / Makefile 中找到)需要来自 protobuf-的名为 protoc 的文件。项目(https://github.com/google/protobuf)。在 ./ protobuf / src 中编译 protobuf-项目后,可以找到此 protoc 文件。
没有此文件,编译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包装为必需品
requires = "protobuf/2.5.0@test/testing"
,并用 protoc -file的正确路径替换了osm-Makefile中的相应行(在1.3.3版本中,第7行)。
tools.replace_in_file("OSM-binary/src/Makefile",
"PROTOC ?= protoc",
"PROTOC ?= <path-to-file>/protoc")
现在,这引出了我的实际问题:如何获取 protoc 文件的路径,该文件可在 protobuf -程序包中的文件夹中找到脚本,还是还有其他方法?
谢谢, 克里斯
答案 0 :(得分:0)
有多种方法可以从依赖项访问文件:
如果要直接从依赖项中运行某些文件,可以使用self.run(...., run_environment=True)
,它将自动设置PATH,LD_LIBRARY_PATH等,因此可以在程序包所在的位置找到二进制文件。已安装。查找更多信息here
您可以直接从依赖项中import
所需文件,将此类文件复制(在build()
方法之前完成)到构建文件夹中,以便将它们直接在那里使用。您可以在脚本中使用的路径是当前路径,即self.build_folder
。导入的文件将在构建后自动删除,因此不会意外重新打包。选中imports docs
您可以从self.deps_cpp_info
属性的依赖项中获取信息。检查reference 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