UPDATE
With some help from @johannesweiss and @drexin, the workaround for my async problem described below is to add an explicit import Dispatch to the file.
There might some kind of regression here. This simple program:
# app.swift
@main
struct App {
static func main() async throws {
print("Hello")
try await Task.sleep(nanoseconds: 1_000_000_000)
print("Bye!")
}
}
cannot be compiled on linux with --static-swift-stdlib:
Output
swift build -c release --static-swift-stdlib -v
lsb_release -r
/usr/bin/swiftc -print-target-info
/usr/bin/swiftc -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -emit-supported-features /tmp/TemporaryDirectory.3N5phf/dummyInput-1.swift
Planning build
/usr/bin/swiftc -L /usr/lib/swift/pm/ManifestAPI -lPackageDescription -Xlinker -rpath -Xlinker /usr/lib/swift/pm/ManifestAPI -swift-version 5 -I /usr/lib/swift/pm/ManifestAPI -package-description-version 5.5.0 /app/Package.swift -Xfrontend -disable-implicit-concurrency-module-import -o /tmp/TemporaryDirectory.lzqv4h/app-manifest
/tmp/TemporaryDirectory.lzqv4h/app-manifest -fileno 13
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -emit-supported-features /tmp/TemporaryDirectory.o1LiJf/dummyInput-2.swift
/usr/bin/swiftc -g -L /app/.build/aarch64-unknown-linux-gnu/release -o /app/.build/aarch64-unknown-linux-gnu/release/static-test -module-name static_test -static-stdlib -emit-executable -Xlinker --defsym -Xlinker main=static_test_main -Xlinker '-rpath=$ORIGIN' @/app/.build/aarch64-unknown-linux-gnu/release/static-test.product/Objects.LinkFileList -target aarch64-unknown-linux-gnu -L /usr/lib
error: link command failed with exit code 1 (use -v to see invocation)
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to '_dispatch_queue_attr_concurrent'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to '_dispatch_queue_attr_concurrent'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to 'dispatch_queue_attr_make_with_qos_class'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to 'dispatch_queue_create'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to 'dispatch_queue_set_width'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalImpl(swift::Job*): error: undefined reference to 'dispatch_release'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_time'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_after_f'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to '_dispatch_queue_attr_concurrent'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to '_dispatch_queue_attr_concurrent'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_queue_attr_make_with_qos_class'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_queue_create'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_queue_set_width'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueGlobalWithDelayImpl(unsigned long long, swift::Job*): error: undefined reference to 'dispatch_release'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueMainExecutor: error: undefined reference to '_dispatch_main_q'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueMainExecutor: error: undefined reference to '_dispatch_main_q'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueMainExecutorImpl(swift::Job*): error: undefined reference to '_dispatch_main_q'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function swift_task_enqueueMainExecutorImpl(swift::Job*): error: undefined reference to '_dispatch_main_q'
/usr/lib/swift_static/linux/libswift_Concurrency.a(GlobalExecutor.cpp.o):GlobalExecutor.cpp:function dispatchEnqueueDispatchAsync(dispatch_queue_s*, void*, unsigned int): error: undefined reference to 'dispatch_async_f'
/usr/lib/swift_static/linux/libswift_Concurrency.a(Task.cpp.o):Task.cpp:function swift_task_asyncMainDrainQueueImpl(): error: undefined reference to 'dispatch_main'
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
If I remove the async code from the example, it compiles fine:
import Foundation
@main
struct App {
static func main() {
print("Hello")
Thread.sleep(forTimeInterval: 1)
print("Bye!")
}
}
Output
$ swift build -c release --static-swift-stdlib -v
lsb_release -r
/usr/bin/swiftc -print-target-info
/usr/bin/swiftc -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -emit-supported-features /tmp/TemporaryDirectory.iW25ig/dummyInput-1.swift
Planning build
/usr/bin/swiftc -L /usr/lib/swift/pm/ManifestAPI -lPackageDescription -Xlinker -rpath -Xlinker /usr/lib/swift/pm/ManifestAPI -swift-version 5 -I /usr/lib/swift/pm/ManifestAPI -package-description-version 5.5.0 /app/Package.swift -Xfrontend -disable-implicit-concurrency-module-import -o /tmp/TemporaryDirectory.xEguEh/app-manifest
/tmp/TemporaryDirectory.xEguEh/app-manifest -fileno 14
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -print-target-info
/usr/bin/swift-frontend -frontend -emit-supported-features /tmp/TemporaryDirectory.cADivj/dummyInput-2.swift
/usr/bin/swiftc -module-name static_test -incremental -emit-dependencies -emit-module -emit-module-path /app/.build/aarch64-unknown-linux-gnu/release/static_test.swiftmodule -output-file-map /app/.build/aarch64-unknown-linux-gnu/release/static_test.build/output-file-map.json -whole-module-optimization -num-threads 4 -c /app/Sources/static-test/program.swift -I /app/.build/aarch64-unknown-linux-gnu/release -target aarch64-unknown-linux-gnu -swift-version 5 -O -g -j4 -DSWIFT_PACKAGE -module-cache-path /app/.build/aarch64-unknown-linux-gnu/release/ModuleCache -static-stdlib -parseable-output -Xfrontend -entry-point-function-name -Xfrontend static_test_main -parse-as-library -color-diagnostics
remark: Incremental compilation has been disabled: it is not compatible with whole module optimization/usr/bin/swift-frontend -frontend -c /app/Sources/static-test/program.swift -emit-module-path /app/.build/aarch64-unknown-linux-gnu/release/static_test.swiftmodule -emit-module-doc-path /app/.build/aarch64-unknown-linux-gnu/release/static_test.swiftdoc -emit-module-source-info-path /app/.build/aarch64-unknown-linux-gnu/release/static_test.swiftsourceinfo -emit-dependencies-path /app/.build/aarch64-unknown-linux-gnu/release/static_test.build/static_test.d -target aarch64-unknown-linux-gnu -Xllvm -aarch64-use-tbi -disable-objc-interop -I /app/.build/aarch64-unknown-linux-gnu/release -color-diagnostics -g -module-cache-path /app/.build/aarch64-unknown-linux-gnu/release/ModuleCache -swift-version 5 -O -D SWIFT_PACKAGE -new-driver-path /usr/bin/swift-driver -entry-point-function-name static_test_main -resource-dir /usr/lib/swift_static -use-static-resource-dir -module-name static_test -parse-as-library -num-threads 4 -o /app/.build/aarch64-unknown-linux-gnu/release/static_test.build/program.swift.o
/usr/bin/swift-autolink-extract /app/.build/aarch64-unknown-linux-gnu/release/static_test.build/program.swift.o -o /app/.build/aarch64-unknown-linux-gnu/release/static_test.build/static_test.autolink
/usr/bin/swiftc -g -L /app/.build/aarch64-unknown-linux-gnu/release -o /app/.build/aarch64-unknown-linux-gnu/release/static-test -module-name static_test -static-stdlib -emit-executable -Xlinker --defsym -Xlinker main=static_test_main -Xlinker '-rpath=$ORIGIN' @/app/.build/aarch64-unknown-linux-gnu/release/static-test.product/Objects.LinkFileList -target aarch64-unknown-linux-gnu -L /usr/lib
[0/0] Build complete!
Side note, I am not sure why I see these warnings:
remark: Incremental compilation has been disabled: it is not compatible with whole module
optimization
$ swift --version
Swift version 5.5.2 (swift-5.5.2-RELEASE)
Target: aarch64-unknown-linux-gnu
(same result when running on intel)