Guild icon
swift-developers-japan
main / linux-swift
Avatar
norio_nomura 4/25/2017 1:55 AM
Swift 3.1でぶっ壊れたSourceKit on Linuxを復活させるために、とりあえずLinuxでのテストを復活させるPRがマージされたのですが、ubuntu 14.04でのみ失敗するという想定外の展開に。 https://github.com/apple/swift/pull/8485
Enable SourceKit's tests if building SourceKit Change packaging sourcekit-inproc from sourcekitdInProc.framework to libsourcekitdInProc.so on non Darwin platforms This will be required for #8189 ...
1:56 AM
手元ではubuntu 16.04で検証をしていたのですが、どなたか14.04と16.04での違いとか知っている方はいませんかね…
😲 1
Avatar
-- Exit Code: 134 Command Output (stderr): -- <snip> terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc pure virtual method called terminate called recursively /home/buildnode/disk2/workspace/oss-swift-incremental-RA-linux-ubuntu-14_04/buildbot_incremental/swift-linux-x86_64/test-linux-x86_64/SourceKit/ExtractComment/Output/extract_comments.swift.script: line 19: 6097 Aborted (core dumped) /home/buildnode/disk2/workspace/oss-swift-incremental-RA-linux-ubuntu-14_04/buildbot_incremental/swift-linux-x86_64/bin/sourcekitd-test -req=extract-comment -pass-as-sourcetext /home/buildnode/disk2/workspace/oss-swift-incremental-RA-linux-ubuntu-14_04/swift/test/SourceKit/ExtractComment/Inputs/DocCommentEmptyLine1.swift > /home/buildnode/disk2/workspace/oss-swift-incremental-RA-linux-ubuntu-14_04/buildbot_incremental/swift-linux-x86_64/test-linux-x86_64/SourceKit/ExtractComment/Output/extract_comments.swift.tmp.DocCommentEmptyLine1.response
2:00 AM
メモリ関連?
Avatar
omochimetaru 4/25/2017 2:00 AM
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc pure virtual method called terminate called recursively
Avatar
次のビルドでは別のテストが同じエラーで失敗している。 non deterministic ですね。
Avatar
norio_nomura 4/25/2017 2:06 AM
初期化もれがあって、プラットフォームの違いで顕在化してる感じなのかな。
Avatar
omochimetaru 4/25/2017 2:06 AM
なるほどなあ
Avatar
エラー で検索すると、未初期化
2:07 AM
のメモリにアクセスしている的な感じですね。
Avatar
norio_nomura 4/25/2017 2:08 AM
ありがとうございます。
Avatar
それか、メモリ不足?
Avatar
norio_nomura 4/25/2017 2:12 AM
とりあえず、手元で再現できるようにしないと。
Avatar
norio_nomura 4/25/2017 2:23 AM
なるほど…
Avatar
とりあえず debug の tip として、 特定のテストだけ走らせるには # test/SourceKit ディレクトリ内だけ全部 $ utils/run-test --build-dir ../build/Ninja-DebugAssert/ test/SourceKit/ # 特定のテストケースだけ $ utils/run-test --build-dir ../build/Ninja-DebugAssert/ test/SourceKit/ExtractComment/extract_comments.swift # verbose出力 $ utils/run-test -v --build-dir ../build/Ninja-DebugAssert/ test/SourceKit/ExtractComment/extract_comments.swift verbose 出力で実際の実行コマンド群が見えるのでそれをデバッガで見ていく感じです。
❤ 1
Avatar
norio_nomura 4/25/2017 2:42 AM
ありがとうございます。
Avatar
全体で DebugAssert ビルドするときついので、 swift tool のデバッグするときは $ utils/build-script -R --debug-swift でビルドしてます。その場合は build-dir は ../build/Ninja-ReleaseAssert+swift-DebugAssert ですね。
Avatar
norio_nomura 4/25/2017 2:56 AM
以前使っていたubuntu 14.04のdockerイメージではビルドできなくなっていたので、そちらの更新からです。
Avatar
norio_nomura 4/25/2017 3:25 AM
なんとなく原因が見つかったぽい。
3:26 AM
SourceKitはLinux版とmacOS版でそれぞれInProcとXPCに一部実装が分かれていて、InProc版のテストが無効化されているせいで破壊的な変更がXPC版だけに入ってしまい、InProc版が壊れてきてた。
😥 1
3:29 AM
そんなXPC版への変更が、PRをオープンして以降にさらに入ってた。 https://github.com/apple/swift/commit/65668c9d82fcb65f52172d4b1e25f47922744f82#diff-0ff30e883d2a6d6a213ed6714d4845e9
  • Add CompilerInvocation::getPCHHash This will be used when creating a unique filename for a persistent precompiled bridging header.
    • Automatically generate and use a precompiled briding head...
