我正在尝试构建一个 Swift 包管理器系统包(一个 module.modulemap),使两个系统 C 库可用,其中一个包含另一个。
也就是说,一个(比如 libcurl)是一个基本模块,另一个 C 库包含它(就像这样:)#include "libcurl.h"
。在常规的 C 端,这是可行的,因为 makefile 传递了正确的-I
标志并且一切都很好(我大概可以在 SPM 中做同样的事情,但我想避免给 SPM 额外的标志)。
所以我想出的是这个模块图:
module CBase [system] {
header "/usr/include/curl.h"
link "curl"
export *
}
module CMyLib [system] {
use CBase
header "/usr/include/mylib.h"
link "mylib"
export *
}
我CBase
在一个运行良好的 Swift 包中导入。但是当我尝试 importCMyLib
时,编译器会抱怨:
error: 'curl.h' file not found
这是可以理解的,因为编译器不知道在哪里看(尽管我认为这use CBase
会有所帮助)。
有没有办法让它工作而不必-Xcc -I
在构建过程中添加标志?
更新 1:在某种程度上,这在
Swift SR-145
和
SE-0063: SwiftPM System Module Search Paths中有所涉及。建议使用 Package.swiftpkgConfig
设置。这似乎适用于我的特定设置。但是,如果没有.pc
文件,那就是鸡和蛋。我尝试在包中嵌入一个自己的.pc
文件,但系统包目录未添加到PKG_CONFIG_PATH
(因此在编译依赖模块期间不会考虑)。所以问题是:如何在安装了库但没有 oa.pc
文件(只有头文件和库)的环境中实现这一点。