2017-11-03 5 views
0

私のプロジェクトには2つの依存関係がありますlibeventlibresslです。どちらもローカルにインストールされています(それぞれ/usr/local/include/usr/local/opt/libressl/includeSwiftパッケージマネージャとlibeventを使って/ usr/local /をきれいに扱う

私が探しているのは、SPMが自動的にこれらのディレクトリを検索することです。

私はこれを達成するために迅速な構築にフラグを渡すことができることを知っています。私の究極の目標は、Xcodeにカスタムビルドフラグを絶えず追加することなく、コマンドラインからxcodeプロジェクトを適切に生成できることです。

私はPostgreSQLのカスタム設定を入力する必要がないので、これは可能です。

// 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: [] 
     ), 
    ] 
) 

モジュールマップ:

スウィフト・ツールのバージョンは、参考のために

Package.swift 4.0.xのである

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$ 

A私はこれを望んでいるからです。依存関係を迅速に追加/更新/削除する場合は、新しいxcodeプロジェクトを生成し、それぞれのビルドマシンでその設定を修正する必要はありません。代わりにapt/ubuntu/usr/libを使用します。

答えて

0

あなたが知っていること、そしてあなたの答えに書かれていることは良いスタートですが、完全なストーリーではありません。はい、SwiftPMはpkg-configを使用して、特定のライブラリがインストールされている場所を特定します。はい、SwiftPMはpkg-configに渡すpkgConfigという名前を使用します。しかし、検索パスはもう少し複雑です。SwiftPMはpkg-configコマンドを使用していないが、

:MacOSではbase search pathとして以下のリストを使用しています代わりにを解析しますファイルを直接。パッケージにpkgConfigパラメータを設定することにより、上記のパスで検索するファイル名を知ることができます。あなたの答えの例では、ここでストーリーが終わります。ファイルlibevent.pcが見つかった場合はparses that fileとなり、返されたフラグはコンパイラとリンカーに渡されます。あなたが例えば、パッケージ・プロバイダーを定義するには:

providers: [ 
    .Brew("libsodium"), 
    .Apt("libsodium-dev") 
] 

だったら

しかしその後SwiftPMは、それがために構築されたプラットフォーム用のパッケージプロバイダに応じて、追加の検索パスを追加します。 MacOSの例を続けると、SwiftPMはbrew --prefixを実行します。これは、パスを返す場合、次のパスがadded as a additional search path次のとおりです。

libsodiumの私の例では
  • [brewPrefix]/opt/[packageName]/lib/pkgconfig

、SwiftPMは今、すべてのbrew linkやシンボリックリンクを必要とせずにライブラリの場所を推測することができます。私の冗長なビルド出力には、-L/usr/local/Cellar/libsodium/1.0.11/liblibsodiumライブラリパスがリストされています。

+0

すばらしい追加情報ありがとう!それは私の将来のサーバー側の迅速な努力に私を助けてくれるでしょう。現在、私は変更を加えて以来、Linuxでlibresslのsegfaultsと苦労しています...しかしそれはポイントの外にあります。私は1つの簡単なサイドノートを追加したい、libsodium 1.0.12/13が監査されている。それが醸造の場合は更新を行ってください! –

0

他のプロジェクト(特にIBM-Swift/CLibpq)の分析から無視したことは、以前私が個人的に触れたことのないツールpkg-configを利用しているようです。

pkg-configは、/usr/lib/pkgconfig/usr/share/pkgconfigと、ビルドプロセスで使用されるコンフィグレーションファイルのローカルバリアントを調べます。

インサイドPackage.swift、あなたがたとえば、何かを挿入する必要がありnameパラメーターの後:私はこれを発見し

let package = Package(
    name: "CEvent", 
    pkgConfig: "libevent", 

いくつかの注意点:

  • 私が使用していますbcryptのライブラリはありません。私はswift4 PMに見つかった新しいオプションを使ってコンパイルしました:BCrypt example on githubここではさらに詳しいヘルプについてはSPM API Redesign
  • HomebrewにあるLibreSSLはpkgconfigをシステムにインストールしません。それは手動で追加するか、ソースからLibreSSL-portableをコンパイルするのが最も簡単です。

今日私にとって素晴らしい総合学習体験。

関連する問題