3:32 AM
ビルドエラーやテストで即座に失敗するようなものはPRに反映できてたけど、これは気づかなかった。
Avatar
omochimetaru 4/25/2017 3:38 AM
SourceKitのInProc版が壊れていた事が原因で、そのテストが無効になっていたから発見が難しかった、という事?
Avatar
norio_nomura 4/25/2017 3:44 AM
テストが無効にされた時には壊れていなかったのですが、無効にされて以降共通部分とXPC版に変更が入り、InProc版が壊れたのです。
Avatar
omochimetaru 4/25/2017 3:45 AM
互換性を保たなきゃいけない2者のテストは切っちゃいけない気がする。
Avatar
norio_nomura 4/25/2017 3:46 AM
はい。Apple的にはInProc版を捨てたいのだと思います。
Avatar
omochimetaru 4/25/2017 3:51 AM
あ〜、なるほど。最終的には単一化するんですね。
Avatar
norio_nomura 4/25/2017 3:52 AM
あいや、先のコミットが原因ではないかも…
3:53 AM
LinuxにはXPC相当の仕組みってあるのかな
3:55 AM
なるほど、macにこんなAPIがあったのか
Avatar
norio_nomura 4/25/2017 3:59 AM
App ExtensionとかがXPCを基にしているはずです
Avatar
omochimetaru 4/25/2017 3:59 AM
あ〜
Avatar
norio_nomura 4/25/2017 5:36 AM
ぬううん、手元で再現しないい。
Avatar
結局 ubuntu 14.04 ではテストを実行しないという方向で進めることに。 https://github.com/apple/swift/pull/9025
Continue from #8485 Disable sourcekit test on ubuntu 14.04 because of non-deterministic failures #8485 (comment) Resolves SR-1676, SR-4490, SR-4491
Avatar
omochimetaru 4/27/2017 3:53 AM
マジすか・・・
3:55 AM
LinuxでSwiftやってみようとおもったら、ubuntu 14.04は避けといたほうが良さそうですね
Avatar
norio_nomura 4/27/2017 3:58 AM
「ubuntu 14.04 はもうサポートしない」というアナウンスが以前あったのですが、何故かまだサポートされているのですよね。
Avatar
一度 CI からも無くなったんですが、コミュニティからの要望で復活しましたね。
Avatar
norio_nomura 4/27/2017 4:00 AM
そうなのですね、知らなかった。Travisが14.04だからかな。
Avatar
結局 ubuntu 14.04 ではテストを実行しないという方向で進めることに。
昨日マージされて 16.04, 16.10 では問題なく動いてる。
Avatar
norio_nomura 4/29/2017 7:38 AM
SourceKitをLinuxのToolchainパッケージに含めるPRが、CIでswiftpmのテストに何故か失敗。 https://ci.swift.org/job/swift-PR-Linux-smoke-test/7184/
7:39 AM
PRの変更とは関係ないはず〜と再テストをPRのコメントで要求するが、誰も反応してくれず。
7:39 AM
SwiftPMのテストだったので、SwiftPMのSlackでaciidさんに相談してCIをスタートしてもらった 🙂 (edited)
Avatar
ぉ、なんかテスト中に SourceKit がクラッシュしたっぽい。再現性なし。 Ubuntu 16.04 です。 FAIL: Swift(linux-x86_64) :: SourceKit/CursorInfo/cursor_no_cancel.swift (443 of 9803) ******************** TEST 'Swift(linux-x86_64) :: SourceKit/CursorInfo/cursor_no_cancel.swift' FAILED ******************** Script: -- <省略> -- Exit Code: 1 Command Output (stderr): -- /home/rintaro/Documents/swift-oss/swift/test/SourceKit/CursorInfo/cursor_no_cancel.swift:39:11: error: expected string not found in input // RANGE: source.lang.swift.range.singleexpression ^ <stdin>:1:1: note: scanning from here #0 0x00007f124b02b0e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) (BUILD_DIR/lib/libsourcekitdInProc.so+0x9850e8) ^ <stdin>:6:21: note: possible intended match here #5 0x00007f124b07024a SourceKit::SwiftLangSupport::~SwiftLangSupport() (BUILD_DIR/lib/libsourcekitdInProc.so+0x9ca24a) ^ -- ********************
Avatar
norio_nomura 5/10/2017 6:17 AM
おお。
6:18 AM
やっぱり僕のコミットでバグを入れてしまった気がするなあ…
6:23 AM
Enable SourceKit's tests if building SourceKit Change packaging sourcekit-inproc from sourcekitdInProc.framework to libsourcekitdInProc.so on non Darwin platforms This will be required for #8189 ...
Enable SourceKit's tests if building SourceKit Change packaging sourcekit-inproc from sourcekitdInProc.framework to libsourcekitdInProc.so on non Darwin platforms This will be required for #8189 ...
Avatar
とりあえず、swift-DEVELOPMENT-SNAPSHOT-2017-05-09-a のLinux版に libsourcekitdInProc.so がもれなく入っていることを確認。
Avatar
norio_nomura 5/16/2017 9:41 AM
ネストした NSDictionary の比較がLinuxで正しく動いていないことを知って、ガッカリ 😞 https://github.com/jpsim/SourceKitten/issues/384
It seems comparing nested NSDictionary on Linux does not working at all since Swift 3.0.2. 😞 It works as expected on macOS: ➜ 18:33:37 git:(master) ✗ swift swift_oss_helper command enabled. Welcom...
Avatar
omochimetaru 5/16/2017 9:42 AM
マッジすか・・・
9:42 AM
DictionaryのEquatabilityが壊れてるってやばくない??
Avatar
norio_nomura 5/16/2017 9:44 AM
やばいと思うけど、全体で等しい、っていうのは実際の利用シーンでは少ない気がする。
Avatar
omochimetaru 5/16/2017 9:44 AM
まあ実際やったことはほぼ記憶に無い・・・
Avatar
norio_nomura 5/16/2017 9:44 AM
多分テスト以外にお目にかからないかと。
9:45 AM
たまたまmacOSのコンパイラだけクラッシュするバグでLinux版が先行していたために気づいた。
Avatar
norio_nomura 5/16/2017 9:55 AM
元々はJSON文字列を作って比較してたのだけど、Linux版のJSONSerializationによるJSON文字列作成結果がnondeterministicだったため、オブジェクト化して比較したのがあだになった。
Avatar
omochimetaru 5/16/2017 9:56 AM
あ、それはキーバリューペアの出て来る順番が
9:56 AM
Dictionaryの内部メモリの都合でイテレーション順序が不安定そう
Avatar
macOS版は毎回同じになったはず。
Avatar
キーをソートせずに書き出しているなら、ハッシュテーブルだと capacity が異なると違う結果になりそうですね。
Avatar
norio_nomura 5/16/2017 2:10 PM
ううう、swift-corelibs-foundationのバグを次々に見つけてしまって、嫌になってきた…
Avatar
norio_nomura 5/18/2017 1:50 AM
swift-corelibs-foundation のテストがXcodeでうまくいかないのでLinuxでやってみてるのだけど、ci.swift.orgで通ってるテストも手元では通らず。なんだこれ。
Avatar
norio_nomura 5/18/2017 2:50 AM
Foundation.TimeZone/usr/share/zoneinfo の存在に依存していて、ubuntu だとデフォルトで存在しない場合があるからだった。 https://bugs.swift.org/browse/SR-4921
Avatar
ネストした NSDictionary の比較がLinuxで正しく動いていないことを知って、ガッカリ 😞
正確には、NSArrayHashable でない _ObjectBridgeable な要素が入ってる時の比較がおかしかった。
12:50 PM
ObjectIdentifier(でしたっけ?)周りの不具合かな
Avatar
なるほど、修正前はBridgeableなら無差別にtrueになり得たわけですね
Avatar
です。要素数が同じなら isEqual(to:) が真になってました。
😨 2
Avatar
norio_nomura 5/18/2017 1:07 PM
Swift 3.0リリース前のswift-DEVELOPMENT-SNAPSHOT-2016-08-18-aかららしい… (edited)
Avatar
norio_nomura 6/2/2017 4:47 AM
swift-corelibs-foundationには、macOSでそのAPIが何を返すか?とか調べずに実装されているAPIが少なからずあるぽい。
Avatar
omochimetaru 6/2/2017 5:40 AM
またいだテストケースが無いってことですか?
Avatar
norio_nomura 6/2/2017 7:08 AM
いちおう、swift-corelibs-foundationのテストをmacOSのFoundationで実行する様な設定は作り込まれているぽいけど、ci.swift.orgでテストされていない。
Avatar
omochimetaru 6/2/2017 7:09 AM
なるほど・・
Avatar
norio_nomura 6/2/2017 7:20 AM
CoreFoundationはオープンソースになってるけど、CoreFoundationを呼び出しているObjective-CランタイムがLinuxにはなくて、それに依存しているswift/stdlib/public/SDK/(Dispatch|Foundation)/NS*辺りはLinuxで使えない。 (edited)
7:23 AM
Objective-Cランタイムで実現してる機能も、SwiftからCoreFoundationを直接使ってDispatchFoundationを実現するのがswift-corelibs-*
7:23 AM
で、出来上がったDispatchFoundationのAPIは、swift本体でテスト実行されるからまだいい。 (edited)
7:26 AM
Objective-Cランタイムの機能を真似するために、swift本体では使われていないObjective-Cを真似た機能を使おうとすると、それがテストされていないからmacOSの挙動と異なってたりする。 (edited)
Avatar
norio_nomura 6/2/2017 7:37 AM
Objective-CがCoreFoundationをどの様に使っているのかわからないApple社外のcontributor達は、自分たちが欲しいけど動かないAPIを最短で治そうとするので、Objective-Cランタイムの挙動とは違う内部実装を書いてしまう。
7:39 AM
それがCoreFoundationを無視した実装になっていたりするので、「実はこっちでも同じものが使われてる〜」というものがあったりすると、整合が取れなくなる。
7:40 AM
swift-corelibs-*プロジェクトにはフルタイムで見てるAppleの開発者がいないらしくて、その辺り見過ごされて実装されていってしまってるぽい。
Avatar
omochimetaru 6/2/2017 7:40 AM
ふむふむ。
Avatar
もうここまで露出してるんだからObjective-Cランタイムも全部公開したらいいのにって思ってしまうんですがAppleは頑なに全部は見せない姿勢なんですね
Avatar
norio_nomura 7/1/2017 2:42 AM
swift-corelibs-foundationのコードが… 😞
Avatar
norio_nomura 7/2/2017 2:36 PM
プロトコルエクステンションのinitでクラスのselfを置き換える手法を使うことで、swift-corelibs-foundationのNSNumberCFNumberCreate()で作成する様に変更するPRを書いた。 https://github.com/apple/swift-corelibs-foundation/pull/1093 (edited)
This replaces #1025 by further utilizing the Factory Initializer Method (SR-5255). Use CFNumberCreate() as factory initializer on NSNumber Remove NSNumber._objCType Change the properties of NSNu...
Avatar
norio_nomura 7/3/2017 11:06 PM
^マージされた。そしてswift-corelibs-foundationはFactory initializerパターンを活用する方向へ進みそう。 https://github.com/apple/swift-corelibs-foundation/pull/1095
Avatar
おお〜
11:26 PM
言語機能としてconvenience initで値の注入が許可されるようにならないかな
11:26 PM
protocol経由するのは大変
Avatar
まじか。 https://bugs.swift.org/browse/SR-5255 の allocation/deallocation が一回余計に走るって問題は、修正期待って事なんですかねぇ。
Avatar
あ、やっぱ走ってるのか
11:47 PM
でもalloc走らないようにするの厳しくないですか?フィールドへの代入が可能と言うことはallocしないことには
Avatar
convenience init だから その先の self.init で alloc すればいいはず。
Avatar
protocol extensionで書いてるからconvenienceが見えなくなってて
Avatar
protocol extension init 内で self 代入前に プロパティセットできます?
Avatar
お、self作れって怒られる
11:51 PM
じゃあ動きとしては全く同じなのか
Avatar
現状実タイプの convenience init 前に alloc されていて
11:53 PM
その self が置き換えられちゃうから 無駄になっているのです。
Avatar
norio_nomura 7/4/2017 12:00 AM
swift-corelibs-foundationにとっては、そのデメリットを大幅に超えるメリットがあると認識されつつある様です。
Avatar
norio_nomura 8/1/2017 12:36 AM
Linux上のlldbでpoとか使おうとすると (lldb) po empty warning: Swift error in module YamsPackageTests.xctest. Debug info from this module will be unavailable in the debugger. error: in auto-import: failed to get module 'YamsTests' from AST context みたいなエラーが出て使えなかったのだけど、 https://bugs.swift.org/browse/SR-5524?focusedCommentId=27038&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-27038 に書かれてるC_INCLUDE_PATHCPLUS_INCLUDE_PATHを設定したら、使える様になった。
Avatar
https://github.com/apple/swift/pull/11635 protocolによるhackファクトリパターンに手が入ってさらなるハックが必要になるというよくわからない展開に
Consider a class initializer that delegates to a protocol extension initializer, for example protocol P {} extension P { init() { ... } } class C : P { convenience init(foo: Int) { self.init()...
Avatar
これはどうなんだ
8:35 AM
unsafeBitCast入れればokってことかな?
Avatar
そうみたいですね。
8:40 AM
protocol 内 init での Self の意味がちょっと変わったという理解。
Avatar
SelfがGenericsな型として扱われますよということかな?
8:42 AM
今までだと基底クラスの扱いでかつ、コンパイルもチェックせずに通っていた…?
Avatar
しばらく潜って考えて整理してみた。 slavaが指摘しているバグ この gist と合わせて解説 https://gist.github.com/omochi/ac7bfec6f0b3f92b74502bbfaf0563a7 あるクラスがが convenience init から、別の init メソッド を呼んでいるときは、 静的な Selfではなく、 convenience init 実行中の動的な Self とともに呼ばねばならない。 例えば、Animal.init(init0:)はそのようなパターンで、Cat.init(init0:)を呼び出すと、 Animalのconvenience initから、オーバライドされたCat.init()が呼び出されることがわかる。 (edited)
12:06 PM
しかし、 protocol の extension メソッドで定義された init を呼び出している場合には、 動的な Self ではなく、静的な Self に対して呼び出してしまうバグがあった。 これを検証しているのが Animal.init(init1:) である。 この中から呼ばれる self.init(facotry:) は、 Self が Animal に固定されて型検査されているし、 コンパイル後もそのように動作する。 その結果として、 Cat.init(init1:) の呼び出しは、 Cat の初期化をなんら呼び出していない。 実際に cat1.b を表示してみると、謎の値65が表示された。 (at IBM Swift sandbox) 本来は、 protocol から来ていたとしても、 convenience init から init を呼び出すところは、 動的な Self として扱わねばならない。
12:07 PM
このような「バグでコンパイルできてしまう」パターンは、 既存の NSNumber 実装が踏み抜いている。 https://github.com/apple/swift-corelibs-foundation/blob/87466c45462cba5a085d5cd41d785d681016542d/Foundation/NSNumber.swift#L266 この行は、 NSNumber の親、 NSValue が conformance する protocol _Factory によって定義された init(factory:) を呼び出している。 ここでは unsafeBitCast で NSNumber にキャストしているので、 init(factory:) に対しては、 () -> NSNumber なクロージャを渡している。
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
12:07 PM
slava の修正によって、 このような場合でも動的な Self として型検査されるようになった。 そうすると、 gist の例の場合では、 init(factory:) に渡しているクロージャの式が、 () -> Animal であるゆえに、 コンパイルエラーとなる。 ここは、 self の式の型は Animal ではなく Self なので、 () -> Self 型のクロージャを渡さねばならないからだ。
12:07 PM
同様のコンパイルエラーを、 NSNumber が実際に踏み抜いた。 これを回避するために、 slava は3つの選択肢をだしている。 1. swift5までとりあえず放置する 2. NSNumberをfinalにする 3. ジェネリクスを使う 1は無いとして、2については、 もしこの問題になっているクラス (AnimalやNSNumber) が final class であれば、 convenience init をサブクラスから呼ぶ事自体が無いので、 解決するというもの。(修正した型チェッカはそれも考慮している)
12:08 PM
実際には、この選択肢は取れない。 NSDecimalNumber のような、 NSNumber のサブクラスがすでに存在しているから。 https://github.com/apple/swift-corelibs-foundation/blob/856b8bcd9cae659f1ca48545b2ddb7f63da77171/Foundation/NSDecimalNumber.swift しかもこいつは下記フィールドを保持している。 fileprivate let decimal: Decimal ということは、現状でも convenience init 経由の NSDecimalNumber のコンストラクトで、 メモリがぶっ壊れる可能性がある・・・?
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
12:08 PM
3の選択肢は、 現状の unsafeBitCast にジェネリクスを組み合わせて、 NSNumber固定ではなく、 Self へのキャストにすることで動かす、というもの。 slavaの実装例は下記で、返り値型推論を活用している。 func castCFNumber<T>() -> T { return unsafeBitCast(cfnumber, to: T.self) } slavaはこれを試してみるとこのこと。
I'll try the generics hack.
12:08 PM
これでとりあえず動くようになるけど、 NSDecimalNumber の decimal プロパティが初期化されない可能性は解決しないのでは・・・???
Avatar
ふむ
Avatar
そもそもCFNumberのキャストしてるじてんで、DecimalNumberに対応は無理筋
Avatar
なんか internal と private を駆使して、巧妙にユーザサイドでそのその穴は封印してる気もする。
Avatar
DecimalNumberで@available生やすとかしないと無理では
12:20 PM
ふーむ
Avatar
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
12:20 PM
これだけ死ぬ気がする。
12:21 PM
NSDecimalNumber(value: true)
Avatar
だよね
12:30 PM
Stringで同じ事したときに、あれはConcreteClassなので死屍累々になるかな?とか思ったけど
12:33 PM
NSNumberもなんか色々なかったっけ
Avatar
norio_nomura 8/29/2017 1:30 AM
このような「バグでコンパイルできてしまう」パターンは、 既存の NSNumber 実装が踏み抜いている。 https://github.com/apple/swift-corelibs-foundation/blob/87466c45462cba5a085d5cd41d785d681016542d/Foundation/NSNumber.swift#L266 僕のcommitですね 🙂 これを元にphauslerさんがFactoryパターンで大幅に書き換えてるPR https://github.com/apple/swift-corelibs-foundation/pull/1095 がしばらく前から止まってるけど、非公開なブランチがApple内部で進んでるのかな?
1:31 AM
これに期待 https://github.com/apple/swift/pull/11637#discussion_r135388024 I have a whole branch that refractors almost ALL of the classes that follow the self replacement pattern. (edited)
Consider a class initializer that delegates to a protocol extension initializer, for example protocol P {} extension P { init() { ... } } class C : P { convenience init(foo: Int) { self.init()...
Avatar
norio_nomura 8/29/2017 1:39 AM
NSDecimalNumber の decimal プロパティが初期化されない可能性は解決しないのでは・・・??? NSDecimalNumbersuper.init() しか使ってないから問題ないと思う。
Avatar
omochimetaru 8/29/2017 1:40 AM
@norio_nomura さんのコミットだったんですねw
1:41 AM
open override func description(withLocale locale: Locale?) -> String { guard locale == nil else { fatalError("Locale not supported: \(locale!)") } return self.decimal.description }
1:41 AM
↑これとか大丈夫ですかね?
Avatar
omochimetaru 8/29/2017 1:49 AM
NSDecimalNumber は super.init() しか使ってないから問題ないと思う。
NSNumberで定義されている public convenience init(value: Bool) は、 NSDecimalNumber に対しても呼び出せると思う。
Avatar
norio_nomura 8/29/2017 1:50 AM
ああ、そういう意味か。
Avatar
omochimetaru 8/29/2017 1:51 AM
↑を書いた時簡単に試せる Linux Swift環境が無かったので試せてないですが・・・
Avatar
norio_nomura 8/29/2017 1:54 AM
使えないぽい $ docker run --privileged -it --rm norionomura/swift:4020170827a swift -I /usr/lib/swift/clang/include Welcome to Swift version 4.0-dev (LLVM 2dedb62a0b, Clang b9d76a314c, Swift 0899bd328a). Type :help for assistance. 1> import Foundation 2> let b = NSDecimalNumber(value: true) error: repl.swift:2:9: error: argument labels '(value:)' do not match any available overloads let b = NSDecimalNumber(value: true) ^ ~~~~~~~~~~~~~ repl.swift:2:9: note: overloads for 'NSDecimalNumber' exist with these partially matching parameter lists: (decimal: Decimal), (string: String?), (coder: NSCoder), (floatLiteral: Double), (booleanLiteral: Bool), (integerLiteral: Int) let b = NSDecimalNumber(value: true) ^ 3> (edited)
Avatar
omochimetaru 8/29/2017 1:56 AM
お。あれ、なぜだろう。
1:56 AM
class Animal { init() { } convenience init(init0 int: Int) { self.init() } } class Cat : Animal { override init() { } convenience init(init1 int: Int) { self.init() } } // Animal の convenience init が呼び出せる Cat.init(init0: 3)
Avatar
norio_nomura 8/29/2017 1:57 AM
Swift 4.0スナップショットのdockerイメージあります。 https://hub.docker.com/r/norionomura/swift/
Avatar
omochimetaru 8/29/2017 2:07 AM
Docker for macでやってみたらimport Foundationでエラーが出てしまいました
Avatar
norio_nomura 8/29/2017 2:07 AM
swift -I /usr/lib/swift/clang/include で。
Avatar
omochimetaru 8/29/2017 2:09 AM
おおいけました norioさんの↑のコマンドラインをまるまるコピペすればよかったのか。
Avatar
omochimetaru 8/29/2017 2:11 AM
convenience init 通らないですね
Avatar
norio_nomura 8/29/2017 2:11 AM
publicだからかな?
Avatar
omochimetaru 8/29/2017 2:14 AM
[omochi@omochi-iMac temp]$ docker run --privileged -it --rm norionomura/swift:4020170827a swift -I /usr/lib/swift/clang/include Welcome to Swift version 4.0-dev (LLVM 2dedb62a0b, Clang b9d76a314c, Swift 0899bd328a). Type :help for assistance. 1> public class Animal 2. { 3. public init() {} 4. public convenience init(init0 int: Int) { self.init() } 5. } 6> public class Cat : Animal { 7. public override init() {} 8. } 9> Cat.init(init0: 33) $R0: Cat = { __lldb_expr_1.Animal = {} }
2:15 AM
required convenience init が混ざってると変わるのかな
2:15 AM
うーんいけるなあ
2:15 AM
なんだこれ・・・
Avatar
norio_nomura 8/29/2017 2:17 AM
REPL内は同じモジュールでは?
Avatar
omochimetaru 8/29/2017 2:18 AM
あー 別モジュールでってことですか
Avatar
norio_nomura 8/29/2017 2:19 AM
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3 Open access applies only to classes and class members, and it differs from public access as follows: - Classes with public access, or any more restrictive access level, can be subclassed only within the module where they’re defined. - Class members with public access, or any more restrictive access level, can be overridden by subclasses only within the module where they’re defined. - Open classes can be subclassed within the module where they’re defined, and within any module that imports the module where they’re defined. - Open class members can be overridden by subclasses within the module where they’re defined, and within any module that imports the module where they’re defined. (edited)
2:23 AM
サブクラスのメンバーとして使えるかどうか?の制限ってあるんだっけ?よくわからない…
2:24 AM
こっちか https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/swift/grammar/access-level-modifier ### public Apply this modifier to a declaration to indicate the declaration can be accessed and subclassed by code in the same module as the declaration. Declarations marked with the public access-level modifier can also be accessed (but not subclassed) by code in a module that imports the module that contains that declaration. (edited)
Avatar
omochimetaru 8/29/2017 2:29 AM
手元のプロジェクトでモジュール分割されてるのでopen絡めて試してみたけどやっぱり呼び出せますねえ
2:30 AM
openは別モジュールで継承可能な点以外publicと同じで、publicは別モジュールから使用可能の意味なので、 見えなくなるのが謎・・・
Avatar
norio_nomura 8/29/2017 2:50 AM
呼び出せますね。なんだこれ…
Avatar
norio_nomura 8/29/2017 3:11 AM
再現できた。 open class NSValue2 {} protocol Factory {} extension Factory { init(factory: () -> Self) { self = factory() } } extension NSValue2: Factory {} open class NSNumber2: NSValue2 { private override init() {} private convenience init(private: Int) { self.init(factory: { NSNumber2() }) } public convenience init(init0: Int) { self.init(private: init0) } } open class NSDecimalNumber2: NSNumber2 {} これでモジュール外の NSDecimalNumber2(init0:0) がビルドエラー error: 'NSDecimalNumber2' cannot be constructed because it has no accessible initializers になる。
3:15 AM
ああ、これ違う…
Avatar
omochimetaru 8/29/2017 3:16 AM
NSDEcimalNumber2に override init が必要なはず
Avatar
norio_nomura 8/29/2017 3:47 AM
今度こそ再現できたと思う。 import Foundation internal protocol _Factory { init(factory: () -> Self) } extension _Factory { init(factory: () -> Self) { self = factory() } } open class NSValue2: _Factory { internal init() {} } open class NSNumber2: NSValue2 { internal override init() { super.init() } public convenience init(value: Bool) { self.init(factory: { NSNumber2() }) } } open class NSDecimalNumber2: NSNumber2 { // override init() { super.init() } // この行を復元するとビルドが通る。 public init(decimal dcm: Decimal) { super.init() } } これでモジュール外の NSDecimalNumber2(value: true) がビルドエラー error: incorrect argument label in call (have 'value:', expected 'decimal:') になる。 (edited)
Avatar
omochimetaru 8/29/2017 3:52 AM
おお こちらでも再現しました
3:54 AM
どういうルールなのか弄って検証中
Avatar
norio_nomura 8/29/2017 3:54 AM
NSDecimalNumber2override init() { super.init() }を足すと通る様になる。
Avatar
Rule 1 If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers. Rule 2 If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.
Avatar
omochimetaru 8/29/2017 3:59 AM
open class NSNumber2 { public init() { } public convenience init(value: Bool) { self.init() } } open class NSDecimalNumber2: NSNumber2 { // A // public override init() {} // B public init(decimal dcm: Decimal) { super.init() } }
3:59 AM
これだけで現象のオンオフできた
Avatar
Rule 2 の「superclassのすべてのdesignated initialzerを実装していれば、 superclass の すべてのconvenience initalizer が継承される」
🙏 2
Avatar
omochimetaru 8/29/2017 4:00 AM
あ、 @rintaro 先生・・・
4:01 AM
知らなんだ…
Avatar
omochimetaru 8/29/2017 4:01 AM
ややこしいンゴ
Avatar
norio_nomura 8/29/2017 4:02 AM
拝んでおこう 🙏
Avatar
omochimetaru 8/29/2017 4:03 AM
つまり、サブクラスで親のdesignated initializerを全部overrideしてない場合なので、 Rule1にもRule2にも合致しないため、 convenience initializerの継承がされない
4:03 AM
ということか。
Avatar
swift-4.1-DEVELOPMENT-SNAPSHOT-2017-10-25-a を試したら、REPL起動時に-I/usr/lib/swift/clang/includeを渡さなくてもimport Foundationでエラーにならなくなってた 🙌 (edited)
Avatar
REPLで面倒なコマンド打たなくても良いんですね 🎉 🎉
Avatar
norio_nomura 11/6/2017 3:30 AM
swift-corelibs-foundationのバグを追って原因がCoreFoundationにあると知り、元となってるCoreFoundationのソースがOS X 10.10.5で公開されたモノらしいと知り、さらにソース非公開の最新のCoreFoundationだと修正されているぽい事を知ると、PR投げる気が失せる…
Avatar
omochimetaru 11/6/2017 3:33 AM
Appleの内部で CoreFoundation 直すときに、同じ問題って OSS の方にも無いのかな?って見てほしいですね
Avatar
こういう感じで、最新のCoreFoundationの反映自体はされてますね(少なくとも昨年のSierraでは) https://github.com/apple/swift-corelibs-foundation/pull/709
Avatar
omochimetaru 11/6/2017 3:37 AM
なるほど、じゃあ、たまたまこういうプロセスから漏れちゃっただけですか
Avatar
まだ時期的に公開されてなくて、反映も追いついてないだけな気がします。昨年のPRは12月だし。
Avatar
omochimetaru 11/6/2017 3:39 AM
あー 漏れてるんじゃなくてまだ来てないという意味か。
Avatar
norio_nomura 11/6/2017 3:49 AM
できたらCoreFoundation単体のリポジトリで公開して欲しいところ。
Avatar
確かに単体で公開される方がいいですね
Avatar
norio_nomura 11/7/2017 9:32 PM
This is the latest changes from CoreFoundation, round tripped to include the latest additions in High Sierra. Careful review should be taken for non x86_64 linux platforms since we have not yet tes...
Avatar
やっぱり実際の挙動と公開されてるコードは違うな。
Avatar
AppleのICUとLinuxで使われているICUの挙動が違うのが原因だろう、と教えてもらった。 https://opensource.apple.com/source/ICU/ICU-59117.0.1/
12:54 AM
根本的な解決には、swift-corelibs-foundationでもAppleが公開しているICUを使う事が必要だけど、影響範囲が広くて簡単にはいかなそう。
Avatar
func testNSStringPath1() throws { let actual = NSString(string: "").appendingPathComponent("*.txt") let expected = "*.txt" XCTAssertEqual(actual, expected) }
5:40 AM
MacOSXなら↑が通るけど Linux だと コケる。 /*.txt になってしまう。
5:46 AM
どこかに報告するべきですかね?
Avatar
Resolves SR-5582 Changed NSString.appendingPathComponent implementation on Linux to match Darwin's Fixed following issues where path.appendingPathComponent(component) would produce incorrect result...
Avatar
おお!!
6:03 AM
もうマージ済みだ じゃあ使ってるやつが新しくなれば解決だ。ありがとうございます。
Avatar
うおお・・・
6:44 AM
同じSwiftバージョンなのに
6:44 AM
手元のDockerとTravisCI の Ubuntu で挙動が違う・・・・・
6:46 AM
DockerはUbuntu16.04だから そこか
Avatar
docker良い・・・
Avatar
docker上でubuntu14.04環境で検証したけどテストが通った
7:47 AM
TravisCI上のubuntu14.04の固有の何かがある・・・
Avatar
あれ〜なんだこれ・・・
8:01 AM
TestResources └── globstar ├── a │ ├── b │ │ ├── c │ │ │ ├── d0.txt │ │ │ └── d1.md │ │ ├── c0.txt │ │ └── c1.md │ ├── b0.txt │ └── b1.md ├── a0.txt └── a1.md substSubpathStrs = try fm.subpathsOfDirectory(atPath: path) dump(substSubpathStrs)
8:02 AM
Test Case 'GlobTest.testExpandGlobStar1' started at 2017-11-11 07:57:51.502 ▿ 3 elements - "a" - "a0.txt" - "a1.md"
8:02 AM
subpathsOfDirectoryが仕事してない・・・
8:03 AM
$ swift --version が同じならこの手の挙動は同じですよね?
Avatar
Foundationの中身のコードをコピペしてダンプして調べた
8:51 AM
[subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] enter [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryName=. [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryName=.. [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryName=a [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryType=0 (DT_DIR=4) [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryName=a0.txt [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryType=0 (DT_DIR=4) [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryName=a1.md [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] entryType=0 (DT_DIR=4) [subpathsOfDirectoryCompat(/home/travis/build/omochi/gysb/TestResources/globstar)] exit
8:52 AM
if tempEntryType == Int32(DT_DIR) { let subPath: String = path + "/" + entryName let entries = try subpathsOfDirectory(atPath: subPath) contents.append(contentsOf: entries.map({file in "\(entryName)/\(file)"})) }
8:52 AM
↑ dirent 構造体の d_type フィールドを見て、それが DT_DIR だったら サブディレクトリとして再帰的に呼び出すようになっているけど
8:53 AM
TravisCI 上の Ubuntu上だと d_type がディレクトリでも 0になっている事がわかった。
8:53 AM
travisの実行が container mode だからなんかおかしそう。
Avatar
d_typeがサポートされてないファイルシステムもあるみたいで https://linuxjm.osdn.jp/html/LDP_man-pages/man3/readdir.3.html
Avatar
なんだと!!!!!
Avatar
マジカ、travisの環境が壊れてると考えたけど、じゃあそれに頼ってしまったFoundationの実装が悪いと言えるのでは・・・
Avatar
Ubuntu Trustyのcontainer basedのfile systemはAUFSでサポート外、という感じ?
Avatar
ちなみにfileExeits(isDirectory)の方のディレクトリチェックを見てみたら、そっちはstatで実現されてた。
9:01 AM
あーなるほど。
Avatar
sudo: requiredにしてみると違いが分かりそう
Avatar
そうですね、いまからやってみます
9:02 AM
AUFSとやらがキモか・・・
9:03 AM
dirent 構造体のフィールドで POSIX.1 で要求されているのは、 d_name[] と (XSI 拡張での) d_ino だけである。
9:03 AM
なるほどなあ。
9:05 AM
期待通りに動いた > sudo: required
9:06 AM
ありがとうございました〜
9:06 AM
あきらめてsudo required環境でテストするか、
9:06 AM
自前実装で動くようにするか・・・
9:07 AM
あとFoundationプロジェクト側にこの件は伝えたほうが良いんだろうか?
Avatar
なるほどなー、まあcorelibs-foundationの実装がよくなさそう
Avatar
報告はFoundationのMLでいいんでしょうか
9:10 AM
How do I contribute? We welcome contributions to Foundation! Please see the known issues page if you are looking for an area where we need help. We are also standing by on the mailing lists to answer questions about what is most important to do and what we will accept into the project.
Avatar
enumerator(atPath:)とかはどうだろう
9:11 AM
bugs.swift.orgに起票でもよさそう?
Avatar
bugsってOSS のFoundationもいいんですっけ
Avatar
はい、corelibsも対象です。
Avatar
なるほど、じゃあそうします。
Avatar
さっきのappendingPathComponentのもSRついてたし
Avatar
たしかに、もうあるかもしれないですね
9:14 AM
ああ、そういう意味化
9:14 AM
起票があるからSR番号なのか。
9:17 AM
enumeratorの方は fts ってAPIで実装されているみたい
9:17 AM
fts_read
9:17 AM
使ったことなかった。
9:17 AM
これは動きそうですね。差し替えてみます。
9:22 AM
NSEnumeratorを継承している関係で型が func nextObject() -> Any? なのが気持ち悪くて使ってなかったんですが
9:23 AM
こっちのほうが良さそうだ。
9:28 AM
enumeratorにしたら期待通りに動きました〜〜ありがとうございます
🎉 1
Avatar
https://github.com/omochi/gysb バッジがついた〜
gysb - Generate your swifty boilerplate
Avatar
CircleCIオススメ
Avatar
TravisはSwiftで必要なパッケージで、入っていないものがあった気がする。
10:34 AM
libblocksruntime0 が入ってない。
Avatar
ふむ
Avatar
あいや、sourcekitが必要とするだけで普通は関係なかった。
Avatar
linuxをサポートしてるネットワーク通信ライブラリって何かご存知ですか?
Avatar
サーバーサイドSwiftフレームワークが使っているやつで良いかなと思って、僕はVaporの使ってます。
Avatar
お、Vapor
9:03 AM
に入ってるんですね 気づかなかったです
Avatar
vaporの中にめっちゃいろいろ入ってるよ
Avatar
オーーーーー
9:04 AM
ほしかったものだ。
Avatar
multipartとかも対応
Avatar
vaporは使ったこと無いけどvaporの中にいろいろはいってるのは前みたw
Avatar
いまVaporでVapor Cloudで動かすサービス作っていて何も考えずにクライアントのコード引っ張ってきてAPIKit使ってたけどMacでビルド通ってたけどデプロイしたらコケて悲しんでいました
Avatar
個人的にはHTTP/2非対応なのがマイナス点ですが、あと数ヶ月くらいでリリースされそうなVapor 3で対応しそうです。 https://github.com/vapor/vapor/pull/1188 (edited)
This PR will focus on HTTP2 and Gzip. The reason this is bundled is because HTTP2 relies on Huffman trees, which are are one of the primary components of Gzip. Gzip will not implement a good algori...
1:15 PM
https://t.co/SbLvT41AjNhttps://t.co/02nBsD8sva とSwift 3.0サポートの3つが絡み合って詰んでる……というのもif swift(>=4.0.2)というパッチバージョン(3桁目)まで含んだチェックがSwift 3.1からしかサポートされていない。
Avatar
なんだこりゃwww
Avatar
めっちゃ厳しい……Swift 3.0をドロップするしかない気はしている。
Avatar
方法はあるのですが、今外なので戻って確認してから書きます。
Avatar
https://bugs.swift.org/browse/SR-4032  により、 swift(>=) による検査は演算子が使えません。
2:03 PM
なので、 #if swift(>=4.0) #elseif swift(>=3.2) #else #endif みたいにするしかないと思います。
2:06 PM
そうすれば、 #else ブロック以外は Swift3.0 ではパースされないので、その中であれば swift(>=4.0.2) など使えると思います。
Avatar
あーなるほど!そこで引っかかってパースされていたのか。ありがとうございます!試してみます。
Avatar
SR-6419 の話で、どうしてもtrailing closure使いたければ、 self.token = self.notificationCenter.addObserver(forName:object:queue:using:)(nil, nil, nil) { ... } っていう手もあり。
Avatar
なるほど。
2:21 PM
無事Swift 3.0で動きました 😂 https://travis-ci.org/Quick/Nimble/jobs/303553458
👏 1
2:21 PM
ありがとうございます!! 🙏
Avatar
ひどいソースになっちゃってるw
Avatar
#if swift(>=4.0) #if swift(>=4.0.2) #else extension NotificationCenter { func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { ... } } #endif #endif みたいにメソッド生やすともうちょっとマシにできそうな気がしてきましたw (edited)
Avatar
Xcode 8サポート継続か、頑張るなあ。
Avatar
切るにはメジャーバージョン上げたいところで、とはいえこの修正は7.0.3として出したいと思ったのでした。
Avatar
import Dispatch func fib(_ i: Int) -> Int { switch i { case 0, 1: return 1 default: return fib(i-1) + fib(i-2) } } DispatchQueue.concurrentPerform(iterations: 30) { i in fib(i) } これ実行したら確率的に死んでしまう…… swift-DEVELOPMENT-SNAPSHOT-2018-01-29-a-ubuntu16.04にて
8:34 AM
bugs.swift.org見てるけど同じのは無さそう?
Avatar
3020 なら死なない?
Avatar
2とかだと死なないですねぇ
Avatar
omochimetaru 1/30/2018 8:41 AM
print(i) だと?
Avatar
コア数絡んでそう
Avatar
単に Linux の Dispatch のバグかもしれないけど
Avatar
_ = iでやってみましたけど死亡
8:42 AM
WSLなので一般的じゃないかもと思い社内Ubuntuにssh叩くも繋がらず
Avatar
あー、いや、大丈夫か。 2^30 に分岐したら(実際には -2 もあるからもっと少ないけど)ヤバそうと思ったけど、そこは並行じゃないから大丈夫だった。
Avatar
omochimetaru 1/30/2018 8:43 AM
LinuxのDispatchのバグっぽいね
Avatar
ああfib起因のバグの可能性ですか。それは考えてなかった
8:44 AM
とりあえずそれは無さそうですね
Avatar
import Foundation import Dispatch for i in 0..<30 { DispatchQueue.global().async { print(i) sleep(1) _ = i } } sleep(10) (edited)
8:58 AM
これも同上
9:01 AM
printは一個も出ずに死にますね。さらにsleepを入れることで死亡率100%に
9:06 AM
DispatchQueueを個別に生成した場合死なないのでconcurrent queueの問題みたいです
Avatar
norio_nomura 1/30/2018 9:07 AM
手元ではどっちも再現しないな。
Avatar
omochimetaru 1/30/2018 9:07 AM
swift-corelibs-libdispatch - The libdispatch Project, (a.k.a. Grand Central Dispatch), for concurrency on multicore hardware
Avatar
再現しないとなるとWSLの可能性が
Avatar
omochimetaru 1/30/2018 9:07 AM
Windows Subsystem for Linux 固有の問題な気がするね
Avatar
windows機二台で試して同じ結果なのでubuntuで再現しないならそうなりそうです
Avatar
norio_nomura 1/30/2018 9:10 AM
Dockerで。 docker run --privileged -it --rm norionomura/swift:swift-4.1-branch swift -I/usr/lib/swift/clang/include
9:11 AM
norionomura/swift:swift-4.1-branchが最新のスナップショット。
Avatar
まずdockerをインストールせねば。
Avatar
omochimetaru 1/30/2018 9:13 AM
なんかウェブでインストーラ落とすだけだから簡単だよ
9:13 AM
その後何も考えずに ↑のコマンド叩けばシェルに入れる (edited)
9:14 AM
↑これ
Avatar
ああ、たんにwindowsにはいってなくて時間かかるってだけです。
9:14 AM
インストール爆速でした
Avatar
omochimetaru 1/30/2018 9:14 AM
windows上のdocker上のubuntuと mac上のdocker上のubuntuは また挙動が違う可能性があるのでは
9:14 AM
norioさんが言ってるのはmac上だと思う。
Avatar
そっちも並行してやってます
Avatar
omochimetaru 1/30/2018 9:15 AM
なる
Avatar
norio_nomura 1/30/2018 9:16 AM
CircleCIがdockerを使うと楽なので、linuxのCIは全部docker
9:17 AM
macとWindowsのdockerでどんな違いがあるのかは知らないです。
9:19 AM
WSLはVMではないぽい?
Avatar
omochimetaru 1/30/2018 9:19 AM
VMでは無いという認識
9:20 AM
Dockerに似てて、システムコールのレイヤでWindowsカーネルが意味変換の面倒を見てる
9:21 AM
WSLはマイクロソフトが開発した(Linuxカーネルのコードが含まれていない)Linux互換のカーネルインタフェースとともに、その上で動くUbuntuに由来するユーザーモードバイナリを提供する。これはBashシェルやコマンド言語、ネイティブLinuxコマンドラインツール(sed、awkなど)やプログラミング言語インタプリタ(Ruby、Pythonなど)[5]を含む[6]。
https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux
Windows Subsystem for Linux (WSL) とは、Linuxの(ELFフォーマット形式の)バイナリ実行ファイルをWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。
9:21 AM
Linux互換カーネルインターフェースであって、Linuxカーネルそれ自体はブートしてない
Avatar
norio_nomura 1/30/2018 9:22 AM
なるほど。dockerの方がまともそう。
Avatar
win/macともにdocker上では問題ないですね
👀 1
Avatar
windowsで動かす話がでた当初にdockerとwsl比較してwslのほうが良さそうってなったんですけどね。 とりあえず並列化がどうしても必要な段階ではないので保留にしておきます。ありがとうございました。
Avatar
norio_nomura 3/4/2018 4:10 AM
/usr/libに置かれたライブラリ、swiftcだとリンクされるけど、REPLだとerror: Couldn't lookup symbols:になってしまう。
4:11 AM
swift -I/usr/lib/swift/clang/include -L /usr/libで起動したREPLだとエラーにならないので、REPLはldとは違う仕組みでライブラリを検索するぽい?
Avatar
REPLで:type lookupだと型の情報が出るのに、使おうとするとunresolved identifierになる 🤔 $ docker run --privileged -it --rm norionomura/swift:40 swift -I/usr/lib/swift/clang/include Welcome to Swift version 4.0 (swift-4.0-RELEASE). Type :help for assistance. 1> import Foundation 2> :type lookup DBL_DECIMAL_DIG var DBL_DECIMAL_DIG: Swift.Int32 { get {} } 2> print(DBL_DECIMAL_DIG) error: repl.swift:2:7: error: use of unresolved identifier 'DBL_DECIMAL_DIG' print(DBL_DECIMAL_DIG) ^~~~~~~~~~~~~~~ (edited)
Avatar
norio_nomura 4/17/2018 4:01 AM
ci.swift.org で使ってるclangとllvmは5.0なのか。llvm-symbolizerにもオプションが増えてるなあ。 (edited)
Avatar
Illegal instructionで落ちた時に、backtraceが出ない条件って何が考えられるでしょうか?
Avatar
norio_nomura 5/2/2018 7:54 AM
Linux向けのバックトレース用パッケージを作りました。 https://github.com/norio-nomura/SwiftBacktrace
SwiftBacktrace - Stack traces for Swift on Mac and Linux using libunwind.
7:54 AM
Darwinのバックトレースと同様にクロージャとかまで表示してくれます。
😍 1
7:54 AM
リリースビルドでもOK。
7:56 AM
macOSではバックトレースの取得に https://github.com/llvm-mirror/libunwind が使われています。
Mirror of official LLVM libunwind git repository located at http://llvm.org/git/libunwind. Updated every five minutes. http://llvm.org
7:57 AM
それの移植元になった https://github.com/libunwind/libunwind/ を利用するパッケージになっています。
libunwind official github repo
8:03 AM
いちおう、macOSでも動いて、標準のバックトレース(SwiftだとThread.callStackSymbols)とほぼ同じ出力が得られます。
Avatar
norio_nomura 5/2/2018 8:24 AM
これでSwiftCompilerDiscordappBotのクラッシュ原因を突き止めたい…
Avatar
Kishikawa Katsumi 5/2/2018 8:25 AM
クラッシュするケースがあるんですか?
Avatar
norio_nomura 5/2/2018 8:27 AM
HerokuのログにState changed from up to crashedってのが時々出てくるのですが、何がトリガーなのかさっぱりわかっていないのです。
8:29 AM
ボットに対する指示ではクラッシュしないので、Discordから送られてくる何かのイベントがトリガーだと一応予想しています。
Avatar
Kishikawa Katsumi 5/2/2018 8:30 AM
なるほど。受け取ったSwiftのコードが原因ではなさそう、ということですね。
Avatar
norio_nomura 5/10/2018 2:26 AM
ProcessstandardInputにパイプのFileHandleを渡してパイプへデータを書き込んでも、Linuxだと起動したプロセスが標準入力を読んでくれない現象に悩んでたのだけど、launch()の前にパイプへデータを書き込んでおく事で読んでくれる様になった。
2:26 AM
macOSだとlaunch()後にパイプへ書き込んでも問題ない。 (edited)
Avatar
norio_nomura 6/2/2018 5:40 AM
Process.waitUntilExit()がスレッドセーフではないため、Process.terminationStatusがおかしくなる。 @swift-4.2.4 import Foundation let process = Process() process.launchPath = "/bin/false" let group = DispatchGroup(), queue = DispatchQueue.global() process.launch() queue.async(group: group) { process.waitUntilExit() } group.wait() print("terminationStatus should be 1, actual: \(process.terminationStatus)") (edited)
Avatar
swift42 BOT 6/2/2018 5:40 AM
terminationStatus should be 1, actual: 0 (edited)
Avatar
terminationHandlerの方がいいのかな? リファレンス見る限りではwaitUntilExit()とは別々に動いてるみたい。 @swift-4.2.4 import Foundation let process = Process() process.launchPath = "/bin/false" let semaphore = DispatchSemaphore(value: 0) process.terminationHandler = { _ in semaphore.signal() } let queue = DispatchQueue.global() process.launch() queue.async { process.waitUntilExit() } print("terminationStatus should be 1, actual: \(process.terminationStatus)") semaphore.wait() print("terminationStatus should be 1, actual: \(process.terminationStatus)") (edited)
Avatar
swift42 BOT 6/2/2018 7:57 AM
terminationStatus should be 1, actual: 0 terminationStatus should be 1, actual: 1 (edited)
Avatar
norio_nomura 6/2/2018 8:14 AM
ああ、確かにterminationHandlerを使った方が良さそう。 https://github.com/apple/swift-corelibs-foundation/blob/swift-4.2-branch/Foundation/Process.swift#L341
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
Avatar
norio_nomura 6/2/2018 8:37 AM
あいや、同じスレッドで使えばwaitUntilExit()でも問題ないしその場合のオーバーヘッドもwaitUntilExit()の方が少ないかな。
Avatar
norio_nomura 8/7/2018 3:53 AM
swift-4.2-DEVELOPMENT-SNAPSHOT-2018-08-06-aを使ったubuntu 16.04のdockerイメージ作成が失敗する様になった。 Step 7/7 : RUN swift --version ---> Running in bb3dce9f40cc swift: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by swift) (edited)
3:54 AM
GLIBCXX_3.4.22を含むlibstdc++.so.6はubuntu 16.04のパッケージとしては未リリースぽい。
Avatar
norio_nomura 8/8/2018 1:23 AM
swift-4.2-DEVELOPMENT-SNAPSHOT-2018-08-07-aで直ってた。
Avatar
omochimetaru 11/9/2018 2:09 AM
The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation
2:09 AM
/// - Note: this differs from the Darwin implementation in that the keys must be Strings open var threadDictionary = [String : Any]() (edited)
2:09 AM
これ困るんですけど
2:10 AM
どこに連絡するのが良いでしょう?
2:10 AM
bugs.swift.org ?
2:10 AM
なぜ困るかと言うと、 Thread.current.threadDictionary を Thread Local Storage として使おうとしたときに
2:10 AM
String だと衝突回避が困難だからです
2:11 AM
MacOS版ならNSMutableDictionaryなのでObjectIdentifierとかUnsafeRawPointerをキーにすればまずぶつかる事は無い
Avatar
@omochimetaru ObjectIdentifierdebugDescription をキーにするとか?
Avatar
omochimetaru 11/9/2018 2:17 AM
"ObjectIdentifier(3001238)" みたいな?
Avatar
うん
Avatar
omochimetaru 11/9/2018 2:17 AM
まあ確かに悪意が無ければ衝突することは無いですね・・・
2:17 AM
それでも8バイト整数であるポインタと違って文字列の長さだけ比較しないといけないので
2:18 AM
無駄なパフォーマンスロスがありそうで微妙な気分です。
Avatar
パフォーマンスは悪いだろうね。
Avatar
NSMutableDictionary だと何がまずいんだろう?
Avatar
omochimetaru 11/9/2018 2:26 AM
たしかに、パッチとしては普通にここの型をNSMutableDictionaryにしてくれたら、それで僕は満足・・・
2:26 AM
コメントでわざわざnote 書くなら理由も書いといてほしいな。 (edited)
2:27 AM
とりあえずLinux向けの分岐では @koher 案で対応しときます 🙏
2:33 AM
bugsにFoundationに関する話も投稿されてるから、ここでいいか。
Avatar
あ、corelibs 系のバグ報告は bugs でいいです。
2:34 AM
NSMutableDictionary に変更PRしちゃっても良いと思いますけどね。
Avatar
omochimetaru 11/9/2018 2:35 AM
ふむ。PRついでにお気持ちと質問を書けばいいですかね? (edited)
Avatar
良いと思います。Dictionary じゃなければいけない理由が本当にあるなら、 [AnyHashable: Any] ではだめなのかとか聞いてみると良いと思います。 (edited)
Avatar
omochimetaru 11/9/2018 2:37 AM
じゃあそうします、最近ビルドしてなかったから、後でやろう。ありがとうございます。
Avatar
@omochimetaru 質問来てるよ。
Avatar
気づいてます、対応中です
Avatar
DockerでSwiftのコンパイルしようとしたらメモリ不足でリンカーが死んだw 2G じゃたりないらしい。
Avatar
それが原因でswift-nightlyが更新できてません。
Avatar
ほう。こちらはとりあえず8Gにしてリトライ中ですが、クラウドだから増やすのが面倒ってことですか?
Avatar
CircleCIでビルドが通らないので。多分Herokuでのビルドも通らないんじゃないかな。
Avatar
なるほど・・・
3:08 AM
Save time and cost by making your engineering team more efficient. Get started for free and see how many containers and parallelism you need to scale with your team.
3:08 AM
課金してもメモリサイズは上がらない・・・?
Avatar
あ、SwiftのToolchainか。
3:17 AM
だとしたら違う原因なのかも。
3:18 AM
スタックトレースも吐かないでクラッシュするので、メモリ不足だろうと考えてました。
Avatar
[954/1340] Linking CXX executable bin/clang-check ... clang: error: unable to execute command: Killed clang: error: linker command failed due to signal (use -v to see invocation)
3:19 AM
8Gでやってもだめだった
3:22 AM
てか、ボリュームマウントに問題があるのか、コンテナをstop/startするとビルドキャッシュが効かない・・・
Avatar
こちらでうまくいかない時と同じ様なエラーメッセージですね。
Avatar
同じか・・・なんだろう
Avatar
ちなみにCircleCIへsshで入ってリビルドすると通ったりするので、リビルドされるソースが少ないと通る可能性がありそう。
Avatar
今そのままリトライして、そしたらこのリンクフェーズだけ再開したけど、だめでした
3:27 AM
うーんこまったな・・・
Avatar
ああ、foundationへのPRのCIか。
Avatar
今はFoundationのテストをしたいだけだから、Swiftコンパイラ自体はダウンロードしてくる方向でやってみるか
3:29 AM
はい、Linuxで落ちてて
3:30 AM
The XCTest Project, A Swift core library for providing unit test support - apple/swift-corelibs-xctest
3:30 AM
CIのエラーログから見ると、多分ここで落ちてるんですけど、再現までが遠いw
Avatar
これは辛いな。
Avatar
cmake -G Ninja ../../../swift-corelibs-foundation \ -DCMAKE_C_COMPILER=../../llvm-linux-x86_64/bin/clang \ -DCMAKE_SWIFT_COMPILER=../../swift-linux-x86_64/bin/swiftc \ -DFOUNDATION_PATH_TO_LIBDISPATCH_SOURCE=../../../swift-corelibs-libdispatch \ -DFOUNDATION_PATH_TO_LIBDISPATCH_BUILD=../../libdispatch-linux-x86_64
5:21 AM
@norio_nomura 配布している nomuranorio/swift って、ビルドディレクトリは含まれてますか?
5:22 AM
libDispatchのビルドディレクトリが必要らしく。
Avatar
含まれてないです。
Avatar
なるほど
5:23 AM
とりあえず古いコミットでリビルドしてみるか・・・
Avatar
1101でもビルドできんかった
10:07 AM
Dockerだから起きてる問題だったりするのかなあ・・・
Avatar
Kishikawa Katsumi 11/14/2018 10:10 AM
SwiftBotで使ってるDigitalOceanのマシンでビルドできるかやってみましょうか? Dockerじゃなくて普通のUbuntuなので。
10:10 AM
うちに帰ってからになりますけど。
Avatar
おお、お願いします ビルドできる環境がわかれば手が進められるので、助かります
Avatar
Kishikawa Katsumi 11/14/2018 10:16 AM
単純にSwiftのmasterをビルドしたらいいんですか?
Avatar
masterが時間差で壊れるとアレなので、 できれば公式CIが成功してるsnapshotだと嬉しいです コマンドラインを後で貼りますね いま移動中のため
Avatar
Kishikawa Katsumi 11/14/2018 10:19 AM
私もやるのは早くて23時くらいからなのでゆっくりで。
🙂 1
Avatar
GitHub Gist: instantly share code, notes, and snippets.
Avatar
https://github.com/apple/sourcekit-lsp/pull/1 何かは知らないのですが11-13は問題あるので試すなら11-01がいいと思います。
The latest toolchain has some issues on Linux (and on macOS we need an update to match it). Update the instructions in the meantime.
Avatar
2018-10-03より後のスナップショットはいろいろ問題があって、swift-nightlyボットは更新されてない。
Avatar
ふむ、ありがとうございます。手順書を11-01に変更しておきました (edited)
Avatar
Kishikawa Katsumi 11/14/2018 1:55 PM
とりあえずビルド始めました。メモリ1GBディスク25GBの貧弱マシンでメモリは初めから60%消費してる状態だけど別にそこから増えることもなくビルド進んでますね。
🙏 1
2:00 PM
あ、メモリよりCPUが先に悲鳴をあげてるっぽい。
Avatar
以前AWSのT2 microでやったときは、一瞬でCPUブーストチケット?がなくなりました (edited)
Avatar
Kishikawa Katsumi 11/14/2018 2:26 PM
まあめっちゃ遅いけど進んではいますね。。。 [250/3012] Building CXX object
Avatar
確かその分数はLLVM(Clang)のときとSwiftCompilerのときで別々に出てくるんですが、 僕が止まったのがLLVMのほうの残り350タスクぐらいのところの終盤で生じるバイナリのリンクフェーズなので
2:27 PM
2700/3012ぐらいまではとりあえずいけると思います、気になるのはそこから先ですね
Avatar
Kishikawa Katsumi 11/14/2018 2:28 PM
なるほど。じゃあこのまま放置で明朝ですね。
Avatar
課金がヤバそうだったら止めていただいて大丈夫です
Avatar
Kishikawa Katsumi 11/14/2018 2:29 PM
DigitalOceanはスペックが変わらなければ(めっちゃ転送量が多いとかでない限り)一定です。
Avatar
おおなるほど。
Avatar
Kishikawa Katsumi 11/14/2018 2:30 PM
一定というか、従量課金ではあるんですけど、それは最初に決まっていて、今使ってる最低スペックのマシンでは動かし続けたとして5$/mo
2:30 PM
どうせswiftbotとかのWebでずっと動いてるやつなんで
Avatar
ありがたい
Avatar
Kishikawa Katsumi 11/14/2018 3:28 PM
+ /usr/bin/cmake --build /home/katsumi/work/swift-source/build/Ninja-DebugAssert/llvm-linux-x86_64 -- -j1 all [59/1905] Building CXX object lib/Target/X86/CMakeFiles/LLVMX86CodeGen.dir/X86ISelLowering.cpp.o FAILED: /usr/bin/clang++ -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Target/X86 -I/home/katsumi/work/swift-source/llvm/lib/Target/X86 -I/usr/include/libxml2 -Iinclude -I/home/katsumi/work/swift-source/llvm/include -Wno-unknown-warning-option -Werror=unguarded-availability-new -g -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wno-class-memaccess -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -g -fno-exceptions -fno-rtti -MMD -MT lib/Target/X86/CMakeFiles/LLVMX86CodeGen.dir/X86ISelLowering.cpp.o -MF lib/Target/X86/CMakeFiles/LLVMX86CodeGen.dir/X86ISelLowering.cpp.o.d -o lib/Target/X86/CMakeFiles/LLVMX86CodeGen.dir/X86ISelLowering.cpp.o -c /home/katsumi/work/swift-source/llvm/lib/Target/X86/X86ISelLowering.cpp clang: error: unable to execute command: Killed clang: error: clang frontend command failed due to signal (use -v to see invocation) clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final) Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script. clang: note: diagnostic msg: ********************
Avatar
!!!
3:28 PM
clang: error: unable to execute command: Killed
同じエラーっぽいです。
Avatar
Kishikawa Katsumi 11/14/2018 3:28 PM
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT: Preprocessed source(s) and associated run script(s) are located at: clang: note: diagnostic msg: /tmp/X86ISelLowering-5d18e1.cpp clang: note: diagnostic msg: /tmp/X86ISelLowering-5d18e1.sh clang: note: diagnostic msg: ******************** ninja: build stopped: subcommand failed. utils/build-script: fatal error: command terminated with a non-zero exit status 1, aborting 2つのマシンで試してたけど片方は全然手前で死んだ。
3:28 PM
この状態になるとリトライしても同じ。
3:29 PM
あ、これはディスクかもしれないな。
Avatar
[59/1905] Building CXX object
リンクではないところですね
Avatar
Kishikawa Katsumi 11/14/2018 3:30 PM
進み始めたけど、たぶん死にますね。ちょっとマシン選びが適当すぎました。別の方は進んでるんでそっちの様子を見ましょう。
3:31 PM
Swiftって一部ビルドするだけでこんなにディスク消費するんでしたっけ
Avatar
数Gは使うと思いますけど気にしたことがなくて値はよくわからないです
3:32 PM
手元のbuild/Xcode-DebugAssertは31Gだ。
Avatar
あー、swift build -c releaseだとswift-nightlyボットのCIも通るみたい。
Avatar
ほう
Avatar
久しぶりにswift-nightlyボットを更新できそう。
Avatar
ダメだった。
Avatar
Kishikawa Katsumi 11/15/2018 2:12 AM
[1071/2408] Linking CXX shared library lib/libLTO.so.7svn FAILED: : && /usr/bin/clang++ -fPIC -Wno-unknown-warning-option ^ 昨日ビルドしてた2つのマシンがリンクフェーズの同じところで死んでました。
Avatar
あ、おはようございます、あら・・・マジか・・
Avatar
Kishikawa Katsumi 11/15/2018 2:17 AM
リトライしても同じですね。別にメモリでもCPUでもなさそう。
Avatar
僕も昨日libLTO.soのリンクで死んでました。
Avatar
Kishikawa Katsumi 11/15/2018 2:17 AM
スペックを上げて成功するような様子がないです。
Avatar
なるほど。でもこれでDockerは関係ないことがわかってよかったです。
2:18 AM
PRスレッドの方にも、Dockerのメモリ増やしてみたら?ってアドバイスが来てたんで、改めてやり直しているところですがダメそうだなあ
Avatar
メモリ8G Swap 8G 4コアにして --jobs 1 で実行したら LLVMのリンクが突破できた。
Avatar
Kishikawa Katsumi 11/15/2018 3:32 AM
スペックの問題なのか〜
Avatar
最初デフォルトのjobs4の状態だとコケたので、
3:33 AM
並列実行にバグがあるのかも?
Avatar
Kishikawa Katsumi 11/15/2018 3:34 AM
なるほど。再トライしてみよう。 (edited)
Avatar
[31/78] Linking CXX shared library src/libdispatch.so ここでコケるようになった でも、例の謎の Killed じゃなくて /usr/bin/ld.gold: error: cannot find -lswiftSwiftOnoneSupport
Avatar
Kishikawa Katsumi 11/15/2018 9:57 AM
^ これは根本の原因はビルドスクリプトが変更に追いついてないのかな。
Avatar
そうですね、Swift関連の複数のリポジトリの足並みが揃ってないとこういうことがおきます でも、snapshotはCIで通ったコミットに対してついてるはずだから、 snapshotでチェックアウトしてる以上、正しい組み合わせのはずなんですよねえ
9:59 AM
あ、でもそうか、foundationだけは自分のコミットになってるから、それでおかしいのかな・・・
10:00 AM
それにしてもここまで来るのに朝から8時間かかってるのが厳しいw
Avatar
Docker for Mac 2.0.0.0-mac77(edge)でdocker-machine upgradeしたらハマったので共有。 https://twitter.com/norio_nomura/status/1063237666903273474
Docker for Mac 2.0.0.0-mac77へアップグレード後docker-machine upgradeしたらdocker-machineが壊れた。boot2dockerをv18.06.1-ceにして復旧。 -- 18.09.0 iso breaks swarm ingress · Issue #4608 · docker/machine https://t.co/EwqzwMziDi
Avatar
1116snapshotがビルドできました releaseモードですが
Avatar
foundationを切り替えてやり直したら missing required module 'SwiftShims' でコケた・・
8:04 AM
docker-machine + jobs = 1だと1日1手しか施行できなくて何も進まねえw
8:05 AM
再実行したらなぜかlibDispatchがリビルドされてるな。1回じゃうまくいかないcmakeソースのバグなどがあるのかな?
Avatar
グオオオ
9:56 AM
masterにしたらfoundationのテストが通らなくて、 犯人のコミット調べてたら
9:56 AM
9:56 AM
コンパイラが最近Swift5モードがデフォルトになったからそれだといけるらしい
9:57 AM
手元のswiftcの方のコミットがずれてるから通らなかったのだ・・・
Avatar
今日こそ・・・
2:07 AM
macでdockerが遅い問題、volume mountが遅いらしくて、 cached を設定すると良いらしいので、やってみる
Avatar
ああ、その辺りは散々試しました。
Avatar
お。
Avatar
cachedはメモリ消費が多すぎて、使うのを止めました。
Avatar
なるほどw
Avatar
結局nfsでマウントする様にしてます。
Avatar
ほほう
4:17 AM
ホストのmac上でnfsで?サーバを立てた上で、コンテナがそれに対してソケットで接続してマウントしてる状態を構築するって感じですか?
4:18 AM
それとも、普段からnfsストレージで作業してて、macもコンテナもそこにネットワーク接続している?
Avatar
あ、VMware Fusionでdocker-machine使う構成です。
Avatar
ほほう
Avatar
Docker for Macのネイティブな奴は、nfsを使う構成が面倒だった。
4:21 AM
Managing Swift Repositories. Contribute to norio-nomura/swift-dev development by creating an account on GitHub.
Avatar
ありがとうございます
4:23 AM
IO自体が仮想化されなくなって、CPUバウンドになって、なんかいい感じになるんかな・・・
Avatar
Docker for Macのボリュームマウントが遅い問題は、小規模なプロジェクトではcachedで問題なくなるけど、大規模だとまだダメという認識です。
Avatar
物理メモリ16Gのうち8GをDocker-machineに割り当てた状態で、今Swift Compilerをビルドしてみています。
4:27 AM
昨日までの状態では、たとえ --jobs 1 であっても
4:27 AM
Dockerの中が忙しくなるとホストに影響が出てきて、特に文字入力とか日本語変換とかが秒単位でプチフリするようになるんで
4:28 AM
どうなるか試し中
4:28 AM
いまんとこ、com.docker.hyperkitがメモリ13.7G, メモリ圧縮4.7G, と表示されていますw
4:29 AM
引いても8Gを超えてるのが気になる。
Avatar
cachedだとキャッシュメモリがバカみたいに消費されたと記憶。
4:33 AM
docker-machineを使わずにnfs使う方法。 https://qiita.com/kunit/items/36d9e5fa710ad26f8010 (edited)

Docker for Mac の Volumeマウントの遅さについて

Docker for Mac は正式版になる以前からローカルファイルシステムをマウントした際の、read/writeの遅さが指摘されていた。特に write ...
Avatar
お、簡単そう。
Avatar
dockerにオプション指定ではなくdocker-composeを使う事が多いなら、こちらが良いのかも。
Avatar
設定項目が多いから、dockerオプション指定だと結構めんどくさいですね。
Avatar
そう。
Avatar
以前はmacOSのバグでnfsクライアント側で謎のpermission errorとか出る事があったけど、今は直ったのだったかな。
Avatar
Could not cast value of type 'XCTest.WaiterManager<XCTest.XCTWaiter>' (0x5573ab0fdab0) to 'Foundation.NSObject' (0x7fe388789920).
うおおおおお
6:33 AM
やっと手元で再現できた!!
6:34 AM
ここまで9日かかったw
Avatar
おつ
7:15 AM
nfsのパフォーマンス調べてみた。
7:17 AM
Docker for Mac Native NFS $ docker volume create --driver local --opt type=nfs --opt o=addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3,acregmin=1,acdirmin=1 --opt device=:/Users Users $ docker run --privileged -it -v Users:/Users -w `pwd` --rm norionomura/swift:421 bash -c "time dd if=/dev/zero of=test bs=1k count=100000" 100000+0 records in 100000+0 records out 102400000 bytes (102 MB, 98 MiB) copied, 4.34849 s, 23.5 MB/s real 0m4.365s user 0m0.020s sys 0m0.220s
7:19 AM
docker-machine VMware Fusion + NFS $ docker run --privileged -it -v `pwd`:`pwd` -w `pwd` --rm norionomura/swift:421 bash -c "time dd if=/dev/zero of=test bs=1k count=100000" 100000+0 records in 100000+0 records out 102400000 bytes (102 MB, 98 MiB) copied, 1.43024 s, 71.6 MB/s real 0m1.455s user 0m0.030s sys 0m0.180s
7:21 AM
Docker for Mac $ docker run --privileged -it -v `pwd`:`pwd` -w `pwd` --rm norionomura/swift:421 bash -c "time dd if=/dev/zero of=test bs=1k count=100000" 100000+0 records in 100000+0 records out 102400000 bytes (102 MB, 98 MiB) copied, 45.2698 s, 2.3 MB/s real 0m45.259s user 0m0.370s sys 0m4.710s
7:23 AM
Docker for Mac Native NFSはdocker-machineと同等の場合もある。
Avatar
Docker for Mac の45secは際立ってますね
Avatar
cachedは使ってもあまり変わらなかった。
Avatar
なるほど。こっちでは結構変わりました。全然重くなかった。
Avatar
上記テストはddでの書き込みですからね。読み込みはcachedの効果が出そうです。
Avatar
ですね〜
Avatar
まあでも、nfs使うのがオススメです。
7:27 AM
調査にかかる時間とか、多分1, 2回のビルドで取り戻せる。
Avatar
確かに・・・次やってみます。
Avatar
@swift-4.2.4 import Foundation class Cat {} let a: Cat = Cat() let array = NSMutableArray() array.add(a as Any)
Avatar
exit status: 134 with stderr:Could not cast value of type 'main.Cat' (0x7f180f3b0040) to 'Foundation.NSObject' (0x7f1801800a20). #0 0x000000000410ac94 PrintStackTraceSignalHandler(void*) (/usr/bin/swift+0x410ac94) #1 0x0000000004108b22 llvm::sys::RunSignalHandlers() (/usr/bin/swift+0x4108b22) #2 0x000000000410ae42 SignalHandler(int) (/usr/bin/swift+0x410ae42) #3 0x00007f180ef80390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #4 0x00007f180d6bf428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428) #5 0x00007f180d6c102a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a) #6 0x00007f18095ec742 (/usr/lib/swift/linux/libswiftCore.so+0x3c7742) #7 0x00007f18095e6b62 (/usr/lib/swift/linux/libswiftCore.so+0x3c1b62) #8 0x00007f18095e6bbb (/usr/lib/swift/linux/libswiftCore.so+0x3c1bbb) #9 0x00007f18095e7e43 swift_dynamicCastClassUnconditional (/usr/lib/swift/linux/libswiftCore.so+0x3c2e43) #10 0x00007f18016a4b52 $S10Foundation11_SwiftValueC5storeyAA8NSObjectCypFZTf4nd_n (/usr/lib/swift/linux/libFoundation.so+0x6ebb52) #11 0x00007f18016a42d9 $S10Foundation11_SwiftValueC5storeyAA8NSObjectCypFZ (/usr/lib/swift/linux/libFoundation.so+0x6eb2d9) #12 0x00007f1801342eb2 $S10Foundation14NSMutableArrayC6insert_2atyyp_SitF (/usr/lib/swift/linux/libFoundation.so+0x389eb2) #13 0x00007f1801342e3e $S10Foundation14NSMutableArrayC3addyyypF (/usr/lib/swift/linux/libFoundation.so+0x389e3e) #14 0x00007f180f3af102 #15 0x0000000001043efe llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) (/usr/bin/swift+0x1043efe) #16 0x0000000001048022 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const* const*) (/usr/bin/swift+0x1048022) #17 0x00000000004f8b42 swift::RunImmediately(swift::CompilerInstance&, std::vector<std::__cxx11::basic_string<char, std:
Avatar
↑本質的な問題はこれって事がわかった。
Avatar
通るようになった・・・
Avatar
This PR changes type of Thread.threadDictionary to NSMutableDictionary from Dictionary<String, Any>. The reasons are below. Because apple's implementation for macOS/iOS is so. A current...
12:51 AM
マージされた
🎉 7
12:52 AM
That's a regression; any object should be storable in an array. I'll need to look into it.
12:57 AM
気になるコメントと共に。
Avatar
norio_nomura 1/5/2019 12:09 PM
swift-corelibs-foundationで壊れていたDate, DateComponentsnanosecond周りがSwift 5.0で直ったぽい。 @swift-4.2.4 @swift-5.0.3 import Foundation let now = Date() let comp = Calendar(identifier: .gregorian).dateComponents(in: .current, from: now) let recreatedDate = Calendar(identifier: .gregorian).date(from: comp) print(now.timeIntervalSinceReferenceDate == recreatedDate?.timeIntervalSinceReferenceDate)
Avatar
false
Avatar
true
Avatar
norio_nomura 2/5/2019 12:04 AM
Announcing Swift 4.2.2 and monthly Swift 4.2.x dot releases for Linux We are very happy to announce the release of Swift 4.2.2 containing bug fixes for Linux. Much more excitingly, from now on we will be releasing monthly Swift 4.2.x dot versions for Linux over the next few m...
Avatar
なるほど、swift-corelibs-foundationとswift-corelibs-xctestの修正のバックポートに絞っていると。 (edited)
Avatar
norio_nomura 4/1/2019 11:00 AM
Docker Hubで公開している norionomura/swift 、5.0を機にubuntu16.04からubuntu18.04へ切り替えてたのだけど、Discordのボットをubuntu18.04にするとProcessで起動したswiftプロセスが終了せずにタイムアウトしてしまう不具合に遭遇。
Avatar
norio_nomura 4/1/2019 11:54 AM
ubuntu16.04へ戻すと今までどおりの挙動に戻る事を確認…
Avatar
omochimetaru 4/3/2019 1:54 AM
This PR changes type of Thread.threadDictionary to NSMutableDictionary from Dictionary<String, Any>. The reasons are below. Because apple's implementation for macOS/iOS is so. A current...
1:55 AM
↑11月にワイが出したやつで Nimble や RxSwift が壊れちゃったらしい。
1:55 AM
Ninbleは @ikesyo が直してた。
1:55 AM
RxSwiftは5ヶ月間壊れ続けてるんかな・・・。
Avatar
もともとDarwinと非互換なところがあって、それを互換になるようになおしたら、RxSwiftはそのバグ(非互換)を回避するためのコードを書いてて、そっちが動かなくなったという話なんですね。難しい問題だ。
Avatar
omochimetaru 4/3/2019 2:25 AM
そう・・・
Avatar
何をもってBreaking Changeというのか難しい 🤔
Avatar
omochimetaru 4/3/2019 2:30 AM
もともとがbrokenだっただけって思うんですけどねえ
🙂 1
Avatar
これはRxSwiftが直しましょうねって感じですね
😀 2
Avatar
omochimetaru 4/3/2019 2:32 AM
I'd like to talk about something which has been bugging me for a while. Apologies for not doing it sooner, but recent events have brought this to my mind again and I think we should discuss it. For Swift 5.0, the Foundation team totally redesigned the Data type and did not...
2:33 AM
↑FoundationをSwift-Evol通そうってスレで、まあ、Darwin版がAppleのビジネス配下にあるからどうしようも、ってツッコミが入ってるけど
2:34 AM
Foundationは Darwinの互換性のものとして、 Swiftの標準ライブラリがあったほうが
2:34 AM
物事がスッキリする気がしてきた
2:35 AM
このNSThreadの件も結局、NSMutableArrayとかObjC由来の話があるせいでややこしくなってる感がある
2:36 AM
Linux版のFoundationだけ構造を綺麗にしていこうぜ、みたいな意見もあるけど。
Avatar
norio_nomura 5/1/2019 3:37 AM
Swift 5.0からswift-corelibs-foundationが使うICUがバンドルされる様になったから、令和サポートはツールチェインのアップデートが必要なのか。
Avatar
https://github.com/apple/swift-corelibs-foundation/pull/2234 によって、一部のFoundationの型がComparableになったけど、Nimbleでソース互換の問題が発生した。
Implement the parts that can be implemented and annotate the rest with diagnostics. Add a partially source-compatible version of init(keyPath:ascending:) that works with Comparable values. A li...
3:25 PM
The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation
3:25 PM
これするなら、DarwinのOverlayの方でもComparable準拠追加した方がいいのではないか
Avatar
ひとまず起票しました https://bugs.swift.org/browse/SR-10798
Avatar
norio_nomura 6/24/2019 2:33 AM
Linuxで--enable-test-discoveryを試せるtoolchainのDockerイメージを作りました。 https://forums.swift.org/t/test-discovery-on-linux/26203/5
I created a docker image on Docker Hub as norionomura/swift:pr-25685 that supports --enable-test-discovery.
Avatar
omochimetaru 6/24/2019 7:15 AM
これはLinuxMainなくてもxctestできるようになるモノですか?
Avatar
norio_nomura 6/24/2019 7:22 AM
そう。
7:26 AM
.build/x86_64-unknown-linux/debug/testlist.derived/LinuxMain.swiftXCTestManifests.swift相当を生成してそれを実行してる。 $ rm Tests/LinuxMain.swift remove Tests/LinuxMain.swift? y $ _docker_swift_run norionomura/swift:pr-25685 swift test --enable-test-discovery --parallel [117/117] Testing YamsTests.YamlErrorTests/testYamlErrorScanner $ tree .build/x86_64-unknown-linux/debug/testlist.derived/ .build/x86_64-unknown-linux/debug/testlist.derived/ ├── YamsTests.swift └── main.swift 0 directories, 2 files (edited)
7:28 AM
swift test --generate-linuxmainの生成物をリポジトリへ含めるのが不要になる。 (edited)
Avatar
omochimetaru 6/24/2019 7:29 AM
おお・・・ついに・・・
Avatar
norio_nomura 6/24/2019 7:34 AM
LinuxMain.swiftがなかったら勝手に--enable-test-discoveryする、とかそんな挙動になるのかな。
Avatar
omochimetaru 6/24/2019 7:36 AM
PR見ててもいまいち仕組みがわからない
Avatar
norio_nomura 6/24/2019 7:42 AM
お、SourceKitではなくIndexStoreなのか? https://github.com/apple/swift-package-manager/pull/2174
This is a WIP PR for implementing test discovery on linux using indexing data. The basic idea is to leverage the IndexStore library to get the test methods and then generate a LinuxMain.swift file ...
Avatar
omochimetaru 6/24/2019 7:42 AM
IndexStoreをしかも動的ロードしてる?
7:42 AM
IndexStoreが何かよくわかってない
Avatar
omochimetaru 6/24/2019 7:52 AM
ビルドしたときに解析した情報が入ってるのか。
Avatar
norio_nomura 6/24/2019 7:54 AM
そうみたい。
Avatar
omochimetaru 6/24/2019 7:57 AM
これてっきりSwiftSyntax使うのかと思ってた。
Avatar
norio_nomura 6/24/2019 8:17 AM
Adding Index-While-Building support to Clang This document details the Clang enhancements behind the new index-while-building functionality introduced in Xcode 9. Motivation Indexing typically happens continuously in the background, and works as outlined in Figure 1. When a s...
Avatar
norio_nomura 6/24/2019 8:44 AM
SwiftPMは https://github.com/apple/indexstore-db から一部流用して作ってるぽい。 (edited)
Index database library for use with sourcekit-lsp. Contribute to apple/indexstore-db development by creating an account on GitHub.
Avatar
norio_nomura 6/24/2019 9:14 AM
indexstore面白いけど、エディタか、このSwiftPMの--enable-test-discoveryくらいしか利用法が思いつかないな。
Avatar
FoundationNetworkingに続き、FoundationXMLも分離するらしい。 https://github.com/apple/swift-corelibs-foundation/pull/2432
Split the portions of Foundation that depend on libxml2 into their own module, FoundationXML. This is the last module to be split off.
Avatar
omochimetaru 8/1/2019 2:26 AM
これって
2:26 AM
Foundation は、全部入りを指すんですよね?
2:27 AM
いろいろ取り除いて残った部分のFoundation本体はなんてパッケージなんでしたっけ
Avatar
norio_nomura 8/1/2019 2:49 AM
FoundationNetworkingXMLが取り除かれたパッケージになる。全部入りパッケージは無い(と思う)。
Avatar
omochimetaru 8/1/2019 2:49 AM
あれ、そっちに倒れたのか
2:50 AM
それだと、iOSとLinuxで import Foundation したときに入るものが異なってしまいますよね。
Avatar
norio_nomura 8/1/2019 2:51 AM
そう。Linux対応しようとした場合、#if canImport(FoundationXML)とかが 必須 随時必要になる。 (edited)
Avatar
omochimetaru 8/1/2019 2:51 AM
そういう感じか・・・
Avatar
norio_nomura 8/1/2019 2:54 AM
メリットとしては、FounationNetworkingやFoundationXMLをインポートしなければ、libcurllibxml2をインストールしなくても実行時エラーにならなくなる。 (edited)
Avatar
FoundationXMLに入るものは、そもそもiOSにもないような気が。
Avatar
omochimetaru 8/1/2019 3:01 AM
Foundation. XMLParserとか。
Avatar
XMLParserはあった。ぼくもいま気づきました 🙂
Avatar
The Thread Sanitizer for Swift is now available for Linux. Learn more about it here: https://t.co/Ih9A1q8dFw
Avatar
このビルドエラー、docker-machineで動かしたコンテナでは発生せず、Docker for Mac標準のVMで動かしたコンテナだと発生する。なんだこれ… https://github.com/norio-nomura/SwiftBacktrace/runs/247453814#step:5:18 (edited)
Stack traces for Swift on Mac and Linux using libunwind. - norio-nomura/SwiftBacktrace
Avatar
docker-machineのVMがCPUを1個にしてたから発生しなかったらしい。CPUを2個にしたらdocker-machineでも再現した。
Avatar
omochimetaru 10/4/2019 1:54 PM
ははーん
Avatar
swift-DEVELOPMENT-SNAPSHOT-2019-09-24-a以降で発生してる事を確認した。 https://bugs.swift.org/browse/SR-11570
Avatar
久しぶりにLinuxのToolchainをビルドしてたらSwift.swiftmoduleを生成するところから進まなくて、VMのメモリを3GBまで増やしたらようやく進む様になった。以前は1GBで問題なかったのに…
Avatar
norio_nomura 1/25/2020 3:12 AM
ついに公式のNightly dockerイメージが来た。 https://forums.swift.org/t/nightly-swift-docker-images/33029
👀 6
Avatar
norio_nomura 8/21/2020 4:53 AM
@swift-5.3.3 @swift-main import Foundation private final class _Thread: Thread { private let block: () -> Void init(block: @escaping () -> Void) { self.block = block } override func main() { block() } }
Avatar
no output
Avatar
swiftNightly BOT 8/21/2020 4:54 AM
exit status: 1 with stderr:<stdin>:8:5: error: 'super.init' isn't called on all paths before returning from initializer } ^
Avatar
norio_nomura 8/21/2020 4:54 AM
これmacOS版だと通る。
Avatar
Foundation...
Avatar
omochimetaru 8/21/2020 4:55 AM
Foundation.Thread の定義がずれてるってことですか?
Avatar
norio_nomura 8/21/2020 4:56 AM
Linuxのswift-DEVELOPMENT-SNAPSHOT-2020-08-18-aからNG (edited)
Avatar
corelibsのコードは自分が見た限りわりと牧歌的なのでなんでもあるなーという印象
Avatar
norio_nomura 8/21/2020 5:00 AM
swift-DEVELOPMENT-SNAPSHOT-2020-08-18-a版のswift-corelibs-foundationに入った変更で関係しそうなものは無さそうなので、コンパイラの挙動が変わったのだと思う。 https://github.com/apple/swift-corelibs-foundation/compare/swift-DEVELOPMENT-SNAPSHOT-2020-08-11-a...swift-DEVELOPMENT-SNAPSHOT-2020-08-18-a (edited)
The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation
Avatar
それは怖い
Avatar
swift-5.3.1-RELEASEからLinux版のSwiftPMに渡された--static-swift-stdlibswiftc-static-stdlibを渡す様になったけど、FoundationNetworking, FoundationXMLを使ってるとビルドリンクエラーになってしまう。 (edited)
Avatar
そもそもこれまで-static-stdlib 渡ってなかったのか。
4:35 AM
そういえば、その辺り直したことがある気がする… たしかexecutableをリンクするときにしか渡らなかった気がする
Avatar
swift-5.3-RELEASEでも同一条件で-Xswiftc -static-stdlibを使うとビルドリンクエラーになる。 (edited)
Avatar
おそらく lib/swift_static のswiftmoduleの配置が変わった影響ですね
4:37 AM
あとコンパイラの方の読み込み方も変わっていたはず
Avatar
https://bugs.swift.org/browse/SR-648-static-stdlibがLinuxでも動く様になったと報告されてる詳細に、FoundationNetworking, FoundationXML利用有無とか書かれてない。
4:45 AM
SR-648で挙げられたPRマージ直後のスナップショットでも同様のビルドリンクエラーになるので、配置変更とか関係ないと思う。 (edited)
Avatar
Cherry-pick of #33168 into release/5.3 This PR depends on the following PRs: apple/swift-corelibs-foundation#2863 apple/swift-corelibs-foundation#2862 apple/swift-corelibs-libdispatch#546 Explanat...
Avatar
あ、-static-stdlibを使うと外部依存するライブラリが変わるのか。
Avatar
おお、再現しました。確かにリンクエラーになりますね
Avatar
解決方法がわかったぽい。
Avatar
あ!思い出した。implementationOnlyだ
Avatar
CoreFoundationを明示的にインポートしても駄目だな
Avatar
--static-swift-stdlib付け外し後はswift package cleanではダメで、swift package resetが必要ぽいのも、混乱の要因かも…
Avatar
ええ。。そんなところに罠が
5:09 AM
リンクエラーなのでこれが原因だと思ったんですが https://forums.swift.org/t/implementationonly-behavior-in-autolinking/41621
Hello, everyone. I have a question about @_implementationOnly. Currently, Foundation in apple/swift-corelibs-foundation uses @_implementationOnly to import CoreFoundation. At the same time, RunLoop.swift is still importing CoreFoundation without the attribute. The import in ...
5:13 AM
そもそもimplementationOnlyは5.3に含まれてなかった
Avatar
とりあえずubuntu16.04を使ったnorionomura/swift:5.3.1apt-get update && apt-get install -y libxml2-dev した後 swift package reset; swift build -Xswiftc -static-stdlib はリンク出来るが swift package reset; swift build --static-swift-stdlib はダメという事までわかった… (edited)
Avatar
なんだそりゃ…
5:15 AM
ちなみにリンクエラーは何のシンボルが足りてないと出ますか? import FoundationNetworking import Foundation print(try! String(contentsOf: URL(string: "https://example.com")!)) 僕の環境だとこれを swiftc main.swift -static-stdlib でコンパイルするとCoreFoundationのシンボルが足りないと怒られます。
Avatar
事の始まりjazzy(sourcekitten)のビルドです。 https://github.com/norio-nomura/docker-jazzy/pull/20/checks?check_run_id=1393708523
5:21 AM
/usr/lib/swift_static/linux/libFoundation.a(Bridging.swift.o):Bridging.swift.o:function $s10Foundation12__SwiftValueC5fetch11nonOptionalypyXl_tFZ: error: undefined reference to 'kCFBooleanTrue'
Avatar
CFですねぇ
Avatar
オフィシャルdockerイメージではなく、norionomura/swift:5.3.1を使ってます。
5:24 AM
オフィシャル版Dockerfileからswift-5.3.1-RELEASE相当をビルドしようとしてるけど、途中でdocker buildが止まる…
Avatar
まだ5.3.1のオフィシャルイメージないのか。
5:27 AM
とりあえず norionomura/swift:531 で試してみます
Avatar
あ!わかった
6:00 AM
--static-swift-stdlib の場合、オブジェクトファイルを作るときにはSwiftPMは-static-stdlibを渡さないので /usr/lib/swift/CoreFoundation/module.map を見て、autolinkのエントリを追加しないからリンク時に-lCoreFoundation が付かないんだ! (edited)
Avatar
なるほど。
6:03 AM
とりあえずオフィシャルイメージ相当でも apt-get update && apt-get install -y libxml2-dev swift build -Xswiftc -static-stdlib でリンク出来ることを確認しました。
Avatar
とりあえず -Xswiftcで渡すしか無いですね…
6:04 AM
パッチ作っておきます
🙏 1
Avatar
# ldd `swift build --show-bin-path`/sourcekitten linux-vdso.so.1 => (0x00007fffa45cd000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f50112a8000) libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f50110a5000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5010ea1000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5010b98000) libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f50107dd000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f501045b000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5010245000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f500fe7b000) /lib64/ld-linux-x86-64.so.2 (0x00007f50140a1000) libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007f500fae7000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f500f8cd000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f500f6ab000) libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007f500dbf4000)
6:07 AM
これ、不要な.soがリンクされてる気がするんだけど、実際にシンボルを参照していなければ、.soが無くても動いたりするのだろうか?
Avatar
libicudatalibicuuc が.soでリンクされてるのがおかしい気がしますね 元のlibicuがリンクされてるのはいいのか、swiftサフィックスが付いてるicuが動的リンクされていなければ正常だ。 (edited)
6:09 AM
使ってなければ動くような気もしますが、どうだろう…
Avatar
libxml2.solibicu*を使ってますね。
6:14 AM
素のubuntuにapt-get update && apt-get install -y libxml2するだけで実行可能になりました。 (edited)
Avatar
libxmlもicuに依存してるんですね。しらなかった。
Avatar
実際にはsourcekitdが無いと動かないのですが。
Avatar
お、libxml2が必要な依存物を引き連れてインストールしてくれてるんですかね
Avatar
そうです。
Avatar
echo 'import Foundation'|swiftc -static-executable -はまた違ったリンクエラーになるのね。
Avatar
えぇ…
6:38 AM
/usr/lib/swift_static/linux/libswiftImageInspectionShared.a(ImageInspectionELF.cpp.o):ImageInspectionELF.cpp:function swift::initializeProtocolLookup(): error: undefined reference to 'swift::addImageProtocolsBlockCallbackUnsafe(void const*, unsigned long)' ...
6:38 AM
この辺のシンボルはswiftCoreに入ってるはずなんだけどなぁ
Avatar
--static-swift-stdlib 全然テストされてない…
😅 1
Avatar
とりあえず、issue書いておこうかな…
Avatar
お願いします 🙏
Avatar
SR-648がまだopenだから、そちらへコメントの方が良いのかな?
Avatar
確かに、まだopenならそっちのほうが良いかも知れないですね
Avatar
Motivation: --static-swift-stdlib support on Linux is introduced by #2921 but it doesn&#39;t work when linking CoreFoundation. When CoreFoundation is used on a project and a user uses --static-...
7:13 AM
おそらくこれで治るはず
Avatar
現象と回避方法だけコメントしました。
Avatar
ありがとうございますリファレンスしました〜
🙏 1
Avatar
dockerイメージの方にもPR出した方が良いかも。
Avatar
あれ、dockerイメージの方にも必要な変更ありましたっけ
Avatar
今はlibxml2しかインストールされていないので、libxml2-devへ変更した方が良いかなと。
Avatar
ああそうかslimじゃない方には-devを入れたほうが良さそうですね
Avatar
実はそうなんです。
7:31 AM
mainブランチからブランチ切ったせいでSourceKittenのマニフェストをビルドできなくなった 😅
Avatar
ありゃ?
Avatar
release/5.3 ベースにしてやり直してます
Avatar
sourcekittenはnightlyテストしてないな。
Avatar
正確には依存の SWXMLHash がビルドできなかったです
Avatar
あれ?こちらではswift-DEVELOPMENT-SNAPSHOT-2020-11-09-aでビルドできました。 (edited)
Avatar
お?どうしてだろう… この数日の間に壊れるような変更が入ったのか?
Avatar
自分でSwiftPMをビルドすると-package-description-version 4.0.0に固定されてしまうな‥
Avatar
.so, .a 両方が入ってる場合に .aを優先する方法ってないのだろうか。
Avatar
-static を付けたら.aを優先してくれないですか? lldはそういう挙動だったと思います
11:03 AM
GNU ldがどうかはわからないです
Avatar
-staticは他のオプションの関係で使えないみたい。 # swift build -Xswiftc -static-stdlib -Xlinker -static /usr/bin/ld.gold: fatal error: -pie and -static are incompatible clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [0/1] Linking sourcekitten
2:41 PM
.soを探さないという極端な挙動のオプションはあるけど、両方存在する場合に.aを優先する的なのは見当たらない… # ld.gold --help Usage: ld.gold [options] file... Options: … -Bstatic -l does not search for shared libraries (edited)
Avatar
Static linking on Linux I am happy to announce that with the release of Swift 5.3.1 statically linking the Swift stdlib components is now fully supported on Linux. This includes linking against Dispatch and the different Foundation components. Additionally building self-contai...
Avatar
なるほどPIEと衝突するのか… 難しいですね。
2:17 AM
そういえばSwiftPMのPRは無事マージされました 🙏
❤️ 1
Avatar
swift-DEVELOPMENT-SNAPSHOT-2020-11-13-aで試そうと思ったら、まだPRの変更が含まれてなかった。
🤦 1
Avatar
swift-DEVELOPMENT-SNAPSHOT-2020-11-16-aで確認しました。 docker run -v$PWD:$PWD -w$PWD norionomura/swift:nightly sh -c 'apt-get update && apt-get install -y libxml2-dev && swift build -c release --static-swift-stdlib'で無事にsourcekittenをビルドできました。
Avatar
おー、よかったです
Avatar
swiftlang/swift:nightlyはまだ更新されてないのでnorionomura/swift:nightlyで。
10:08 AM
XCTestはスタティック版がまだ無いぽい。
Avatar
あれ、無いんでしたっけ?
10:12 AM
CMakeLists自体はスタティックライブラリのビルドをサポートしてるんですけどね
Avatar
$ docker-swift-run find /usr -name "*XCTest*" /usr/lib/swift_static/shims/XCTestOverlayShims.h /usr/lib/swift/shims/XCTestOverlayShims.h /usr/lib/swift/linux/libXCTest.so /usr/lib/swift/linux/x86_64/XCTest.swiftdoc /usr/lib/swift/linux/x86_64/XCTest.swiftmodule
Avatar
swift/utils/build-script-impllibXCTest.aをビルドする仕組みが入ってないぽい。
Avatar
なるほど
Avatar
foundation_staticを見ると、productとしてxctest_staticを用意していく作法ぽい。 https://github.com/apple/swift/blob/main/utils/build-script-impl#L2301
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
norio_nomura 4/27/2021 9:18 AM
swift-5.4-RELEASEでSwiftLintにswift build --configuration release -Xswiftc -static-stdlibするとundefined referenceでリンクエラーになる。 https://github.com/norio-nomura/docker-swiftlint/pull/18/checks?check_run_id=2445741371
Avatar
あー、これ直さないまま出荷されてしまった… (edited)
9:27 AM
FoundationがCoreFoundationを@_implementationOnlyでimportするようになった影響でFoundation.swiftmoduleにCoreFoundationへの依存の記述が無くなったんですよね
9:29 AM
動的ライブラリの場合はlibFoundation.soがlibCoreFoundation.soにリンクされているので問題なくリンクできるんですが、静的ライブラリlibFoundation.aはlibCoreFoundation.aを包含してないので壊れました
9:29 AM
とりあえずのworkaroundとしては -Xlinker -lCoreFoundation で治ると思います。
9:30 AM
I want to confirm that I'm using @_implementationOnly correctly with static library in autolinking aspect. Currently, Foundation imports CoreFoundation with @_implementationOnly attribute other than Linux and Darwin platforms. Modules imported with @_implementationOnly are not added to swift1_autolink_entries to hide the dependencies, and the...
Avatar
norio_nomura 4/27/2021 9:51 AM
ありがとうございます。試してみましたが、-Xlinker -lCoreFoundationでは治らないようです。 https://github.com/norio-nomura/docker-swiftlint/pull/18/checks?check_run_id=2446742238
Avatar
おっと、なんでだろう
9:54 AM
手元で試してみます
Avatar
手元では-Xlinker -lCFURLSessionInterface -Xlinker -lcurlで治りました。CIでも試し中。
Avatar
あー、そうかLinuxだとFoundationNetworkingがあるからその辺りも明示的にリンクしないとダメですね
Avatar
むむ、そうすると@_implementationOnlyをつけ忘れてるimport CoreFoundationがLinux向けのFoundationのコードに残ってるかもしれないですね。 (edited)
10:31 AM
@swift-5.4.3 -c -Xfrontend -use-static-resource-dir import FoundationNetworking _ = URLSession.shared (edited)
Avatar
no output
Avatar
The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation
Avatar
あー、確かにその行見たことありますね。
10:38 AM
Wasm向けだとRunLoop動かないので除外してる関係で@_implementationOnly無しのimportが無くなってて、import FoundationがWasmだけで壊れてたんだ。思い出してきた。
Avatar
そこ以外はDarwin向けとテストですね。
Avatar
とりあえず改めてレポートしておきますね
Avatar
bugsに上げました https://bugs.swift.org/browse/SR-14536 (edited)
🙏 1
Avatar
norio_nomura 9/2/2021 6:09 AM
前回のエントリでAuto-linkingについて解説しました。今回はSwiftコンパイラにおけるAuto-linkingの使われ方と、最近それを直した話をします。 kateinoigakukun.hatenablog.com 用語定義 モジュール: Swiftのimportできる単位。 .swiftmodule、.swiftinterfaceまたは module.modulemap が実態。Cで言うヘッダ ライブラリ: libfoo.a とか libfoo.dylib。大抵モジュールと1対1になってる。 SwiftのAuto-linking C言語では以下のようなpragmaを書くことでリンク…
👀 1
Avatar
😁
Avatar
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - swift-nio/ByteBuffer-foundation.swift at main · apple/swift-nio
1:06 PM
swift-nio の Data(buffer: ByteBuffer)NIOFoundationCompat モジュールに定義されていて、Linuxだとこれをimportしないと使えないんだけど
1:06 PM
mac環境だとなぜかこれをimportしなくても使えるのが、なぜかわからなくて困っている
Avatar
綺麗なターゲット作ったらちゃんとエラーになった
1:15 PM
何かビルドが壊れてるか他のライブラリの影響か
Avatar
あれ?auto-linkingって5.5でも壊れたまま?
Avatar
お、どのケースですか?
2:13 PM
あ、5.5か。マージがブランチカットに間に合わなかったので5.5には入ってないです
Avatar
なるほど。
Avatar
久しぶりにローカルのdockerでSwiftLintをビルドしようとしたら、メモリ不足でビルドできなかった…
Avatar
SwiftLintが大きくなったのか、ツールチェインのメモリ利用効率が悪化したのか…
Avatar
5.3だとビルドできた。
Avatar
norio_nomura 11/1/2021 1:21 AM
5.4は5.3での所要時間の7倍を超えてまだビルド中、5.5での挙動に似てるからダメそう。
Avatar
norio_nomura 11/1/2021 4:05 AM
5.4もダメだった。 (edited)
Avatar
norio_nomura 11/1/2021 5:12 AM
Docker for MacのVMメモリを2GBから3GBへ増やしたら5.4と5.5でもビルドできた。 (edited)
Avatar
Kishikawa Katsumi 12/30/2021 5:46 AM
Oracle Cloud Infrastructureの無料で使える範囲がすごくて ARM CPUが4コアと24 GBメモリまで、AMDのCPUで1 GBメモリが2台まで、さらにブロックボリュームが200 GBも使えるのでSwift自体をビルドすることも可能だった。 https://www.oracle.com/jp/cloud/free/#always-free (edited)
Oracle Cloud Always Free Tierにサインアップすると、さらに多くのサービスに使用できる、30日間トライアルを対象とした300ドルの無料クレジットが提供されます。
Avatar
後発ゆえ囲い込みが大変?
Avatar
Kishikawa Katsumi 12/30/2021 5:48 AM
そうなのか。大変だ。
5:49 AM
Ingress/Egressの扱いが他とちょっと違うとか全体のダッシュボードみたいなのがなくて最初ちょっと迷うみたいな慣れは必要だけどおおむね使いやすいです。UI的な使い勝手はAzureより上。
5:51 AM
READMEに従ってSwiftを utils/build-script --release-debuginfo --test --skip-early-swift-driver でビルドしてテスト実行まで含めてピッタリ2時間半ってところ。ARM CPUの4コアと24 GBメモリのマシン。
Avatar
debuginfo付けてビルドできるのはすごい!
Avatar
Kishikawa Katsumi 12/30/2021 5:52 AM
そうだよね。
5:53 AM
70GBくらいの成果物になるからブロックボリュームのアタッチは必須だけどWeb UIですぐだった。なんせ200GB使えるし。
5:54 AM
確かにざっと調べた感じ後発だから価格はがんばってる、みたいなことが書かれてた。
6:01 AM
このUTC 3:00-5:30がSwiftのビルド。CPUは使い切ってるけどメモリはだいぶ余裕があるかな。一番高いところで15%だから4GB弱か。そこらへんのVPCじゃ難しいな。
Avatar
30日間無料と、ずっと無料の範囲がよくわからなかった
Avatar
Kishikawa Katsumi 12/30/2021 6:37 AM
30日間無料はおそらくサインアップしたら付与される¥33,000ぶんのクレジットのことだと思います。
6:40 AM
https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm もうちょっと詳しいドキュメントはこれかな。30日間無料についてはよくわかってないです。
Avatar
ありがとうございます。 おお、なかなかに太っ腹な感じ。
6:48 AM
というか、信じられないほど豪華?
Avatar
Kishikawa Katsumi 12/30/2021 6:48 AM
OCIの無料枠がすごいっていうのはOCIについて調べてたらちょいちょい目にしたのですごいんだと思います。
6:50 AM
ARMアーキテクチャのSwiftイメージでVaporのWebサービスも動きました。たぶんVPC4つぶんとして使ってもいいんだと思うんですよね。
Avatar
omochimetaru 1/16/2022 9:55 AM
swift:5.5.2-focal で、最適化バグで、実行ファイルが該当箇所でコアダンプ吐いてクラッシュする症状に出会いました。 しかも、その箇所 + 5.5.2 の組み合わせは過去に動いていて、 新規に追加した別のコードが、間接的に?なんらかの影響をその箇所に与えていたようです。 printを追加すると症状が消えたりしたので、 @_optmize(none) を付けて解決しました。 みなさんも気をつけて・・・
Avatar
macのdockerの5.5.2-focalでは解決したけどamazonlinuxのdockerの5.5.2-focalでは Vapor.StackTrace.capture がクラッシュしててだめだこりゃ
Avatar
5.5.2-focal, 5.5.1-focal, 5.5.0-focal, 5.5.2-bionic で再現したのでおしまいです nightly-5.6-bionic に行くことにします
Avatar
レスポンスヘッダにnio-http2がサポートしてない奴があるとfatalErrorだったのがセキュリティイシューとして対応されたらしい https://twitter.com/lukasaoz/status/1492067005486309394?s=21
swift-nio-http2 1.19.2 has been released with three fixes for high severity denial of service issues. We recommend updating as soon as practical to remediate these issues. More details available from the release notes: https://t.co/au2XqazShv
10:34 AM
fuzzingで見つかったとのこと
Avatar
Motivation: We don&#39;t currently support ALTSVC and ORIGIN frames. At the moment when receiving or attempting to write these frames we trap. Trapping when receiving an unsupported frame can ...
12:23 PM
TODOでfatalErrorw
Avatar
norio_nomura 2/12/2022 7:14 AM
macOS版のDEVELOPMENT-SNAPSHOTはインストール先のディレクトリ名を見ればいつのものかわかるけど、Docker版はswift -versionに含まれるハッシュを元にリポジトリを検索しないとわからない。そのためにSwiftボットはGitHubのGraphQL APIを使ってタグを取得してたのだけど、その仕組みをGitHub CLI extensionとして独立させた。 https://github.com/norio-nomura/gh-query-tags (edited)
GitHub CLI extension to query the GitHub repository and print out the tags. - GitHub - norio-nomura/gh-query-tags: GitHub CLI extension to query the GitHub repository and print out the tags.
👏 1
Avatar
norio_nomura 2/12/2022 7:26 AM
一応、apple/swift以外でも使えるように汎用性を持たせたけど、apple/swift関連以外でスナップショットにタグを付けて運用しているリポジトリを見つけられなかったので、事実上apple/swift関連専用。
Avatar
norio_nomura 7/12/2022 1:02 AM
久しぶりにSwiftLintをLinux on Dockerでビルドしてたのだけど、swift:focalだと動くのにswift:bionicだとswiftlint versionすら動かない。 $ docker run -it --rm -v $(pwd):$(pwd) -w$(pwd) swiftlint:bionic swiftlint version free(): invalid pointer
1:03 AM
swift:latestbionicなんだけど、focalを使った方が良いのかな。
Avatar
FileManager.DirectoryEnumerationOptions.producesRelativePathURLs という欲しかったものがあることに気がついて使ったが、Linuxに実装されてなかった。。
t_aruaru 1
Avatar
Linux 向けのマクロサポートはここで進んでそうですね. https://github.com/apple/swift/pull/68082
For compiling codes required for macro support, we now need swiftc compiler in the build machine. Unlike Darwin OSes, where swiftCore runtime is guaranteed to be present in /usr/lib, Linux doesn&#3...
Avatar
omochimetaru 8/27/2023 6:55 PM
りんたろーさんがやってるんや😃
Avatar
そういえばここで rintaro さんが書いてるみたいに 9 月以降の nightly ツールチェーンだと Linux でもマクロのビルドが普通に成功するようになっていました. https://forums.swift.org/t/are-macros-supported-on-linux-yet/65427/22
From Swift.org - Download Swift, I downloaded swift-DEVELOPMENT-SNAPSHOT-2023-09-01-a-ubuntu20.04-aarch64.tar.gz , cloned swift-syntax repo, applied this patch diff --git a/Examples/Package.swift b/Examples/Package.swift index f10a7c4a..821d3939 100644 --- a/Examples/Package.swift +++ b/Examples/Package.swift @@ -62,7 +62,7 @@ let package = Pac...
Avatar
norio_nomura 1/30/2024 5:35 AM
Docker Desktopで--platform=linux/amd64を付けて実行した時に/proc/self/cmdlineの内容がバグってて、 $ docker run --platform=linux/arm64 alpine cat /proc/self/cmdline|xargs -0 echo cat /proc/self/cmdline $ docker run --platform=linux/amd64 alpine cat /proc/self/cmdline|xargs -0 echo /bin/cat cat /proc/self/cmdline CommandLine.argumentsの取得にそれを利用してるSwift製のバイナリはその影響を受けるので、swift buildとか動かない。 $ docker run -it -v $PWD:$PWD:rw -w $PWD --platform=linux/amd64 swift swift build error: Unexpected argument '/usr/bin/swift-build' Usage: swift build <options> See 'build -help' for more information. 正規の手順(argc,argv)?を使ってる場合、影響を受けない。 https://lima-vm.io で立ち上げたdockerだと/proc/self/cmdlineの内容は少しおかしいけど、SwiftのCommandLine.argumentsは影響を受けない。 $ docker.lima run --platform=linux/arm64 alpine cat /proc/self/cmdline|xargs -0 echo cat /proc/self/cmdline $ docker.lima run --platform=linux/amd64 alpine cat /proc/self/cmdline|xargs -0 echo /bin/cat /proc/self/cmdline
5:38 AM
issueは上がってるけど未解決のままcloseされてる。 https://github.com/docker/for-mac/issues/7058 (edited)
Description After updating to Docker Desktop for Mac 4.25.0, Ubuntu 22.04 images running under Rosetta 2 emulation began to show corrupted /proc/<pid>/cmdline contents. Specifically, the actu...
Avatar
omochimetaru 1/30/2024 6:41 AM
gwynneさんだ
Avatar
/proc/self/cmdline じゃなくてcrt0がくれるargvをコンパイラが吐くエントリポイントで保存しておくのが良いのかなぁ。
Avatar
norio_nomura 2/5/2024 11:56 AM
Rosetta in Linux guestについて調べてたら修正方法がわかったのでコメントした。 https://github.com/docker/for-mac/issues/7058#issuecomment-1926820688
👀 1
11:58 AM
Docker DesktopのVMへのRosetta登録方法が間違ってるのだと思う。
Avatar
norio_nomura 2/5/2024 2:07 PM
docker buildx build --platform linux/amd64,linux/arm64は、Rosetta入りのlimaでもamd64がqemuになってめっちゃ遅かったけど、Docker DesktopだとちゃんとRosettaで動いて速い。
Avatar
norio_nomura 2/6/2024 3:24 AM
Docker Desktop for MacのRosetta登録を修正するためのイメージを作った。 $ docker run --privileged ghcr.io/norio-nomura/re-register-rosetta Rosetta is not correctly registered. Re-registering rosetta... Successfully re-registered Rosetta. $ docker run --privileged ghcr.io/norio-nomura/re-register-rosetta It looks like Rosetta is correctly registered. (edited)
Avatar
Kishikawa Katsumi 2/6/2024 3:52 AM
これが解決するのはすばらしいな。Swiftを含むイメージをローカル環境で動作確認するのがすごい難しかった。
3:52 AM
しょうがないからLinuxマシンでやってた。
Avatar
norio_nomura 2/6/2024 7:37 AM
Docker Desktop for MacがResource Saver modeに入るだけでre-register-rosettaでの修正が元に戻ってしまうので、やっぱり元から直して欲しいです。
😢 1
Avatar
lima+vz.framework+rosettaのcolimaでもrosettaちゃんとうごかないんですかね
5:09 PM
docker for desktop にこだわる理由はなさそう?
Avatar
norio_nomura 2/6/2024 9:45 PM
lima+vz +rosettaはSwiftちゃんと動きます。multi archイメージを作らないなら、それで十分。
Avatar
norio_nomura 2/6/2024 11:46 PM
limaへ移る理由になった不具合を直せる方法が分かったから、伝えたくなっただけ。issueでは反応無いけど。
👀 1
Avatar
なるほ
Avatar
norio_nomura 2/13/2024 9:38 PM
I don't think this is really a Docker bug.
とか返事が来てがっかり。 https://github.com/docker/for-mac/issues/7058#issuecomment-1942042116
Description After updating to Docker Desktop for Mac 4.25.0, Ubuntu 22.04 images running under Rosetta 2 emulation began to show corrupted /proc/<pid>/cmdline contents. Specifically, the actu...
😢 2
Avatar
返事してくれたのはAppleの人だった。そして調べてくれてるぽい。
Avatar
お、Alastairさんだ
Avatar
omochimetaru 2/14/2024 1:57 PM
Instead of reading from /proc/self/cmdline, take advantage of the fact that the initial stack layout is ABI specified, and that we already have a pointer into it (environ). This lets us walk up th...
1:57 PM
swift側で対応作業が生えてる
2:00 PM
何これ・・・
2:00 PM
スタックポインタを登っていってmainのargc, argvを触る・・・?
Avatar
わははLinux ABIベタベタだ
Avatar
omochimetaru 2/14/2024 2:02 PM
登っていくわけじゃないな、環境変数定義が入ってるポインタを起点にメモリレイアウトを読むのか (edited)
2:03 PM
キモすぎるなんだこれ
2:05 PM
c++ ArgvGrabber::ArgvGrabber() : argv(nullptr), argc(0) { findArgv(findStack()); }
2:08 PM
/proc/self/maps から sscanf(line, "%p-%p", &base, &top) でスタックトップを取ってるけど、これは保険のチェック用っぽいな
2:11 PM
argc側じゃなくてargv側から攻めてるのかこれw
2:12 PM
ポインタの差し先で、文字列かargcか判別しとる
2:14 PM
コマンドライン引数が1000万個ぐらいあったらargcがデカくなってargvに見間違えたりしないのかな
Avatar
動きが早くてすごいけどこれが正しい解決法なのか・・・?
2:37 PM
家庭くんのコメントと返信読んだけどプロセスの起動まわりについて各プラットフォームの違いを熟知してないといけなくてむずそうだ
Avatar
Swift製のライブラリを非Swiftプログラムに対して提供することを考えると任意のタイミングでargvを提供してくれるシステムコールが無いLinuxがびみょうという気持ちになってきた
Avatar
(mainからargc/vを拾うことが)RustとかができててSwiftでできないのは、
Swift製のライブラリを非Swiftプログラムに対して提供することを考える
このユースケースが想定されているからですか?
Avatar
ですね。RustでもLinux + glibcのケースではそのユースケースもglibc拡張を利用してサポートしてるんですが、任意のLinux環境(Linux + muslとか)ではサポートしきれてないです
Avatar
なるほど。
Avatar
これは珍しくLinuxだけが機能足りてないケースだなぁ
2:42 PM
大抵WindowsかWASIが足りてないのに 😇
😲 2
Avatar
このへんの説明を聞くと初見でびっくりしたこの方針に妥当感が得られて高速に学びを得られました
Avatar
omochimetaru 2/14/2024 3:12 PM
あ〜〜そうか、main関数に手を入れられるのはmainバイナリを作るコンパイラ一個だけなのか
Avatar
omochimetaru 2/14/2024 3:23 PM
そもそもプロセスパラメータじゃなくてエントリポイントの引数なんだから、main関数を掌握した人が任意に分配したパラメータを持たない限り、ライブラリからは見えない、みたいな世界観の方が統治されてて良さそうだけど
3:24 PM
ProcessInfo.arguments とか存在してるし、もうこれはプロセスでグローバルなものとして世の中回ってるって事やな (edited)
Avatar
ProcessInfo.arguments というか CommandLine.arguments ですねSwift自体が提供してるのは
Avatar
omochimetaru 2/14/2024 3:25 PM
あ、そっちだった。
3:25 PM
ProcessInfoはFoundationか。
Avatar
Avatar
Yuta Saito
これは珍しくLinuxだけが機能足りてないケースだなぁ
omochimetaru 2/14/2024 3:25 PM
/proc/<pid>/cmdline が、その機能じゃないの?
3:26 PM
API関数じゃなくてFile風ってだけで。
Avatar
まあそう見ることも出来るか
Avatar
Avatar
norio_nomura
返事してくれたのはAppleの人だった。そして調べてくれてるぽい。
norio_nomura 2/14/2024 9:38 PM
the Rosetta folksに聞いてくれてるみたい。
Avatar
Avatar
norio_nomura
docker buildx build --platform linux/amd64,linux/arm64は、Rosetta入りのlimaでもamd64がqemuになってめっちゃ遅かったけど、Docker DesktopだとちゃんとRosettaで動いて速い。
Docker Desktop for Macの"Use containerd for pulling and store images"オプションに相当する設定をすれば、lima+vz+Rosettaなdockerでも --platform linux/amd64,linux/arm64 でRosettaが使われることが分かったので、Docker Desktopを使う理由はさらに減った。
Avatar
omochimetaru 4/15/2024 2:22 PM
Linuxのswift5.10はzipをuntarしようとして失敗するらしい 4/2 snapshotならちゃんと動いた
Avatar
🍒 #7312 Explanation: 4714ea9 introduced a regression where non-tarball SDKs could not be installed from a remote URL due to the wrong assumption that the downloaded file would always be a tarball...
Avatar
それまでは先に curl とかでダウンロードしてローカルの .artifactbundle.zip を指定すると展開成功しますよ. (edited)
naruhodo 1
Avatar
omochimetaru 4/15/2024 2:29 PM
家庭先生が直してたw
2:29 PM
これどっちのチャンネルがいいかわからんのだけど
2:30 PM
ubuntu22.04でswift 4/2 snapshotを使ってwasm 4/3 snapshotのsdk入れてビルドしようとしたら
2:30 PM
PackageDescription が見えないとか言い出した
2:31 PM
これは何か既知の情報ありますか
Avatar
なんだこれ。swiftlyで入れるの辞めたらどうなります?
2:31 PM
swiftlyのシンボリックリンクが悪さをしてると予想
Avatar
そうだと思います.(同じエラー経験済み)
🤝 1
Avatar
omochimetaru 4/15/2024 2:32 PM
swiftlyで入れるのをやめたらubuntuホストのデフォルトのSwiftになっちゃうからexperimental sdkが取り込めないと思う
Avatar
Avatar
kebo
そうだと思います.(同じエラー経験済み)
omochimetaru 4/15/2024 2:32 PM
お。どうやって回避しました?
Avatar
ん、普通にtar.gzツールチェインをswift.org/downloadsからダウンロードして展開したらいいですよ
Avatar
PATH で export PATH=$HOME/.local/share/swiftly/toolchains/バージョン/usr/bin:$PATH を指定して何とか凌いでますw
Avatar
Avatar
Yuta Saito
ん、普通にtar.gzツールチェインをswift.org/downloadsからダウンロードして展開したらいいですよ
omochimetaru 4/15/2024 2:33 PM
あ、なるほど
Avatar
Avatar
kebo
PATH で export PATH=$HOME/.local/share/swiftly/toolchains/バージョン/usr/bin:$PATH を指定して何とか凌いでますw
omochimetaru 4/15/2024 2:34 PM
あ〜 shim経由じゃなくてインストールされた実体を先に発見させるんですね。
2:34 PM
なるほどなるほど・・・
Avatar
僕は単に諦めて5.9使ってます
Avatar
update させるたびに書き換えないといけないから早く何とかしたいんですよね... 一応 Swift 6 リリースまで待っても apple/swift 側でどうにかならない場合は swiftly 側で対処するかどうするかみたいな話はありましたが... https://github.com/swift-server/swiftly/issues/52#issuecomment-1943012509
The design document says: The ~/.local/bin directory would include symlinks pointing to the bin directory of the "active" toolchain, if any. This is all very similar to how rustup does th...
Avatar
Avatar
Iceman
僕は単に諦めて5.9使ってます
omochimetaru 4/15/2024 2:36 PM
4/2からWASM対応がネイティブ化してて、その対応でコマンドとかが変わってくるから、新しい方に寄せたい
Avatar
Avatar
kebo
update させるたびに書き換えないといけないから早く何とかしたいんですよね... 一応 Swift 6 リリースまで待っても apple/swift 側でどうにかならない場合は swiftly 側で対処するかどうするかみたいな話はありましたが... https://github.com/swift-server/swiftly/issues/52#issuecomment-1943012509
omochimetaru 4/15/2024 2:37 PM
全て踏破済みですごいな
Avatar
これはswiftlyで直すべきだと思うんだよな
Avatar
omochimetaru 4/15/2024 2:38 PM
サーバーサイドLinuxのCIでやってる時はswiftlyからswift buildしても問題ないんだけどな (edited)
Avatar
いや,Swift 6.0 以降は問題あるはずですよ.swift-driver が新しくなってそれがシンボリックリンク経由だと問題を起こすので.
Avatar
swiftlyが他と違うインストールレイアウトをするメリットは多分無くて、単純にバリエーションを増やして問題をややこしくしてるだけだと思う。 気持ちの余裕があればswiftly側直すんだけど… (edited)
Avatar
swiftlyそんな問題あったんですね
Avatar
Avatar
kebo
いや,Swift 6.0 以降は問題あるはずですよ.swift-driver が新しくなってそれがシンボリックリンク経由だと問題を起こすので.
omochimetaru 4/15/2024 2:42 PM
あっ、そういう話か。新しいswift + swiftlyの組み合わせの問題なんですね。
t_desudesu 1
2:43 PM
そんな〜〜
2:43 PM
setup-swiftに疲れて乗り換えたのにな〜
Avatar
なので -Xswiftc -disallow-use-new-driver を渡すとある程度の部分までは動きました (1 月くらいに確認した時点では) (edited)
👀 1
Avatar
ちなみに SSWG の Adam さんは新しい swift-driver は古いやつの完全互換品だから今までできたことができなくなったらそれは Swift 本体のバグだからそっちで直すべきって言ってました. https://github.com/swift-server/swiftly/issues/92#issuecomment-1892735163
The current main-snapshot toolchain uses the new swift-driver and it doesn't seem to work with symlinks. $ swiftly install main-snapshot ... $ swiftly list Installed release toolchains --------...
Avatar
はい。。まあそういうスタンスなので難しい。気持ちの余裕というのは彼とPatrickを説得する余裕というかなんというか。 (edited)
Avatar
やっぱりやるとしたらそこからですよね... (私も PR 出そうか迷ってこんな変更をいきなり上げたところでコンセンサスとってないと厄介に思われるだけだなと思って辞めちゃいました)
🥲 1
Avatar
omochimetaru 4/15/2024 3:02 PM
なるほど。(new)swift-driverの問題という理屈はそうだなあ。 (edited)
Avatar
元の話に戻ると,CI で常に最新の nightly のツールチェーンが使われるようにしたいというのであれば,swiftlang/swift イメージを使うのが現状は楽な気がしますね. ただ Swift SDK を使う場合は Swift SDK とツールチェーンのコミットハッシュを一致させるために Docker イメージの SHA256 ハッシュを明示する必要が出てきてしまって,その履歴がどこにもないから 1 日前のツールチェーンじゃないと最新の Swift SDK と一致しないみたいな場合の追従が大変なんですよね... 今は暇さえあれば docker image pull してコンテナ内のツールチェーンのバージョンとイメージのハッシュをメモして力技で何とかしてました.(自動化できそう)
👀 1
Avatar
Avatar
Yuta Saito
ん、普通にtar.gzツールチェインをswift.org/downloadsからダウンロードして展開したらいいですよ
omochimetaru 4/15/2024 3:40 PM
めちゃくちゃ沼ったけどやっとこれできた
Avatar
楽しいCI沼
Avatar
確かにカスタムイメージ作りたいとかがなければ結局ハッシュを固定するならそれが素直かもですね
Avatar
omochimetaru 4/15/2024 3:45 PM
tarを解凍したら usr/ が出てくるのだと思ったら swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a-ubuntu22.04/ が出てきた。
Avatar
そこで--strip-components=1
Avatar
omochimetaru 4/15/2024 3:46 PM
こんなのがあるのか〜
Avatar
Avatar
kebo
なので -Xswiftc -disallow-use-new-driver を渡すとある程度の部分までは動きました (1 月くらいに確認した時点では) (edited)
そういえば swift コマンドの代わりに古い swift-driver で動いてくれる swift-legacy-driver コマンドがあったのを忘れてました.これが廃止されるまでは swiftly でインストールした場合はこっちでも何とかなりますね.(e.g. swift-legacy-driver build, swift-legacy-driver experimental-sdk install) (edited)
Avatar
Avatar
kebo
ちなみに SSWG の Adam さんは新しい swift-driver は古いやつの完全互換品だから今までできたことができなくなったらそれは Swift 本体のバグだからそっちで直すべきって言ってました. https://github.com/swift-server/swiftly/issues/92#issuecomment-1892735163
swiftly でインストールした swift が使えない問題,6.0 に cherry-pick されるかはまだわからないですが,main では修正されたかもしれないです. https://github.com/apple/swift-driver/pull/1583
Avatar
おお、やったあ。
Avatar
↑6.0 にも cherry-pick きました https://github.com/apple/swift-driver/pull/1606 (edited)
Avatar
norio_nomura 6/9/2024 5:04 AM
Swiftコンパイラと成果物がlinuxのQEMUでクラッシュする件 https://discord.com/channels/291054398077927425/291054454793306112/1248559139173433414 M2 MacBook Proのlimaで動かしたQEMUのarm64エミュレーションdocker環境でクラッシュしなかった。x86_64マシンでないと再現しないのかな。 (edited)
Avatar
Linux x86_64 と Linux aarch64 でビルドした成果物を QEMU 8.X や 9.0 aarch64 で動かすのなら普段やってますが,クラッシュしたことはないですね.Embedded Swift なので特殊かもしれないですが.
Avatar
norio_nomura 6/9/2024 8:38 AM
もしかして、GitHub Actions Runner特有なのかな?
Avatar
norio_nomura 6/9/2024 1:31 PM
GitHub Actions Runnerで使ってるsetup-qemu-actionとsetup-buildx-actionの動作をなぞって、M2 MacBook Proのlimaで動かしたQEMUのarm64 dockerでのx86_64エミュレーションでクラッシュが再現した。
👀 1
1:34 PM
limaでQEMUのx86_64エミュレーションdockerを作ってx86_64バイナリを動かす場合はクラッシュしない。 (edited)
1:35 PM
CPUアーキテクチャに関係なく、binfmtに登録されたQEMUエミュレータ下で動く場合にクラッシュしてる感じ。 (edited)
Avatar
例の /proc/self/cmdline 依存だったコマンド引数取得をスタックスキャンするようにしたところですかねぇ
1:56 PM
さすがにスタックレイアウトのエミュレーションが間違ってたらSwift以外にも広範囲に壊れそうですが
Avatar
norio_nomura 6/9/2024 2:00 PM
やっぱりそこが怪しいよね。
2:01 PM
再現手順をまとめるかな。
Avatar
使ってらっしゃるイメージってこちらですよね?latest は QEMU v7.0 みたいなので,仮に QEMU の問題だとしたらもう修正済みでバージョンを上げるだけで治ったりするかもしれないですね.最近 9.0 がリリースしました.
Avatar
qemuのリリースまで追ってるんですか。すごい 😮
Avatar
swift_os (Embedded Swift で書いてる OS の卵みたいな repo) で (実機があるので) Raspberry Pi 4 向けに開発したいなと思った時に QEMU だと 9.0 からしか -M raspi4b が使えないのでたまたまリリースを待ち侘びてました. (edited)
😂 1
2:09 PM
とりあえず tonistiigi/binfmt には QEMU v8.1 くらいまでのタグは push されているようなので,そこまでのバージョンなら試そうと思えばそんなに手間はかからないと思います. (edited)
Avatar
norio_nomura 6/9/2024 2:17 PM
GitHub Actionでtonistiigi/binfmt:qemu-v8.1.5を試してみてます。
2:20 PM
あ、ローカルで再現した際のQEMUが9.0.0だ。
t_naruhodo 1
Avatar
Avatar
norio_nomura
GitHub Actionでtonistiigi/binfmt:qemu-v8.1.5を試してみてます。
norio_nomura 6/9/2024 11:39 PM
これは、apt-getで失敗して件のクラッシュまで辿りつけない、という結果になりました。
Avatar
Avatar
norio_nomura
再現手順をまとめるかな。
norio_nomura 6/10/2024 8:19 AM
成果物のクラッシュがローカルで再現しなくなってしまった。そしてQEMU絡みのswiftのクラッシュを見つけてしまった。
Avatar
Avatar
norio_nomura
成果物のクラッシュがローカルで再現しなくなってしまった。そしてQEMU絡みのswiftのクラッシュを見つけてしまった。
6.0とmainで直ってた。
Avatar
norio_nomura 6/11/2024 6:36 AM
macOS -> ubuntuのクロスコンパイルで--static-swift-stdlibをつけるとリンクエラーになる件、/usr/lib/swift_static/CoreFoundation/module.modulemap/usr/lib/swift_static/dispatch/module.modulemapで指定されているライブラリがリンカへ渡されていないからみたい。
6:37 AM
swift-autolink-extractの担当かな?
Avatar
Swiftのバージョンいくつですか?
Avatar
norio_nomura 6/11/2024 6:48 AM
SDKに入ってるのはswift-5.10.1-RELEASEで、--swift-sdkを受け取ってるのはmainの20240604です。
6:52 AM
うまくいくubuntu上でのクロスコンパイルログと見比べると、最後のld.lldへのオプションに-lDispatchStubsとかが現れるので、それのレスポンスファイルを作成に関わってそうな5.10.1のclangswift-autolink-extractが怪しいのかなと。
6:53 AM
レスポンスファイルの中身を見たいけど、終了時に削除させない方法がわからず。
Avatar
-save-tempsでその辺のファイル残しておけないですかね
Avatar
norio_nomura 6/11/2024 6:54 AM
そんなオプションが。
Avatar
omochimetaru 6/11/2024 7:01 AM
あーーーあったなあそれ、完全に忘れて、最近temp file消えて困ってた
Avatar
norio_nomura 6/11/2024 7:02 AM
-Xswiftc -save-tempsで残せました。ありがとうございます。 (edited)
Avatar
norio_nomura 6/11/2024 7:33 AM
やっぱりswift-autolink-extractの出力が違ってた。
Avatar
あ、FoundationをimportせずにCoreFoundationを直接importしてたりしますか?
7:38 AM
CoreFoundationのmodulemapで指定されてるライブラリはautolinkエントリには追加していなくて、
7:38 AM
Foundation.swiftmoduleを作るときにそれらのライブラリを-public-autolink-library でFoundation.swiftmoduleのLINK_LIBRARYエントリとして登録しているので、
7:39 AM
それらのCoreFoundationの依存ライブラリのautolinkエントリがimport-siteに現れるのはFoundationをimportしたときだけなんですよね。
7:39 AM
CoreFoundationはAppleプラットフォーム外ではpublicなAPIではないということになっているので… (edited)
👀 1
Avatar
norio_nomura 6/11/2024 7:41 AM
$ diff -u cross-on-docker.autolink cross-on-mac.autolink --- cross-on-docker.autolink 2024-06-11 16:39:17 +++ cross-on-mac.autolink 2024-06-11 16:39:37 @@ -5,15 +5,12 @@ -lswiftGlibc -lBlocksRuntime -ldispatch --lDispatchStubs -lswiftDispatch --lCoreFoundation -lFoundation -lFoundationNetworking -lFoundationXML -lcurl -lxml2 --luuid -licui18nswift -licuucswift -licudataswift
7:42 AM
moudle.modulemapの定義として該当するのは、DispatchCoreFoundationですね。 (edited)
Avatar
Avatar
Yuta Saito
CoreFoundationはAppleプラットフォーム外ではpublicなAPIではないということになっているので… (edited)
norio_nomura 6/11/2024 7:43 AM
ということは明示的にリンカへオプションを渡すべきってこと?
Avatar
import Foundation であればリンカオプションなしでリンクできる…はず…
Avatar
norio_nomura 6/11/2024 7:45 AM
まあビルドしているのはSwiftLintなので、import Foundationはあると思う。
Avatar
であれば何かがおかしいなぁ
7:46 AM
もしかすると今朝直した問題が原因かもしれない。
Avatar
norio_nomura 6/11/2024 7:46 AM
swift-autolink-extractはswift-driverのお仕事なのかな。
Avatar
omochimetaru 6/11/2024 7:47 AM
private deps
Avatar
swift-autolink-extract はフロントエンドのお仕事ですね
7:49 AM
でもFoundationはswiftinterface無いから今朝のやつとは関係ないか
Avatar
norio_nomura 6/11/2024 7:50 AM
今のビルド条件だとswift-autolink-extractは5.10.1のやつが使われてるぽいから、mainで直っても恩恵を受けるのは当分先ですよね。
Avatar
そうですねぇ
Avatar
norio_nomura 6/11/2024 8:01 AM
これ、swift-sdkのswift.xctoolchain/usr/lib/swift_static/linux/static-stdlib-args.lnk-lDispatchStubs -lCoreFoundation -luuidを追加することで--static-swift-stdlibでのビルドが通るようになりました。 (edited)
naruhodo 1
8:03 AM
swift-sdk-generatorの成果物に対して、さらに$ cd ubuntu-jammy.sdk/usr/lib; ln -sf aarch64-linux-gnu/ld-linux-aarch64.so.1と合わせて2箇所の修正が必要でした。 (edited)
8:04 AM
GitHub Actionsで再現してみます。
8:06 AM
あいや、手元で作成したswift-sdkがdockerイメージを元にしてるから、M1 runnerで作れないぞ。
👀 1
8:08 AM
swift-sdk-generatorのubuntuパッケージダウンロードが不安定すぎて使いたくない。
8:12 AM
ubuntu runnerでswift-sdkを作って、M1 runnerへswift-sdkをインストールしてubuntu向けバイナリをビルドして、それをubuntuへインストールしてdockerイメージを作るのか? やっぱり、ubuntuでx86_64->aarch64クロスビルドして作ったバイナリでいいのでは。
Avatar
omochimetaru 6/11/2024 8:17 AM
sdkを作る工程も自分でやろうとするとmacを経由する意味が薄そうですね
Avatar
norio_nomura 6/11/2024 8:17 AM
あ、公式からダウンロードできるんだっけ?
Avatar
omochimetaru 6/11/2024 8:19 AM
コンパイラダウンロードの下にsdkのダウンロードリンクもありました (edited)
Avatar
norio_nomura 6/11/2024 8:20 AM
mainと6.0のSDKが提供されてるのね。 https://www.swift.org/install/linux/ubuntu/22_04/#latest
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
norio_nomura 6/11/2024 8:27 AM
まあ、どちらで作っても、aarch64ビルド成果物のGitHub Actionsでの動作確認はarm64 linux runnerが来るまでは出来ない。
8:27 AM
問題が出るとわかってるQEMUでの動作を検知したら警告するか。 (edited)
Avatar
qemu-user-static検出に使おうと思ってたpmapswiftlint同様にqemu-user-static環境でクラッシュする。
Avatar
クラッシュするのはQEMU 9.0.0で直ったバグらしい。 https://gitlab.com/qemu-project/qemu/-/issues/2168
Host environment Operating system: Gentoo OS/kernel version: 6.6.13-gentoo-dist Architecture: ARM64 QEMU flavor: qemu-x86_64 QEMU version:...
Avatar
norio_nomura 6/12/2024 1:01 AM
ローカルのdockerに入ってるQEMUを、ソースからビルドして9.0.1にしたらクラッシュしなくなった。
Avatar
いろいろ試して、結局ubuntu-latestのjammyでapt-get install qemu-user-staticして入る6.2を使ったら、11回中3回クラッシュする感じになり、失敗したjobも再実行で通ったりして、とりあえずPRのビルドが全部通った。スッキリしない。 https://github.com/norio-nomura/docker-swiftlint/pull/37 (edited)
Avatar
norio_nomura 6/20/2024 1:41 AM
Musl使うにはソース変更が必要なのか。 https://www.swift.org/documentation/articles/static-linux-getting-started.html
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
norio_nomura 6/20/2024 9:50 AM
docker使ったクロスビルドで、キャッシュが残ったままだと2回目のビルドでautolink-extractが効かない現象に遭遇している気がする。
9:51 AM
似た話をこのサーバーで読んだ気がするけど、見つけられず。
Avatar
6.0系なら多分昨日のスナップショットで治ってると思います
2:17 PM
Explanation: Fixes inconsistent swiftmodule compilation issue revealed by recent explicit module improvements Scope: Only affects static-linking scenario Risk: Low; just save/restore an option that...
Avatar
norio_nomura 6/20/2024 3:22 PM
ありがとうございます。うーん、5.10.1なんですよね。nightly同梱のモノをシンボリックリンクして使えるか試してみようかな。
Avatar
うーん、もしかするとツールチェインに入ってる.swiftinterfaceにパッチを当てて欠けてるフラグを足せばなんとかなるかも…
Avatar
norio_nomura 6/20/2024 3:25 PM
ああ、swift-autolink-extractの問題ではなく、取り出す元が原因なのですね。
👉 1
3:30 PM
3:31 PM
足りないのを/usr/lib/swift_static/linux/static-stdlib-args.lnkに記述する方法
Avatar
問題が顕在化するのはstatic-stdlibの時だけなのでそれでも十分なはず…!
Avatar
少し調べてみましたが、.swiftinterfaceにパッチを当てる方法って、FoundationとCoreFoundationの問題には使えない気がする。
11:45 PM
あと、リンクエラーが出るようになったのは、昨日swiftlang/swift:nightlyのdockerイメージ更新されてからで、2回目のビルドとか関係なかったみたい。 (edited)
Avatar
norio_nomura 6/21/2024 1:33 AM
ホストSwift 6.0でswift build --swift-sdkしてターゲットSwift 5.10のツールチェインを起動して、ホストとターゲットのtripleが同じ時、ホスト用にビルドされる.oとターゲット用にビルドされる.oって、混ざったりしないのかな。 (edited)
Avatar
norio_nomura 6/21/2024 1:53 AM
ホスト向けビルド: .build/aarch64-unknown-linux-gnu/release/SwiftLintExtraRules-tool.build ターゲット向けビルド: .build/aarch64-unknown-linux-gnu/release/SwiftLintExtraRules.build みたいな感じで混ざらないらしい。
1:56 AM
そしてリンクに失敗するとき、ターゲットの最終成果物をリンクする際にホスト向けビルドの.oを渡していることが判明。失敗して当然だ。 (edited)
Avatar
norio_nomura 6/21/2024 7:28 AM
リンク成功と失敗で.build/aarch64-unknown-linux-gnu/release/description.jsonを比較してみたところ、swiftlintっていうモジュールが最終ターゲット用とプラグイン用で2つ作られていて失敗する方は中身が入れ替わってた。 それに合わせて、.build/release.yamlに記述されるswiftlint.product/Objects.LinkFileListの中身もプラグイン用にビルドされたものが渡されて、結果リンクが失敗するぽい。
7:28 AM
リンク成功と失敗は完全にランダム。
👀 1
Avatar
ありそうなバグだあ
Avatar
norio_nomura 6/21/2024 7:51 AM
これは多分、先日のmacOS -> ubuntuのクロスコンパイルでのリンクエラーでも起きていたのではないかと思う。
Avatar
https://github.com/apple/swift-package-manager/issues/7471 これで治ってるかもしれないがメインブランチにしかまだ入ってない…
Avatar
norio_nomura 6/21/2024 7:55 AM
おー、今はnightly-6.0-jammyでやってました。 (edited)
7:56 AM
nightlyでも確認してみます。
7:57 AM
とりあえず、Package.swiftからプラグインのモジュール定義を外したらリンク通ることは確認した。
Avatar
Avatar
Yuta Saito
https://github.com/apple/swift-package-manager/issues/7471 これで治ってるかもしれないがメインブランチにしかまだ入ってない…
norio_nomura 6/21/2024 7:59 AM
あー、今試してるのホストとターゲットでtriple同じだ。
Avatar
ありゃ。ホストとターゲット同じでもリンク失敗するのか
Avatar
norio_nomura 6/21/2024 8:05 AM
nightlyで直ってないです。
Avatar
なるほど… SwiftPMのリポジトリの方にレポートいただけると 🙏
Avatar
norio_nomura 6/21/2024 8:07 AM
🙏 1
Avatar
norio_nomura 6/21/2024 8:14 AM
あー、そのままだと/SwiftLint/.buildが残らないので、残せるように修正します。
Avatar
norio_nomura 6/21/2024 8:33 AM
更新した。 How to reproduce random link error: # repeat following until link error occurs docker buildx build --load builder/ --build-arg BUILDER_IMAGE=swiftlang/swift:nightly -t swiftlint:try --target native-builder --no-cache-filter native-builder --progress plain # if link error occurs, keep image with tag docker tag swiftlint:try swiftlint:link-error How to extract /SwiftLint/.build to link-error directory: mkdir -p link-error; docker run --rm swiftlint:link-error tar czO -C /SwiftLint .build | tar xzvf - -C link-error (edited)
8:37 AM
リンクエラーはaarch64-on-aarch64, x86_64-on-x86_64でランダムで起き、aarch64-on-x86_64, x86_64-on-aarch64では起きません。 (edited)
Avatar
norio_nomura 6/21/2024 8:48 AM
とりあえず報告とかするには、もっと最低限な再現環境を作るべきかな。
Avatar
とりあえず手元で試してみてるけど全然ビルドが終わらない 😂
Avatar
norio_nomura 6/21/2024 8:50 AM
CIで再現までに14m58sとかかかってます。
👀 1
8:52 AM
キャッシュが効いてそれだから、swiftlang/swift:nightlyとswift:5.10ダウンロードとapt-getが入る初回はもっとかかる。
Avatar
norio_nomura 6/21/2024 9:37 AM
再現手順のdockerコマンドラインオプションに--target native-builderを追加。
9:38 AM
シンプルな再現手順が手元で作れたので、今からアップします。
Avatar
再現手順の説明を更新しました。

poc-module-name-conflict

How to reproduce random link error: # repeat following until link error occurs docker buildx build --load . -t poc-module-name-conflict:try --progress plain \ --target builder --no-cache-filter native-builder # after link error occurs, keep image with tag using --target native-builder docker buildx build --load . -t poc-module-name-conflict:try --progress plain \ --target native-builder # if link error occurs, keep image with tag docker tag poc-module-name-conflict:try poc-module-name-conflict:link-error How to extract /poc-module-name-conflict/.build to link-error directory: mkdir -p link-error; \ docker run --rm poc-module-name-conflict:link-error \ tar czO -C /poc-module-name-conflict .build | tar xzvf - -C link-error
(edited)
Avatar
久しぶりにmacOSでdocker起動したら --no-cache-filter が無いと怒られてしまった
Avatar
11:50 AM
lima使ってる。
Avatar
おーlima
11:52 AM
うーんDocker Desktopをアップデートしても出てこないや
11:52 AM
limaというのでやるか
11:55 AM
違いそうだdockerクライアントというやつをアップデートしないといけないのか
Avatar
僕のlima on dockerセットアップ 1. install lima brew install lima 2. if docker for mac is not installed, install docker cli brew install docker docker-buildx docker-completion 3. create docker instance limactl create https://gist.githubusercontent.com/norio-nomura/9f8d469252a13adf2efdc49af0a47a30/raw/a700cc7261f8e782fd0b7c5373ef1201b5158a0d/lima.yaml --tty=false --name docker 4. enable boot dokcer instance at login limactl start-at-login --enabled docker 5. create "lima-docker" context to use docker context create lima-docker --docker host=$(limactl list docker --format 'unix://{{.Dir}}/sock/docker.sock') 6. use "lima-docker" as default context docker context use lima-docker https://gist.github.com/norio-nomura/9f8d469252a13adf2efdc49af0a47a30 (edited)
Avatar
lima付属のtemplate://dockerに対し
  • containerd-snapshotterを有効にしてmulti arch build出来るように
  • buildkitを有効にして、docker builddocker buildx build
した環境となります。
(edited)
12:14 PM
Docker for MacはRosettaの設定がおかしいので、Swiftを動かすのに使うのはお勧めしません。
Avatar
ありがとうございますー とりあえず一個目のリンクエラーまでは再現できました
12:21 PM
おー取り出せた取り出せた
👍 1
Avatar
再現リポジトリで、リンクエラーが再現した.buildと正常にリンクできた.buildをCIのアーティファクトからダウンロード出来るように、明日以降するかもしれません。 (edited)
Avatar
dockerデバッグ難しいですねぇ
12:45 PM
--mount=type=bind,target=${BUNDLE_PATH}/${TARGET_TRIPLE_ARCH},from=runtime これを維持したままシェルを繋ぎたい
12:51 PM
5.10のコンパイラとmainのSwiftPMでやってるの怪しいなと思ったけどmain mainでも再現しますね
Avatar
これSwift SDKに関係なく再現するな
Avatar
norio_nomura 6/21/2024 1:30 PM
お、もっと簡単に再現できそう?
Avatar
norio_nomura 6/21/2024 1:38 PM
Swift SDKを使わない環境で起きても、入れ替わったモジュールの設定でも問題なく動いてしまうはずだから、気付けなさそう。
Avatar
とりあえずここまで小さくできました https://github.com/kateinoigakukun/swift-autolink-issue-repro
4:22 PM
10回くらいループ回すと再現する
Avatar
まずそうなところはわかったぞ
Avatar
Motivation: Given the following conditions: --static-swift-stdlib is enabled (it only affects "target" destination products, "host" destination products are always dynamic) the...
🙏 1
Avatar
なるほど、クロスじゃなくてもautolink-extractが効かなくてリンクエラーを起こすのか。そしてクロスじゃなければリンカオプションで回避可能なエラーだけだったと。
10:10 PM
そして今回、mainと5.10でマングルが違ったから、リンカオプションでは回避不能なエラーになってたと。
10:13 PM
過去にswiftlintでリンクエラーでオプション追加して回避してたのって、全部これが原因だったのでは。
Avatar
まだクロス特有の問題があるような気がするんですが一旦これ入れてみて様子見ですね
Avatar
omochimetaru 6/22/2024 4:02 AM
ほえー
4:03 AM
プラグインのビルドとターゲットのビルドでリンクリストファイルがぶつかってたのか
4:05 AM
分かれてるべきものが混ざる系のバグ、踏み抜くのがややこしくて難しいな
Avatar
本当はllbuildのマニフェスト作るときに重複したターゲット作ってたらアサーション失敗するべきで、大体のケースはアサーション入ってたんですけど今回のObjects.LinkFileListは漏れてて発見が遅れた。。。 (edited)
Avatar
omochimetaru 6/22/2024 4:09 AM
そのファイルなんか名前もキモいし悪い子の気配する
4:09 AM
ビルドフォルダ眺めてると浮いてる
Avatar
えーそうですか?まあレスポンスファイルだし存在が浮いてるのはそう
Avatar
omochimetaru 6/22/2024 4:11 AM
のりおさんの元の報告のパターンだと深淵すぎそうな雰囲気あったけどこれでも直せるなら、やっぱリビルドされない問題も再現つくろう・・・ (edited)
Avatar
SwiftPM結構なおせるようになってきた
Avatar
omochimetaru 6/22/2024 4:12 AM
たのもしい
Avatar
全然関係ないけどそういえばレスポンスファイルって何でレスポンスファイルって言うんだろう…
Avatar
Avatar
Yuta Saito
えーそうですか?まあレスポンスファイルだし存在が浮いてるのはそう
omochimetaru 6/22/2024 4:14 AM
理解してないけど、他のものはいろいろプレフィックスがついてるのに、こいつは固定の名前なの変な感じがする
Avatar
Windows compiler由来なんだな https://gcc.gnu.org/wiki/Response_Files
4:15 AM
これはリンク単位で一つあればいいのでProductごとにディレクトリ切った下でファイル名は固定でOK (edited)
Avatar
omochimetaru 6/22/2024 4:16 AM
ふむふむ
Avatar
norio_nomura 6/22/2024 5:12 AM
そういえば、SwiftPMのlinuxでの動作の疑問なのですが、SwiftLintに#if os(macOS)binaryTargetが定義されてるのだけど、linuxでもダウンロードされるのが気になってて。これって意図された動作なのかな。 https://github.com/realm/SwiftLint/blob/3e8a0516b248cfa4f51d7caa321c842013c42572/Package.swift#L166-L174
Avatar
norio_nomura 6/22/2024 5:19 AM
なるほど!気づきませんでした。
5:19 AM
ありがとうございます。
Avatar
Avatar
Yuta Saito
--mount=type=bind,target=${BUNDLE_PATH}/${TARGET_TRIPLE_ARCH},from=runtime これを維持したままシェルを繋ぎたい
norio_nomura 6/22/2024 5:29 AM
これ僕もやりたくて改めて調べてみましたが、出来なさそう。
5:30 AM
ホスト/コンテナどちらでもいいから、dockerイメージをマウントできる仕組みがあると色々便利そうなんだけどな。
Avatar
残念😢 dockerデバッグの道は険しい
Avatar
なんかこんな感じでどうですかね
Avatar
w
Avatar
norio_nomura 6/22/2024 6:07 AM
なるほどw
Avatar
ttyないからエディタとか使えなかった…… (頑張ればなんとかなりそうではある
Avatar
sshdを起動しよう
Avatar
norio_nomura 6/22/2024 8:36 AM
ああ、できた。
Avatar
ビルドセッションをsleepで止めて、そこへ別のコマンドで入る手順を追加した。 https://github.com/norio-nomura/poc-module-name-conflict
10:40 AM

How to enter docker building session:

Build with SLEEP=1 buildx build --load . --progress plain --build-arg SLEEP=1 Build session will hangs at sleep like following: #31 0.090 Enter the following command to enter build session: #31 0.090 lima user: #31 0.090 limactl shell docker bash -c 'sudo nsenter --all --target=$(lsns|awk "/^4026532477/{print \$4}") bash' #31 0.090 #31 0.090 Docker for Mac user: #31 0.090 docker run -it --privileged --pid=host --rm ubuntu bash -c 'nsenter --all --target=$(lsns|awk "/^4026532477/{print \$4}") bash' Copy and paste the command to enter build session. $ docker run -it --privileged --pid=host --rm ubuntu bash -c 'nsenter --all --target=$(lsns|awk "/^4026532477/{print \$4}") bash' ################################################################ # # # Swift Nightly Docker Image # # Tag: swift-DEVELOPMENT-SNAPSHOT-2024-06-13-a # # # ################################################################ root@buildkitsandbox:/#
(edited)
10:45 AM
簡単に言えばnsenter(1)を使う手法。
10:50 AM
limaのdockerはrootlessだからDocker for Macとは手順が違う。 $ limactl shell docker bash -c 'sudo nsenter --all --target=$(lsns|awk "/^4026532602/{print \$4}") bash' ################################################################ # # # Swift Nightly Docker Image # # Tag: swift-DEVELOPMENT-SNAPSHOT-2024-06-13-a # # # ################################################################ root@buildkitsandbox:/#
Avatar
Avatar
norio_nomura
ビルドセッションをsleepで止めて、そこへ別のコマンドで入る手順を追加した。 https://github.com/norio-nomura/poc-module-name-conflict
norio_nomura 6/23/2024 3:39 AM
該当箇所だけgistへ抜き出した。 https://gist.github.com/norio-nomura/edf224977880e6e7598e76b1330f2990 dockerが入っていれば直接ビルドして試せる。 docker buildx build https://gist.github.com/edf224977880e6e7598e76b1330f2990.git --build-arg SLEEP=1
How to attach a shell to a stage during docker buildx build - Dockerfile
Avatar
べんりー (edited)
Avatar
norio_nomura 6/23/2024 3:43 AM
dockerイメージやキャッシュをマウントして使える環境というのが便利かも?
3:46 AM
このアタッチしたシェルでの変更は、RUN --mount=type=cacheのターゲットディレクトリ内ならば、ビルドセッションを跨いでも維持されるのかな? (edited)
3:51 AM
維持された。 (edited)
Avatar
norio_nomura 6/26/2024 1:40 AM
次のスナップショットが出るのはいつだろう
Avatar
基本的に https://ci.swift.org/ のPackageジョブが緑になると出るので
Avatar
norio_nomura 6/26/2024 1:48 AM
https://ci.swift.org/job/oss-swift-package-trigger/ が全部成功したのって2ヶ月14日前らしいけど、もっと最近出てるから全部成功じゃなくても出る?
Avatar
最近追加されたやつは成功してなくても出る気がします
1:50 AM
Fedoraとか
Avatar
norio_nomura 6/26/2024 2:00 AM
なるほど。ありがとうございます。
Avatar
norio_nomura 7/2/2024 10:36 AM
swift-DEVELOPMENT-SNAPSHOT-2024-07-01-aキタ
Avatar
やったー
Avatar
norio_nomura 7/2/2024 11:35 AM
SwiftLintのクロスビルドで起きてたリンクエラーも、対策なしでリンクエラー起きなくなった。>2024-07-01a
Avatar
omochimetaru 7/2/2024 11:35 AM
おお
Avatar
ヨシ!
Avatar
norio_nomura 7/2/2024 12:31 PM
いや、リンクエラー起きた。
Avatar
norio_nomura 7/2/2024 12:54 PM
む、dockerイメージが更新されてなかった。
Avatar
swiftlang/swift のイメージであればツールチェーンのリリースとは独立して毎日決まった時間に更新されてる印象がありますね
Avatar
norio_nomura 7/2/2024 12:58 PM
ボットが更新されてたから勘違いしたけど、ボットは公式dockerイメージ使ってなかった。
Avatar
norio_nomura 7/2/2024 1:15 PM
スナップショットタグ作成から公式dockerイメージ更新までのタイムラグが気に入らなくて、RELEASE以外は.tar.gzをダウンロードして使うようにしてたの忘れてました。
1:47 PM
タグのタイミング関係なく18:00更新ぽい
Avatar
18時だとその日のスナップショットが作られる前? (edited)
1:57 PM
外から見てる範囲ではPDT 3:00pmくらいにその日のタグ打つコミットが決まって、PDT 0:00amにビルドが始まって2~3時間でビルドが終わってアップロード、というスケジュールに見える (edited)
Avatar
norio_nomura 7/2/2024 2:10 PM
ciのID的なのはaarch64だけど、ビルドしてるのはx86_64だった。
2:12 PM
あ、jammyとかはaarch64もビルドしてるか。
Avatar
ジョブのIDはaarch64だけど全部のプラットフォーム向けのイメージビルドしてるっぽいですね
2:14 PM
ホストマシンのアーキテクチャがaarch64なのかなと思ったけどamd64のbuildxインストールしてた
Avatar
norio_nomura 7/2/2024 2:16 PM
qemu-user-staticでaarch64のSwift製バイナリを動かすとクラッシュするのだけど、swift -versionしか実行してないから、引っかからないぽい。
Avatar
例のqemuのバグですか?
Avatar
norio_nomura 7/2/2024 2:19 PM
うん
Avatar
norio_nomura 7/3/2024 2:02 AM
自前でビルドしたswift-DEVELOPMENT-SNAPSHOT-2024-07-01-adockerイメージを使って、クロスビルド使った問題再現用プロジェクトのビルドでリンクエラーが起きなくなったことを確認した。
👀 1
Avatar
Avatar
norio_nomura
norio_nomura 7/3/2024 9:18 AM
CentOS 7のサーバーが落ちてるだけで、CentOS以外のDockerイメージビルドまで止まってしまうのは勘弁してほしい。
9:20 AM
Avatar
この CI のパイプラインってどこで定義されているんでしょうね?
Avatar
norio_nomura 7/3/2024 2:23 PM
とりあえずDockerfileが公開されているリポジトリには見当たりませんね。 https://github.com/swiftlang/swift-docker
t_desune 1
Avatar
Avatar
norio_nomura
qemu-user-staticでaarch64のSwift製バイナリを動かすとクラッシュするのだけど、swift -versionしか実行してないから、引っかからないぽい。
norio_nomura 7/3/2024 2:36 PM
ちょっと試しに ci.swift.org のDockerイメージ作成に使われているqemu-user-staticをGitHub Actionsでも使ってみたら、QEMUエミュレーションでaarch64なswiftlintが全くクラッシュしない! (edited)
2:37 PM
rootful dockerへdocker run --rm --privileged multiarch/qemu-user-static --reset -p yes使ってインストールする方法。 (edited)
2:40 PM
docker/setup-qemu-action、ubuntuやdebianからaptで配布されてるモノ、qemuのソース取得してビルドする、とか色々試してダメだったのに。
Avatar
norio_nomura 7/4/2024 3:00 AM
rootless dockerでも使うためにmultiarch/qemu-user-staticがインストールしているバージョンを調べたらdebian bookwormで使われてた7.2で、ubuntuでは使われていないバージョンだった。 ちなみにubuntuでのqemu-user-staticは focal: 4.2 jammy: 6.2 mantic: 8.0 noble: 8.2 で、僕が試してダメだったのは 6.2, 8.0, 8.2, 9.0.1(自前ビルド)
Avatar
norio_nomura 7/5/2024 6:57 AM
swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-02-aにリンクエラー対策パッチがチェリーピックされてて swiftlang/swift:nightly-6.0-jammy も更新されてたので、対策なしでリンクエラーが起きないことも確認した。
Avatar
norio_nomura 7/9/2024 12:55 PM
GitHub Actions Runner ubuntuにqemu-user-staticを、ubuntuパッケージ, debianパッケージ, tonistiigi/binfmt, multiarch/qemu-user-static の各バージョンをインストールして、arm64版swiftlintを2回動作確認で起動するDockerfileを10回ビルドし、クラッシュやハングアップしないかテストしてみた。 https://github.com/norio-nomura/compare-qemu-user-static/actions/runs/9856830637 (edited)
12:57 PM
ubuntu-22.04のデフォルト, tonistiigi/binfmt:latest はダメで、multiarch/qemu-user-static:latestは通る。
Avatar
norio_nomura 7/9/2024 1:38 PM
おおむね7.2.0以降は通ってるけど、新しめのバージョンはpthread周りでクラッシュするバグが9.0.1でなおったとかあるはずだから注意。
1:39 PM
個人的にはaarch64版Swiftツールチェインをaarch64エミュレーションで動かしSwiftLintのビルドを通せたdebian bookwormの7.2.0系が推し。
Avatar
norio_nomura 7/10/2024 6:58 AM
dockerイメージnorionomura/swiftlintにaarch64追加した。 そしてqemu-user-staticのバージョンによりクラッシュ回避する情報をforumへ投稿した。 https://forums.swift.org/t/swift-runtime-unable-to-suspend-thread-when-compiling-in-qemu/67676/20
To add an aarch64 image to the Docker image norionomura/swiftlint, I encountered an issue while creating an aarch64 executable using the x86_64 version of the Swift Toolchain on GitHub Actions' ubuntu-latest. The final verification step was to use aarch64 emulation with qemu-user-static, where the issue arose. This issue occurs not only with the...
👏 2
Avatar
Avatar
norio_nomura
CentOS 7のサーバーが落ちてるだけで、CentOS以外のDockerイメージビルドまで止まってしまうのは勘弁してほしい。
こっちの件も CentOS 7 のジョブが削除されて解決したっぽいですね. https://ci.swift.org/view/all/job/publish-nightly-main-docker-images-aarch64/
🙌 1
Avatar
Rosetta for LinuxのAOT Cachingってのを試してみたら、Cachingなしの時よりも遅くなった。使うための条件がなかなか厳しくて、色々工夫が必要だったのに残念。
Exported 1,092 message(s)
Timezone: UTC+0