我的项目libevent
和libressl
中有2个依赖项。这两个都是本地安装的(分别在/usr/local/include
和/usr/local/opt/libressl/include
下)
我希望实现的目标是让SPM自动理解在这些目录中进行搜索。
我知道我可以通过快速构建标志来实现这一目标;但我的最终目标是我可以从命令行正确生成xcode项目,而无需在Xcode中不断添加自定义构建标志。
我非常确定这是可能的,因为我不必输入PostgreSQL的自定义设置。
Swift-tools版本为4.0.x
Package.swift供参考:
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "CEvent",
providers: [
.brew(["libevent"]),
.apt(["libevent-dev"])
],
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "CEvent",
targets: ["CEvent"]),
],
dependencies: [
],
targets: [
.target(
name: "CEvent",
dependencies: []
),
]
)
模块图:
module CEvent [system] {
header "shim.h"
link "event"
export *
}
我当前的构建脚本(build.sh):
#!/usr/local/bin/fish
swift build -Xcc -O0 -Xcc -fblocks -Xswiftc -lbcrypt -Xswiftc -I/usr/local/include -Xswiftc -L/usr/local/lib -Xswiftc -ltls -Xswiftc -lcrypto -Xswiftc -lssl -Xswiftc -L/usr/local/opt/postgresql/lib -Xswi$
至于我想要这个的原因。如果我在swift中添加/更新/删除依赖项,我想生成一个新的xcode项目,而不必在各自的构建机器上修复它的设置;以及apt / ubuntu / usr / lib。
答案 0 :(得分:2)
你发现的,并在你的答案中记录,是一个良好的开端,但不是完整的故事。是的,SwiftPM使用pkg-config
来确定安装某些库的位置。是的,SwiftPM使用pkgConfig
名称将其传递给pkg-config
。但是搜索路径更复杂一些。在macOS上,它使用以下列表作为base search path:
/usr/local/lib/pkgconfig
/usr/local/share/pkgconfig
/usr/lib/pkgconfig
/usr/share/pkgconfig
PKG_CONFIG_PATH
environment variable 然而,SwiftPM不使用pkg-config
命令,而是直接解析.pc
个文件。通过在包上设置pkgConfig
参数,它知道在上面列出的路径中要查找的文件名。而且,对于你的答案中的例子,故事停在这里。如果找到libevent.pc
文件parses that file,则返回的任何标志都会传递给编译器和链接器。
但是,如果要定义包提供程序,例如:
providers: [
.Brew("libsodium"),
.Apt("libsodium-dev")
]
然后,SwiftPM会根据其正在构建的平台的软件包提供程序添加其他搜索路径。继续macOS的例子,SwiftPM将运行brew --prefix
。如果返回路径,则以下路径为added as a additional search path:
[brewPrefix]/opt/[packageName]/lib/pkgconfig
在我的libsodium
示例中,SwiftPM现在能够推断出库的位置,而根本不需要brew link
或符号链接。在我的详细构建输出中,它列出了我的地窖中的libsodium
库路径:-L/usr/local/Cellar/libsodium/1.0.11/lib
。
答案 1 :(得分:0)
好吧,所以我在分析其他项目时忽略的东西(特别是IBM-Swift / CLibpq)似乎正在使用{I}之前没有触及的工具pkg-config
。
pkg-config查找/usr/lib/pkgconfig
/usr/share/pkgconfig
以及构建过程中使用的配置文件的本地变体。
在Package.swift内部,在name
参数之后,您需要插入一些内容,例如:
let package = Package(
name: "CEvent",
pkgConfig: "libevent",
我发现了一些警告:
今天我的整体学习经历非常棒。