使用Swift包管理器和libevent清洁地处理/ usr / local /

时间:2017-11-03 13:04:48

标签: swift xcode swift4 swift-package-manager

我的项目libeventlibressl中有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。

2 个答案:

答案 0 :(得分:2)

你发现的,并在你的答案中记录,是一个良好的开端,但不是完整的故事。是的,SwiftPM使用pkg-config来确定安装某些库的位置。是的,SwiftPM使用pkgConfig名称将其传递给pkg-config。但是搜索路径更复杂一些。在macOS上,它使用以下列表作为base search path

然而,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",

我发现了一些警告:

  • 我正在使用的bcrypt库在makefile中没有完整的fletched安装或构建,所以我使用swift4 PM中的新选项编译它,而不是在这里找到:BCrypt example on github和Swift文档以获得更多帮助:SPM API Redesign
  • 在Homebrew中发现的LibreSSL不会在系统上安装其pkgconfig;因此,无论是手动添加它还是从源代码编译LibreSSL-portable都是最简单的,或者在我看来最好的维护。

今天我的整体学习经历非常棒。