swift package pin
廃止案らしい https://github.com/rballard/swift-evolution/blob/e5e7ce76f29c855aa7162ed3733b09e701d662d6/proposals/NNNN-package-manager-revised-dependency-resolution.mdPackage.pin
が Package.resolved
に名前が変わって、ビルド時に自動更新されるみたいなイメージかな。products
, dependencies
, targets
はデフォルト引数付けられなかったのかなぁ・・・。Package.swift
を置けます。Package@swift-4.swift
ってのがあるとswift 4.0のtoolchainはそっちを使ってくれます。swift package init
で生成されるのが新しい方なんですよね?それだとわざわざ古いマニフェスト使う理由もない気がします。が、自動生成されるものが一見してごちゃっとするのが嫌だなぁと。swiftLanguageVersions
をPackage.swift
に書くとSwift 3.0.2でエラーになるのですが、Package.swift
にはswiftLanguageVersions
を書かずPackage@swift-4.swift
を使うことで、Swift 3.0.2からSwift 4までビルド可能にできます。 (edited)-Xswiftc -static-stdlib
を使うとSwift Standard Libraryをスタティックリンクできるので、実行時にlibswift*.dylib
が不要になる。 (edited)swift package generate-xcodeproj
ではライブラリを参照まではしてくれなかったりしますか?// 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: "Sandbox", products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. .library( name: "Sandbox", targets: ["Sandbox"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. .package(url: "https://github.com/Alamofire/Alamofire.git", .branch("swift4")) ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "Sandbox", dependencies: []), .testTarget( name: "SandboxTests", dependencies: ["Sandbox"]), ] )
swift build ⏎ Compile Swift Module 'Alamofire' (17 sources) Compile Swift Module 'Sandbox' (1 sources)
SPMでビルド済みのC static libraryをswiftとリンクする時に ソースツリーに配置したstatic libraryを相対パスで指定することってできますか? http://qiita.com/shingt/items/08c726f968dd8508b1e2 Qiita Swift Package Manager経由でSwiftからCのライブラリを利用する - Qiita # 概要 Swiftがオープンソース化されると同時に[Swift Package Manager](https://github.com/apple/swift-package-manager)(以下SPMと略記)も公開されました。... この記事の例だとシステムにインストールされた libhiredis をリンクしているようなんですが これをリポジトリローカルでやりたい https://clang.llvm.org/docs/Modules.html#link-declaration module map の link 命令は -l オプションになるっぽいのです あ、 $ swift build に -Xlinker があるな。
$ swift build -Xlinker -LSources/PbClib/lib
てなかんじで。let package = Package() package.name = "FooBar" package.products = [...]
みたいに書いていった方が楽かもしれん。cStandard
を削除する– Support Build Settings The package manager has no way to provide specific settings, such as compiler flags, for building the targets in a package. Some settings are critical for production code, such as the "deployment target" (the minimum OS version that the built code will run on). We need to provide a way to set at least the most important settings which users will need control over.
PackageDescription.Package
をCodable
対応にして、Package.swift
へエンコードするEncoder
を作る…
(edited)PackageDescription
をインポートできる様にして、雛形を作る的なイメージ。Hi, We have an unofficial slack team to aid the development of Swift Package Manager. All the major discussion happens on the mailing list but it is useful to have a quick communication channel to discuss something small or to bounce off some random ideas. You can get an invite to join the slack team by entering your email id here: https://swift-package-manager.herokuapp.com/ Team ID: http://swiftpm.slack.com More info on slack: https://slack.com -- Ankit
PackageDescription
をインポートできるといいね!」ってことで要望を出しておいた。 http://www.openradar.me/radar?id=5057232672653312module
をframework module
に書き換える必要があるようです。$ swift build -v
でxcodeprojの再生成もたびたびするのでうまいxcodeprojを作ってくれるとありがたいのですが何か方法はないでしょうか。
Cのモジュールを含む場合、再生成は全くお勧めできないかな。 (edited)Sources/Cxorswift/include/Cxorswift.h
を追加することで Sources/Cxorswift/include/module.modulemap
を削除したりもしてる。module.modulemap
は使わない様に変えました。xorswift.h
はフレームワークのXorswift.h
とかぶるので、xorshift.h
xorshift.cpp
へ名前を変えました。module.modulemap
を自動で生成する機能を持ってるので、SwiftPMもそれを活かす様にしてくれれば良いのですが、活かしてくれず。SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE
と設定されているのが疑問に思いAnkitさんに聞いてみたら、swift package generate-xcodeproj
はswift build
によるビルドをXcodeで再現するために存在するためらしい。Range
関連で UnboundRange
が Proposal のどこにもない(ようだ)という話を @rintaro さんに聞きました。dev
が気になってるんですが、ちゃんとインストールできてないでしょうか? $ swift package --version Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126)
Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126)
同じく。isDevelopment
が取れたコミットは swift-4.0-branch にもないので、忘れ去られているだけなのかと。➜ ~ swift package --version Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126) # ついでに ➜ ~ DEVELOPER_DIR=/Applications/Xcode-8.3.app/Contents/Developer swift package --version Apple Swift Package Manager - Swift 3.1.0 (swiftpm-12084)
swift package init
で生成されるテンプレート。 BEFORE import PackageDescription let package = Package( name: "Swiftor" )
AFTER // 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: "Swiftor", products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. .library( name: "Swiftor", targets: ["Swiftor"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "Swiftor", dependencies: []), .testTarget( name: "SwiftorTests", dependencies: ["Swiftor"]), ] )
targets
省略でも、デフォルトとして解釈してくれてもいい気がするんですけどねぇ・・・。carthage update
相当のことをするにはどうすればいいんだと思って↓見たらまだ pinning とか書いてあってがっかりしてたけど普通に swift package update
でできた。 https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md $ rm Package.resolved
でごまかして生きてるimport PackageDescription
を Cmd + Click するとextension Dependency { public static func target(name: String) -> PackageDescription.Target.Dependency public static func product(name: String, package: String? = default) -> PackageDescription.Target.Dependency public static func byName(name: String) -> PackageDescription.Target.Dependency }
PackageDescription.Target.Dependency
となるべくところが Dependency
になっていてPackageDescription.Package.Dependency
も存在するのでよくわからなくなっているimport PackageDescription
で Module compiled with Swift 4.0 cannot be imported in Swift 4.0.1: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4/PackageDescription.swiftmodule
って言われて定義をひらけなかった。canImport
って SwiftPM で管理された二つの独立した(別リポジトリの)パッケージ間で利用することはできるんでしょうか?canImport(B)
が書いてあって extension
が生やされていて、 C が A と B の両方に依存している場合にはその extension
が使えるけど、 A にしか依存していない場合はその extension
が使えないとか。canImport(B)
とはいえ A が B に依存していないといけない気がしていて、そうすると常に canImport(B)
が真になる気がします。 optional な dependency が記述できないと実現できなさそう。canImport(B)
の内部を解決する方法がないし、依存してるなら C も間接的に B に依存することになって常に canImport(B)
が満たされそう。swift test
でテストすることすらできないってこと?#if os(iOS)
は OS を切り替えてテストできるけど#if canImport(B)
はどうやっても A のリポジトリ単体でテストできなくなっちゃうよ。canImport
の Proposal は swift-evolution に出てるよPackage.swift
の記述に関するものは、全てswift-evolutionに出てる気がします。swift run
みたいなサブコマンド?レベルの追加は出てる。swift test --filter <test pattern>
みたいなオプションとかはSlackとかで話されて追加されてる気がする。canImport
はswiftpmのSlackで話された形跡がないですね。canImport
の運用について気づいて(気にして)ないんじゃないかな? (edited)Package.swift
内でcanImport
を使う?というのも考えたけど、swift test -v
の出力を見る限りPackage.swift
のパースでは最低限のimport pathしか設定されていない。canImport
、なんかメタでヤバそうな感じだ・・・canImport
の実装読んでみても良さそうですね。 canImport
自体は SwiftPM と独立に動きそうなので、 canImport
の厳密な判定条件がわかれば実際にどういう挙動をするのか理解できそうです。swift package generate-completion-script zsh > ~/.oh-my-zsh/custom/plugins/swift/_swift
してzshがswift
のコマンドラインオプションを補完できる様にした。 $ swift build -- build sources into binary products package -- perform operations on Swift packages run -- build and run an executable product test -- build and run tests
(edited)Int?
が返るのでflatMapが正しいのでは?swift build [1/1] Compile CYaml src/writer.c Compile CYaml src/reader.c Compile CYaml src/scanner.c Compile CYaml src/parser.c Compile CYaml src/emitter.c Compile CYaml src/api.c Compile Swift Module 'Yams' (15 sources) Compile Swift Module 'render0' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/render0 Fetching https://github.com/jpsim/Yams.git Cloning https://github.com/jpsim/Yams.git Resolving https://github.com/jpsim/Yams.git at 0.5.0 swift build end
$ touch a.txt $ tail -f a.txt $ swift build >> a.txt
これだけでも再現したFetching https://github.com/jpsim/Yams.git Cloning https://github.com/jpsim/Yams.git
Swift.print()
にバッファが効いてるのかな?>リダイレクトで入れ替わる。Swift.print()
が出力先をflock
してるっぽいのも気になってるけど、再現実装が必要かな。swift build
で成果物が置かれるディレクトリのパスを取得: $ swift build --configuration release --show-bin-path /Users/norio/github/gysb/.build/x86_64-apple-macosx10.10/release
setlinebuf(Darwin.stdout)
をすると直る。> swift build
の出力をキャプチャすると順序が入れ替わる。 (edited)setlinebuf()
の利用自体が正しいのかはよくわかっていません。これについて、僕自身ではSwiftPMへPRを出すモチベーションは低いです。omochiさんのところで動作確認出来て、その気があるならPRを書かれると良いのではないかと思います。-Xswiftc -static-stdlib
を使ってビルドしたバイナリになりそうです。 https://github.com/realm/SwiftLint/pull/1951 https://github.com/jpsim/SourceKitten/pull/443swift-build
をXcodeでデバッグ実行した時に"could not find llbuild
"エラーになる不具合を修正しました。 https://bugs.swift.org/browse/SR-6371 (edited)0.1.0
のバージョンタグがついて、Dependencyとして利用できる様になったぽい。https://github.com/apple/swift-package-manager/releases/tag/0.1.0swift build
したり swift package update
したりするとエラーになるんですが、そういうものなのでしょうか? B -> C のブランチによる依存とは、 B の Package.swift に↓ように書いた場合のことです。 .package(url: "https://github.com/foo/C.git", .branch("master"))
swift package update
するか、もしくは Package.resolved を削除および swift package reset
してから swift build
すると再現します。 A = swtws, B = TweetupKit, C = OAuthSwift です。 https://github.com/swift-tweets/swtws.branch
は使えないですね・・・。使った瞬間に他のライブラリがそのライブラリに依存できなくなってしまうswift package edit B
を使ったら、開発途中のBを使えませんかね? (edited).branch
じゃなくて .revision
なら大丈夫ですか?swift package edit C
では?swift package edit OAuthSwift
かswift package update
ではなく) swift build
してもうまくいかないことですね・・・。swift build
しても依存解決のための何かが実行されるんですっけ??単に clone/fetch してビルドするだけかと思ってました。swift package edit B
だった。 $ git reset --hard HEAD is now at 66ed003 Update TweetupKit $ swift package edit TweetupKit Fetching https://github.com/swift-tweets/tweetup-kit.git Fetching https://github.com/swift-tweets/OAuthSwift.git Fetching https://github.com/kylef/Commander.git Fetching https://github.com/koher/PromiseK.git Fetching https://github.com/kylef/Spectre.git Cloning https://github.com/swift-tweets/tweetup-kit.git Resolving https://github.com/swift-tweets/tweetup-kit.git at 0.2.1 Cloning https://github.com/koher/PromiseK.git Resolving https://github.com/koher/PromiseK.git at 3.0.0-alpha.4 Cloning https://github.com/kylef/Spectre.git Resolving https://github.com/kylef/Spectre.git at 0.8.0 Cloning https://github.com/swift-tweets/OAuthSwift.git Resolving https://github.com/swift-tweets/OAuthSwift.git at 2.0.0-beta Cloning https://github.com/kylef/Commander.git Resolving https://github.com/kylef/Commander.git at 0.8.0 swift package edit TweetupKit 3.07s user 2.89s system 53% cpu 11.056 total $ (cd Packages/TweetupKit;git checkout master) Previous HEAD position was 71f0117... Merge pull request #11 from swift-tweets/dev-0.2.1 Switched to branch 'master' Your branch is up to date with 'origin/master'. $ swift build Updating https://github.com/koher/PromiseK.git Updating https://github.com/swift-tweets/OAuthSwift.git Updating https://github.com/kylef/Commander.git Updating https://github.com/kylef/Spectre.git Updating https://github.com/swift-tweets/tweetup-kit.git Fetching https://github.com/OAuthSwift/OAuthSwift.git Cloning https://github.com/OAuthSwift/OAuthSwift.git Resolving https://github.com/OAuthSwift/OAuthSwift.git at master Compile Swift Module 'PromiseK' (2 sources) Compile Swift Module 'Commander' (9 sources) Compile Swift Module 'OAuthSwift' (24 sources) …
(edited)swift package reset
してから swift build
するとエラーになりませんか?swift package reset
するとeditモードから外れるので、その後にswift build
してエラーになるのは当然かな。swift package edit TweetupKit --revision 0.2.2
すれば(cd Packages/…; git checkout …)
とかしなくて良いのか。swift build
では -fmodule
が有効化するのに swift package generate-xcodeproj
の xcode では Build Settings > Enable Modules = NO になっているために モジュール対応モードでコンパイルされないため、 そのモジュール自身が @import
を使っているとコンパイルできない というトラブルを踏んでるんですが、何か知見のある人いますか? 該当のリポジトリで立ってるissueでは手動設定が言及されているけど https://github.com/stephencelis/SQLite.swift/issues/691#issuecomment-339612232 (edited)@import
じゃなくて #import
に書き換えてモジュール=NOのままやってみたら、今度は libsqlite3の自動探索がされなくなって(モジュールじゃないから) modulemapのlinkパラメータがxcodeprojに反映されないから駄目だった・・・Package.swift
とは別のSwiftWorkspace.json
を導入しようというモノらしい。 https://forums.swift.org/t/package-manager-workspace/10667llbuild
にswift-compiler
プラグインを組み込んだ外部実行ファイルswift-build-tool
でビルドしているのを、llbuild
のSwiftバインディングを使ってSwiftPM内から直接呼び出す様に変えることでswift-compiler
以外のプラグインを使える様にし、PackageExtension.swift
でカスタムプラグインとそれを利用したルールを定義できる様な仕組みになるぽい? (edited)swift test --generate-linuxmain
なんて出来るようになってたのね。swift -I .build/debug/ -L .build/debug/
こういう風にすれば、import するとこまではできたのですが、実際に使おうとすると中身がないというようなことを言われてしまいます。 (edited)products
が .library( type: .dynamic )
であることを確認して、 import PackageDescription let package = Package( name: "MyPMLib", products: [ .library( name: "MyPMLib", type: .dynamic, // < HERE targets: ["MyPMLib"]), ], ...
(edited)-l{モジュール名}
$ swift build Compile Swift Module 'MyPMLib' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/libMyPMLib.dylib $ swift -I .build/debug/ -L .build/debug/ -lMyPMLib Welcome to Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.39.1). Type :help for assistance. 1> import MyPMLib 2> hello() Hello? 3>
GTMNSString+HTML.h
as Swift Packageif filename:Package.swift path:/ NOT "os("
のほうが正確っぽい。.S
を含むライブラリをSwiftPMでビルドしたかったのだけど、.S
はサポートされてなかった。.S
を.cpp
の中に埋め込むとか出来ないかな…swift package generate-xcodeproj
には、Debug Build ConfigurationのSWIFT_ACTIVE_COMPILATION_CONDITIONS
にSWIFT_PACKAGE
を設定しないバグがある。 https://bugs.swift.org/browse/SR-7965swift package generate-xcodeproj
がC言語系のターゲットを生成する際module.modulemap
にフルパスでヘッダが記載されるため生成されたXcodeプロジェクトがポータブルにならない、を改善するパッチがマージされました。 https://github.com/apple/swift-package-manager/pull/1602module.modulemap
を生成せず、Xcodeが自動生成する仕組みを利用する様になります。swift package generate-xcodeproj
で生成されるInfo.plistのBundle identifierがcom.yyy.Xxxxみたいなのじゃなくて、パッケージ名Xxxxだけになるようになってしまったような感じしてるのですが、どこで変わったか分かる人いないですかねswift-4.0-RELEASE
で既にそうなってますね。
swift-4.0-RELEASE
でなってるんですね…Xcode 9.2の時はリバースドメインになってた気がしてるんですが、勘違いかな Bundle Identifierがパッケージ名になるのって、意図した挙動なんですかね?iOSのイメージだとリバースドメインの形式な気がしてるswift-3.0-RELEASE
でもターゲット名になってました。DIKit
に限っていえば、generate-xcodeproj
を使わなければいけない理由がCYaml
のmodule.modulemap
内のパスが問題であるなら、CYaml
ターゲットをDIKit
自身で持つ様にすれば解決可能です。 (edited)Yams
でやってるので。 https://github.com/jpsim/Yamsgenerate-xcodeproj
した際CYaml
ターゲットのmodule.modulemap
にフルパスが含まれる問題、Swift 4.2のスナップショットでswift package generate-xcodeproj
するだけで解決する様になりました。GeneratedModuleMap/CYaml/module.modulemap
を削除してくれませんが、生成されたXcodeプロジェクトはmodule.modulemap
を使わなくなるので、リポジトリから削除可能になります。Stencil
には含まれていないのがネックかな。 https://github.com/ishkawa/DIKit/blob/master/Package.swiftswift-DEVELOPMENT-SNAPSHOT-2018-07-11-a
でPackageDescription API v3が削除されたため、いくつかのパッケージがビルド出来なくなった… https://github.com/apple/swift-package-manager/commit/d9ae3a84d4860cd601ff2f336859a46f11cccc0cswift test 2>&1 | xcpretty
とすればxcpretty
使えるらしい。 https://forums.swift.org/t/swift-test-output-format/14702/13binary
サポートの挙動が微妙だ・・・carthage update
した時点では /Users/omochi/Library/Caches/org.carthage.CarthageKit
に zip ファイルがダウンロードされるだけでcarthage build
してはじめて、 Carthage/Build/iOS
に zip の中身が展開されるcarthage update --no-build
だと zipの展開が行われない (edited)swift-tools-version:4.0
の状態で swift build
すると #if swift(>=4.2)
が正しく動かないみたい。これはバグ?#if !swift(>=4.2) print("<4.2") #endif print(CountableRange<Int>.self)
$ swift --version Apple Swift version 4.2 (swiftlang-1000.0.36 clang-1000.10.44) Target: x86_64-apple-darwin17.7.0 $ swift run <4.2 Range<Int>
CountableRange<Int>.self
は Range<Int>
になってるから中身は Swift 4.2 らしく、正しく分岐できずに困ったことになりそう。 (edited)CountableRange
になってる。 $ swift --version Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2) Target: x86_64-apple-darwin17.7.0 $ swift run <4.2 CountableRange<Int>
(edited)#if swift(>=4.1.50)
を使いましょう。 @swift-4.2.4 -swift-version 4 #if swift(>=4.1.50) print("4.1.50") #endif
(edited)norio_nomura06/06/2018 > 話かわりますけど、Xcode 10 BetaはSwift4.1.50になるw Swift 4.2コンパイラに-swift-version 4を渡すと4.1.50になります。
swift-tools-version:4.0
の問題じゃなくて、コンパイラの -swift-version 4
時の挙動なんですね。CountableRange
は typealias
なんですね。そうじゃないと 4.2 と混ぜれないから当たり前か。なるほどー。.testTarget
を作ることはできるのでしょうか? @testable import
がリリースビルドだと出来ないので、public
なAPIをテストする テストターゲットと、internal
なユニットテストを分けて、 swift test -c release
のときには後者は実行しないようにしたいのです。 (edited)#if DEBUG
は使えるのかな@testable
使わないから気づかなかったimport Foundation
して ProcessInfo.processInfo.environment
でどうにかするとか-enable-testing
を指定したら@testable import
できません?@testable
有効にしてテストするのはありかも。Xcodeでのテストで同じようなことはしています https://github.com/ReactiveCocoa/ReactiveSwift/blob/2463d83d0c896ac046c2b85377e583b72373b831/script/build#L35-Xswiftc -enable-testing
で @testable import
はできるのですが、リリースビルドの成果物はそのままリリースに回したいので、、、というところで。/Users/omochi/temp/spmdb/Tests/zooTests/spmdbTests.swift:2:18: error: module 'zoo' was not compiled for testing @testable import zoo ^
-c release
のときだけここでこけますね、そのままやると。public
APIテストのみ) をクリーンに回す方法が現状ないということ?#if DEBUG
で囲んでしまえば、きれいではないけどいける気はする#if DEBUG
は出来るのですね。#If DEBUG @testable import zoo #else import zoo #endif
^ これと、それぞれInternalにアクセスするテストを囲う感じですね。@testable import
するテストはファイルを分けて、ファイル全体を #if DEBUG
で囲う方向でやってみます。 (-D DEBUG
が渡っていることは確認しました) (edited)#if canTestableImport(…)
とかあれば良いのに。swift package generate-xcodeproj
の出力が、実行毎に変わるようになったのって、Swift 4.2からで合ってますかね?xcodeproj
を手動でメンテナンスしたくない理由って何なのだろう?swift build
でビルドできる必要があるのでxcodeproj
をリポジトリに入れても使えないよね。Package.swift
内のdependencies
の事。 生成されたxcodeproj
には.build/checkouts
下のパスが含まれるから、Xcodeでビルドする前にSwiftPMでもビルドしないといけないから、都度generate-xcodeproj
するのと変わらない。.build/checkouts
を用意する為にはSwiftPMを使わないといけない。それならgit submodule
で管理した方が良いのでは、と思えてしまう。SWIFT_DETERMINISTIC_HASHING=1
xcodeproj
入れるのをやめた方が良い気が….xcworkspace
でもいける?xcodeproj
ではCarthageでビルド出来ないのでは。.build/checkouts
はどの様に用意してたのですか?DIKit
を使うDIGenKit
が使うのですね。.build/checkouts
が無くてもCarthageでビルド出来ていたって事ならば、.build/checkouts
以下のパスに再現性が無くても構わないという事になりそうな気が….build/checkouts
内のパスも変わるし、project.pbxproj
内の要素の順番とかも変わりますね。xcodeproj
からDIKit.framework以外の要素を手動で削除してしまえば良いのかも。Set
使っていてこの PackageGraph
から諸々生成しているので、ランダムシードの影響受けるのは必至なのですが、手元で試した限り env SWIFT_DETERMINISTIC_HASHING=1 swift package generate-xcodeproj
でも阻止できないので、やっかいですね。SWIFT_DETERMINISTIC_HASHING
試したら name = "Products";
の箇所だけなぜか順番が変わるけど、そこ以外は安定してる "OBJ_162" = { isa = "PBXGroup"; children = ( "Yams::Yams::Product", "DIKit::dikitgen::Product", "Yams::CYaml::Product", "PathKit::PathKit::Product", "DIKit::DIGenKit::Product", "Stencil::Stencil::Product", "DIKit::DIGenKitTests::Product", "Spectre::Spectre::Product", "DIKit::DIKit::Product", "SWXMLHash::SWXMLHash::Product", "SourceKitten::SourceKittenFramework::Product" ); name = "Products"; path = ""; sourceTree = "BUILT_PRODUCTS_DIR"; };
- there is no good way to control the ordering of the `Products` group in the main group; it needs to be added last in order to appear after the other references
(edited)env SWIFT_DETERMINISTIC_HASHING=1 swift package generate-xcodeproj
で実行すると、hashは固定されるけど、根本的にだめな気がしてきた... (edited)generate-xcodeproj
で生成したproject.pbxproj
の.build/checkouts/*
をCarthage/Checkouts/*
へ書き換え。Package.swift
への参照は、親グループの複数パターンに対応できない為にリンク切れになってるけど、ビルドに影響ないので放置。Cartfile
ではなくCartfile.private
を使うべきなのかも。// swift-tools-version:4.2 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription var targets: [Target] = [ .target( name: "Foo", dependencies: []), .testTarget( name: "FooTests", dependencies: ["Foo"]), ] assert({ targets.append( .testTarget( name: "FooDebugTests", dependencies: ["Foo"]) ) return true }())
DEBUG
が渡らないだけじゃなくて、 -c
が Package.swift を debug/release
のどちらで実行するかに影響を与えるわけではない( -c release
でも debug
っぽい)みたいでダメだった。Package.swift
のロード(実行)のコマンドは https://github.com/apple/swift-package-manager/blob/106115d356f750223dbd4419c3f39f8fc2da66f7/Sources/PackageLoading/ManifestLoader.swift#L310-L329 この辺だと思っていて、そこでconfigurationを渡していないようなので。渡すようにしたPR出すのはありやなしや。-c
は Package.swift についてではないよなぁという気もしますね。それよりも DEBUG
等が Package.swift にも渡される方が良さそう?-c debug
の時は-D DEBUG
も指定、くらいが妥当そうvar disableWhenDebug: Bool
があってスイッチできる、みたいな感じで。error: 'iso8601' is only available on OS X 10.12 or newer public static let dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .iso8601
↓でいちおうビルドできるんですが、もっと Swift PM 的に良い方法はないかなと。 swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"
if #available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *) {
を使わずに?dateDecodingStrategy
にアクセスした箇所全部で分岐が必要になってしまうので・・・。extension JSONDecoder.DateDecodingStrategy { @available(OSX, obsoleted: 10.11) static var iso8601 = JSONDecoder.DateDecodingStrategy.formatted({ let formatter = DateFormatter() formatter.calendar = Calendar(identifier: .iso8601) formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" formatter.timeZone = TimeZone(secondsFromGMT: 0) return formatter }()) }
とかやってみたけど、候補を探すときに@available
を考慮してくれなくてダメだった。 Compile Swift Module 'Foo' (1 sources) /Users/norio/github/Foo/Sources/Foo/Foo.swift:17:37: error: ambiguous use of 'iso8601' decoder.dateDecodingStrategy = .iso8601 ^ Foundation.JSONDecoder:7:14: note: found this candidate case iso8601 ^ /Users/norio/github/Foo/Sources/Foo/Foo.swift:5:16: note: found this candidate static var iso8601 = JSONDecoder.DateDecodingStrategy.formatted({ ^
swift-DEVELOPMENT-SNAPSHOT-2018-10-01-a
でswift run --repl
が出来る様になりました。 https://github.com/apple/swift-package-manager/pull/1793.spm.shellEscaped
式にできそうだねswift test --parallel --xunit-output result.xml
とか出来る様になってたの知らなかった。 https://github.com/apple/swift-package-manager/commit/047df6464ab15e27ab19b9a8263caeaf32127065--xunit-output
を使うには--parallel
が必要。--xunit-output
は未完成の機能だから--help
には出てこないらしい。xcpretty -r junit
とかで生成してるのが不要になる。dlopen
で動的にロードする事は頑張れば出来そうな気もしますが、試した事は無いです。dlopen
も無理かな。swift-DEVELOPMENT-SNAPSHOT-2019-03-04-a
には含まれてるみたいですよ。POSIX
モジュールを削除するPR https://github.com/apple/swift-package-manager/pull/2053master
にも swift-5.0-branch
にも PackageDescriptionV5.md がない? https://github.com/apple/swift-package-manager/tree/swift-5.0-branch/DocumentationSources/${target}/include/${target}.h
が置いてあり、かつ、 modulemapが置いてない ときに限ってswift package generate-xcodeproj
の挙動ならば、僕が提案したモノですね。module.modulemap
を生成して、それ経由でリンクしていたはずです。 https://github.com/apple/swift-package-manager/pull/1406 .library(name: "PaperDynamic", type: .dynamic, targets: ["Paper"]),
Leave this parameter unspecified to let to let the Swift Package Manager choose between static or dynamic linking (recommended).
オススメはSwiftPMに任せる、なんですね。$ swift test --generate-linuxmain warning: can't discover tests on Linux; please use this option on macOS instead
#if os(macOS)でmac専用のテストを書いている場合、mac上でgenerate-linuxmainするとそれらも含まれてしまうので微妙……Load command 20 cmd LC_RPATH cmdsize 120 path /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx (offset 12)
Load command 20 cmd LC_RPATH cmdsize 32 path /usr/lib/swift (offset 12) Load command 21 cmd LC_RPATH cmdsize 40 path @executable_path/../lib (offset 12)
DYLD_LIBRARY_PATH
をチェックして、rpath
へ設定するパッチ。 @@ -0,0 +1,35 @@ diff --git a/Package.swift b/Package.swift index 8234442cbb68248f8c541e8af979c538c72df0a6..abf133e63098c7bf46cb28bb971e21afae5e462b 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.2 +// swift-tools-version:5.0 //===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// import PackageDescription +import Foundation let package = Package( name: "swift-format", @@ -64,7 +65,15 @@ let package = Package( "SwiftFormatConfiguration", "SwiftFormatCore", "SwiftSyntax", - ] + ], + linkerSettings: { () -> [LinkerSetting] in + if let DYLD_LIBRARY_PATH = ProcessInfo.processInfo.environment["DYLD_LIBRARY_PATH"]? + .components(separatedBy: ":") { + let flags = DYLD_LIBRARY_PATH.flatMap { ["-rpath", $0] } + return [.unsafeFlags(flags)] + } + return [] + }() ), .testTarget( name: "SwiftFormatRulesTests",
from:
ではなく .branch("...")
でレポジトリを指定してあるとして、branch のコミットが進んだときに「そのブランチの最新コミットを fetch し直す」ってできるんでしょうか?( .build
と Package.resolved
を消して swift build
し直せばできるのですが…) (edited). ├── Package.swift └── Sources ├── App │ └── main.swift ├── ClibB │ ├── Greeting.cpp │ └── include │ └── Greeting.hpp └── ClibBWrapper ├── HelloCpp.mm └── include └── HelloCpp.h
1つのPackage.swiftでやると、 ^ C++のコードをObjC++でラップしたモジュールを使うSwiftのパッケージ構成はこんな感じで、 Package.swiftは // swift-tools-version:4.0 import PackageDescription let package = Package( name: "Hello", targets: [.target(name: "App", dependencies:["ClibBWrapper"]), .target(name: "ClibBWrapper", dependencies:["ClibB"]), .target(name: "ClibB"),] )
こう。-emit-objc-header
付きで呼び出してFooの分のヘッダを作成して、そのヘッダを参照できるだけのCモジュールもFoo側に作って、AppではそのCモジュールを参照するようにしたんですが。├── Package.swift └── Sources ├── Foo │ ├── Foo1.swift │ ├── Foo2.swift │ └── FooN.swift └── CFoo ├── Foo.m └── include └── Foo-swift.h
// swift-tools-version:5.0 import PackageDescription let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo"), .target(name: "CFoo", dependencies: ["Foo"]) ] )
(edited)-emit-objc-header
で作ったヘッダファイル。 App側でCFooを参照すれば、ObjCでも、 @import CFoo;
だけでヘッダの参照ができるようになりました。 (edited)// swift-tools-version:5.0 import PackageDescription let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo", swiftSettings: [ .unsafeFlags(["-emit-objc-header-path", "Sources/CFoo/include/Foo-swift.h"]) ]), .target(name: "CFoo", dependencies: ["Foo"]) ] )
とか。
(edited)/// As some build flags could be exploited for unsupported or malicious /// behavior, the use of unsafe flags make the products containing this /// target ineligible to be used by other packages.
知りませんでした…cxxSettings
に headerSearchPath
で /usr/local/include
を入れてみたのですが、絶対パスは指定できないようで… Package.swift は以下の通りです: import PackageDescription let package = Package( name: "ClosedRegion", dependencies: [ ... ], targets: [ .target( name: "LinBoxWrapper", // これが C++ ライブラリの wrapper dependencies: [] ), .target( name: "ClosedRegion", // これがプログラム本体 dependencies: ["...", "LinBoxWrapper"]) ], cxxLanguageStandard: .cxx11 )
C++ のライブラリは含まれておらず、ビルド済みのものが /usr/local/lib
下にある状況です。これが Xcode を立ち上げる必要なく swift run
だけで走るようになるとさらに嬉しいです。
(edited) .target( name: "LinBoxWrapper", dependencies: [], cxxSettings: [ .unsafeFlags(["-I", "/usr/local/include"]) ], linkerSettings: [ .linkedFramework("Accelerate"), .unsafeFlags(["-L", "/usr/local/lib"]), .linkedLibrary("linbox"), .linkedLibrary("gmp"), .linkedLibrary("givaro") ] ),
これで出来てそう! (edited)<unknown>:0: error: error opening '(...ProjectのDerivedDataのパス...)/SourcePackages/checkouts/Foo/Sources/CFoo/include/Foo-Swift.h' for output: Operation not permitted
error: The package product 'Foo' cannot be used as a dependency of this target because it uses unsafe build flags. (in target 'App' from project 'App')
unsafeFlags
が有効になる様にするとか。
unsafeFlags
を有効にする方法ってあります?やってみようとしたら見つけられなかったので。// swift-tools-version:5.0 import PackageDescription import Foundation let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo", swiftSettings: { ProcessInfo.processInfo.environment["UPDATE_SWIFT_HEADER"] != nil ? [.unsafeFlags(["-emit-objc-header-path", "Sources/CFoo/include/Foo-swift.h"])] : [] }()), .target(name: "CFoo", dependencies: ["Foo"]) ] )
(edited)PackageDescription
モジュールにもっと簡単に環境変数へアクセス出来る仕組みがあっても良い気もします。 (edited)[]
はempty list not supportedって言われるので nil
に変更。これで動くことは動くようです export UPDATE_SWIFT_HEADER=1;open /Applications/Xcode_11_Beta_4.app
でXcodeを起動するのはあんまりだ(これでいちおう動くことは確認しましたが) でも、CIで使うにはいい方法だなと思いました。-Xswiftc -emit-objc-header-path -Xswiftc Sources/CFoo/include/Foo-swift.h
を付けて呼べばいいだけのような気がしてきました (edited)-emit-objc-header-path
が使われてしまうのでダメです。--enable-test-discovery
オプションつけるとLinux用のテストファイルを自動生成する?機能が使えるらしい。良さそう https://github.com/apple/swift-package-manager/pull/2174/IndexStore
使ってますね。