-- 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
# 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 出力で実際の実行コマンド群が見えるのでそれをデバッガで見ていく感じです。$ utils/build-script -R --debug-swift
でビルドしてます。その場合は build-dir は ../build/Ninja-ReleaseAssert+swift-DebugAssert
ですね。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) ^ -- ********************
swift-DEVELOPMENT-SNAPSHOT-2017-05-09-a
のLinux版に libsourcekitdInProc.so
がもれなく入っていることを確認。NSDictionary
の比較がLinuxで正しく動いていないことを知って、ガッカリ https://github.com/jpsim/SourceKitten/issues/384JSONSerialization
によるJSON文字列作成結果がnondeterministicだったため、オブジェクト化して比較したのがあだになった。Foundation.TimeZone
が /usr/share/zoneinfo
の存在に依存していて、ubuntu だとデフォルトで存在しない場合があるからだった。 https://bugs.swift.org/browse/SR-4921NSArray
に Hashable
でない _ObjectBridgeable
な要素が入ってる時の比較がおかしかった。
swift-DEVELOPMENT-SNAPSHOT-2016-08-18-a
かららしい… (edited)swift/stdlib/public/SDK/(Dispatch|Foundation)/NS*
辺りはLinuxで使えない。 (edited)Dispatch
やFoundation
を実現するのがswift-corelibs-*
。Dispatch
やFoundation
のAPIは、swift
本体でテスト実行されるからまだいい。 (edited)swift
本体では使われていないObjective-Cを真似た機能を使おうとすると、それがテストされていないからmacOSの挙動と異なってたりする。 (edited)swift-corelibs-*
プロジェクトにはフルタイムで見てるAppleの開発者がいないらしくて、その辺り見過ごされて実装されていってしまってるぽい。init
でクラスのself
を置き換える手法を使うことで、swift-corelibs-foundationのNSNumber
をCFNumberCreate()
で作成する様に変更するPRを書いた。 https://github.com/apple/swift-corelibs-foundation/pull/1093 (edited)convenience init
だから その先の self.init
で alloc すればいいはず。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_PATH
とCPLUS_INCLUDE_PATH
を設定したら、使える様になった。() -> NSNumber
なクロージャを渡している。init(factory:)
に渡しているクロージャの式が、 () -> Animal
であるゆえに、 コンパイルエラーとなる。 ここは、 self の式の型は Animal ではなく Self なので、 () -> Self
型のクロージャを渡さねばならないからだ。fileprivate let decimal: Decimal
ということは、現状でも convenience init 経由の NSDecimalNumber のコンストラクトで、 メモリがぶっ壊れる可能性がある・・・?func castCFNumber<T>() -> T { return unsafeBitCast(cfnumber, to: T.self) }
slavaはこれを試してみるとこのこと。 NSDecimalNumber(value: true)
このような「バグでコンパイルできてしまう」パターンは、 既存の 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内部で進んでるのかな?I have a whole branch that refractors almost ALL of the classes that follow the self replacement pattern.
(edited)NSDecimalNumber の decimal プロパティが初期化されない可能性は解決しないのでは・・・???
NSDecimalNumber
は super.init()
しか使ってないから問題ないと思う。 open override func description(withLocale locale: Locale?) -> String { guard locale == nil else { fatalError("Locale not supported: \(locale!)") } return self.decimal.description }
public convenience init(value: Bool)
は、 NSDecimalNumber
に対しても呼び出せると思う。
$ 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)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)
swift -I /usr/lib/swift/clang/include
で。public
だからかな?[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 = {} }
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)### 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)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
になる。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)NSDecimalNumber2
にoverride init() { super.init() }
を足すと通る様になる。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.
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() } }
swift-4.1-DEVELOPMENT-SNAPSHOT-2017-10-25-a
を試したら、REPL起動時に-I/usr/lib/swift/clang/include
を渡さなくてもimport Foundation
でエラーにならなくなってた (edited) func testNSStringPath1() throws { let actual = NSString(string: "").appendingPathComponent("*.txt") let expected = "*.txt" XCTAssertEqual(actual, expected) }
/*.txt
になってしまう。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)
Test Case 'GlobTest.testExpandGlobStar1' started at 2017-11-11 07:57:51.502 ▿ 3 elements - "a" - "a0.txt" - "a1.md"
$ swift --version
が同じならこの手の挙動は同じですよね?[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
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)"})) }
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.
enumerator(atPath:)
とかはどうだろうlibblocksruntime0
が入ってない。swift(>=)
による検査は演算子が使えません。#if swift(>=4.0) #elseif swift(>=3.2) #else #endif
みたいにするしかないと思います。#else
ブロック以外は Swift3.0 ではパースされないので、その中であれば swift(>=4.0.2)
など使えると思います。self.token = self.notificationCenter.addObserver(forName:object:queue:using:)(nil, nil, nil) { ... }
っていう手もあり。#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)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にてDispatch
のバグかもしれないけどimport Foundation import Dispatch for i in 0..<30 { DispatchQueue.global().async { print(i) sleep(1) _ = i } } sleep(10)
(edited)print
は一個も出ずに死にますね。さらにsleepを入れることで死亡率100%にDispatchQueue
を個別に生成した場合死なないのでconcurrent queueの問題みたいですdocker run --privileged -it --rm norionomura/swift:swift-4.1-branch swift -I/usr/lib/swift/clang/include
norionomura/swift:swift-4.1-branch
が最新のスナップショット。/usr/lib
に置かれたライブラリ、swiftcだとリンクされるけど、REPLだとerror: Couldn't lookup symbols:
になってしまう。swift -I/usr/lib/swift/clang/include -L /usr/lib
で起動したREPLだとエラーにならないので、REPLはld
とは違う仕組みでライブラリを検索するぽい?: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)llvm-symbolizer
にもオプションが増えてるなあ。 (edited)libunwind
.Thread.callStackSymbols
)とほぼ同じ出力が得られます。SwiftCompilerDiscordappBot
のクラッシュ原因を突き止めたい…State changed from up to crashed
ってのが時々出てくるのですが、何がトリガーなのかさっぱりわかっていないのです。Process
のstandardInput
にパイプのFileHandle
を渡してパイプへデータを書き込んでも、Linuxだと起動したプロセスが標準入力を読んでくれない現象に悩んでたのだけど、launch()
の前にパイプへデータを書き込んでおく事で読んでくれる様になった。launch()
後にパイプへ書き込んでも問題ない。 (edited)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)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)terminationStatus should be 1, actual: 0 terminationStatus should be 1, actual: 1
(edited)terminationHandler
を使った方が良さそう。 https://github.com/apple/swift-corelibs-foundation/blob/swift-4.2-branch/Foundation/Process.swift#L341waitUntilExit()
でも問題ないしその場合のオーバーヘッドもwaitUntilExit()
の方が少ないかな。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)GLIBCXX_3.4.22
を含むlibstdc++.so.6
はubuntu 16.04のパッケージとしては未リリースぽい。swift-4.2-DEVELOPMENT-SNAPSHOT-2018-08-07-a
で直ってた。 /// - Note: this differs from the Darwin implementation in that the keys must be Strings open var threadDictionary = [String : Any]()
(edited)Thread.current.threadDictionary
を Thread Local Storage として使おうとしたときにObjectIdentifier
の debugDescription
をキーにするとか?"ObjectIdentifier(3001238)"
みたいな?NSMutableDictionary
だと何がまずいんだろう?Dictionary
じゃなければいけない理由が本当にあるなら、 [AnyHashable: Any]
ではだめなのかとか聞いてみると良いと思います。 (edited)[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)
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
[250/3012] Building CXX object
+ /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: ********************
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つのマシンで試してたけど片方は全然手前で死んだ。swift build -c release
だとswift-nightlyボットのCIも通るみたい。[1071/2408] Linking CXX shared library lib/libLTO.so.7svn FAILED: : && /usr/bin/clang++ -fPIC -Wno-unknown-warning-option
^ 昨日ビルドしてた2つのマシンがリンクフェーズの同じところで死んでました。[31/78] Linking CXX shared library src/libdispatch.so
ここでコケるようになった でも、例の謎の Killed じゃなくて /usr/bin/ld.gold: error: cannot find -lswiftSwiftOnoneSupport
docker-machine upgrade
したらハマったので共有。 https://twitter.com/norio_nomura/status/1063237666903273474docker-machine upgrade
したらdocker-machineが壊れた。boot2dockerをv18.06.1-ceにして復旧。 -- 18.09.0 iso breaks swarm ingress · Issue #4608 · docker/machine https://t.co/EwqzwMziDimissing required module 'SwiftShims'
でコケた・・cached
を設定すると良いらしいので、やってみるcached
はメモリ消費が多すぎて、使うのを止めました。docker-machine
使う構成です。docker-machine
を使った構成のメモ https://github.com/norio-nomura/swift-dev/blob/sourcekit-linux/docker-machine-on-mac.mdcached
で問題なくなるけど、大規模だとまだダメという認識です。cached
だとキャッシュメモリがバカみたいに消費されたと記憶。docker-machine
を使わずにnfs使う方法。 https://qiita.com/kunit/items/36d9e5fa710ad26f8010 (edited)docker
にオプション指定ではなくdocker-compose
を使う事が多いなら、こちらが良いのかも。$ 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
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
$ 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
docker-machine
と同等の場合もある。cached
は使ってもあまり変わらなかった。dd
での書き込みですからね。読み込みはcached
の効果が出そうです。import Foundation class Cat {} let a: Cat = Cat() let array = NSMutableArray() array.add(a as Any)
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:
Date
, DateComponents
のnanosecond
周りが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)
swift-4.2.x-RELEASE
を毎月出すらしい。 https://forums.swift.org/t/announcing-swift-4-2-2-and-monthly-swift-4-2-x-dot-releases-for-linux/20148norionomura/swift
、5.0を機にubuntu16.04からubuntu18.04へ切り替えてたのだけど、Discordのボットをubuntu18.04にするとProcess
で起動したswift
プロセスが終了せずにタイムアウトしてしまう不具合に遭遇。--enable-test-discovery
を試せるtoolchainのDockerイメージを作りました。 https://forums.swift.org/t/test-discovery-on-linux/26203/5.build/x86_64-unknown-linux/debug/testlist.derived/
にLinuxMain.swift
とXCTestManifests.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)swift test --generate-linuxmain
の生成物をリポジトリへ含めるのが不要になる。 (edited)LinuxMain.swift
がなかったら勝手に--enable-test-discovery
する、とかそんな挙動になるのかな。SourceKit
ではなくIndexStore
なのか? https://github.com/apple/swift-package-manager/pull/2174--enable-test-discovery
くらいしか利用法が思いつかないな。FoundationNetworking
に続き、FoundationXML
も分離するらしい。 https://github.com/apple/swift-corelibs-foundation/pull/2432Foundation
は、全部入りを指すんですよね?Foundation
はNetworking
とXML
が取り除かれたパッケージになる。全部入りパッケージは無い(と思う)。import Foundation
したときに入るものが異なってしまいますよね。#if canImport(FoundationXML)
とかが libcurl
やlibxml2
をインストールしなくても実行時エラーにならなくなる。 (edited)libunwind
. - norio-nomura/SwiftBacktraceswift-DEVELOPMENT-SNAPSHOT-2019-09-24-a
以降で発生してる事を確認した。 https://bugs.swift.org/browse/SR-11570Swift.swiftmodule
を生成するところから進まなくて、VMのメモリを3GBまで増やしたらようやく進む様になった。以前は1GBで問題なかったのに…import Foundation private final class _Thread: Thread { private let block: () -> Void init(block: @escaping () -> Void) { self.block = block } override func main() { block() } }
<stdin>:8:5: error: 'super.init' isn't called on all paths before returning from initializer } ^
Foundation.Thread
の定義がずれてるってことですか?swift-DEVELOPMENT-SNAPSHOT-2020-08-18-a
からNG (edited)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)swift-5.3.1-RELEASE
からLinux版のSwiftPMに渡された--static-swift-stdlib
もswiftc
へ-static-stdlib
を渡す様になったけど、FoundationNetworking
, FoundationXML
を使ってると-static-stdlib
渡ってなかったのか。swift-5.3-RELEASE
でも同一条件で-Xswiftc -static-stdlib
を使うとlib/swift_static
のswiftmoduleの配置が変わった影響ですね-static-stdlib
がLinuxでも動く様になったと報告されてる詳細に、FoundationNetworking
, FoundationXML
利用有無とか書かれてない。-static-stdlib
を使うと外部依存するライブラリが変わるのか。--static-swift-stdlib
付け外し後はswift package clean
ではダメで、swift package reset
が必要ぽいのも、混乱の要因かも…norionomura/swift:5.3.1
で apt-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)import FoundationNetworking import Foundation print(try! String(contentsOf: URL(string: "https://example.com")!))
僕の環境だとこれを swiftc main.swift -static-stdlib
でコンパイルするとCoreFoundationのシンボルが足りないと怒られます。norionomura/swift:5.3.1
を使ってます。Dockerfile
からswift-5.3.1-RELEASE
相当をビルドしようとしてるけど、途中でdocker build
が止まる…norionomura/swift:531
で試してみます--static-swift-stdlib
の場合、オブジェクトファイルを作るときにはSwiftPMは-static-stdlibを渡さないので /usr/lib/swift/CoreFoundation/module.map
を見て、autolinkのエントリを追加しないからリンク時に-lCoreFoundation が付かないんだ! (edited)apt-get update && apt-get install -y libxml2-dev swift build -Xswiftc -static-stdlib
でリンク出来ることを確認しました。# 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)
.so
がリンクされてる気がするんだけど、実際にシンボルを参照していなければ、.so
が無くても動いたりするのだろうか?libicudata
と libicuuc
が.soでリンクされてるのがおかしい気がしますねlibxml2.so
がlibicu*
を使ってますね。apt-get update && apt-get install -y libxml2
するだけで実行可能になりました。 (edited)sourcekitd
が無いと動かないのですが。echo 'import Foundation'|swiftc -static-executable -
はまた違ったリンクエラーになるのね。/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)' ...
libxml2
しかインストールされていないので、libxml2-dev
へ変更した方が良いかなと。release/5.3
ベースにしてやり直してますSWXMLHash
がビルドできなかったですswift-DEVELOPMENT-SNAPSHOT-2020-11-09-a
でビルドできました。 (edited).so
, .a
両方が入ってる場合に .a
を優先する方法ってないのだろうか。-static
を付けたら.aを優先してくれないですか? lldはそういう挙動だったと思います-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
.so
を探さないという極端な挙動のオプションはあるけど、両方存在する場合に.a
を優先する的なのは見当たらない… # ld.gold --help Usage: ld.gold [options] file... Options: … -Bstatic -l does not search for shared libraries
(edited)swift-DEVELOPMENT-SNAPSHOT-2020-11-13-a
で試そうと思ったら、まだPRの変更が含まれてなかった。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
をビルドできました。swiftlang/swift:nightly
はまだ更新されてないのでnorionomura/swift:nightly
で。$ 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
swift/utils/build-script-impl
にlibXCTest.a
をビルドする仕組みが入ってないぽい。foundation_static
を見ると、product
としてxctest_static
を用意していく作法ぽい。 https://github.com/apple/swift/blob/main/utils/build-script-impl#L2301swift-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-Xlinker -lCoreFoundation
で治ると思います。-Xlinker -lCoreFoundation
では治らないようです。 https://github.com/norio-nomura/docker-swiftlint/pull/18/checks?check_run_id=2446742238-Xlinker -lCFURLSessionInterface -Xlinker -lcurl
で治りました。CIでも試し中。import FoundationNetworking _ = URLSession.shared
(edited)Data(buffer: ByteBuffer)
が NIOFoundationCompat
モジュールに定義されていて、Linuxだとこれをimportしないと使えないんだけどutils/build-script --release-debuginfo --test --skip-early-swift-driver
でビルドしてテスト実行まで含めてピッタリ2時間半ってところ。ARM CPUの4コアと24 GBメモリのマシン。swift:5.5.2-focal
で、最適化バグで、実行ファイルが該当箇所でコアダンプ吐いてクラッシュする症状に出会いました。 しかも、その箇所 + 5.5.2 の組み合わせは過去に動いていて、 新規に追加した別のコードが、間接的に?なんらかの影響をその箇所に与えていたようです。 printを追加すると症状が消えたりしたので、 @_optmize(none)
を付けて解決しました。 みなさんも気をつけて・・・DEVELOPMENT-SNAPSHOT
はインストール先のディレクトリ名を見ればいつのものかわかるけど、Docker版はswift -version
に含まれるハッシュを元にリポジトリを検索しないとわからない。そのためにSwiftボットはGitHubのGraphQL APIを使ってタグを取得してたのだけど、その仕組みをGitHub CLI extensionとして独立させた。 https://github.com/norio-nomura/gh-query-tags (edited)swift:focal
だと動くのにswift:bionic
だとswiftlint version
すら動かない。 $ docker run -it --rm -v $(pwd):$(pwd) -w$(pwd) swiftlint:bionic swiftlint version free(): invalid pointer
swift:latest
はbionic
なんだけど、focal
を使った方が良いのかな。FileManager.DirectoryEnumerationOptions.producesRelativePathURLs
という欲しかったものがあることに気がついて使ったが、Linuxに実装されてなかった。。--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
/proc/self/cmdline
じゃなくてcrt0がくれるargvをコンパイラが吐くエントリポイントで保存しておくのが良いのかなぁ。docker buildx build --platform linux/amd64,linux/arm64
は、Rosetta入りのlimaでもamd64がqemuになってめっちゃ遅かったけど、Docker Desktopだとちゃんと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)