Skip to content

Commit 53f5fb5

Browse files
committed
[sdk] Add "-Xlinker" to linker for Swift projects
Since CMake 3.30, `CMAKE_[*]_LINKER_FLAGS` are passed to the linker invocation as-is. This causes issues in Swift-only projects where the linker invocation is `swiftc` used as a driver for the actual underlying linker. `swiftc` cannot parse these arguments and fails. As a workaround, this rewrites the `shared_linker_flags` and `exe_linker_flags`, adding `-Xlinker` for each flag, which solves the problem. In the future, CMake 4.0 introduces `CMP0181` which will allow `CMAKE_[*]_LINKER_FLAGS` to interpret the `LINKER:` prefix and generate the correct linker invocation.
1 parent 701485b commit 53f5fb5

File tree

1 file changed

+41
-14
lines changed

1 file changed

+41
-14
lines changed

.github/workflows/swift-toolchain.yml

+41-14
Original file line numberDiff line numberDiff line change
@@ -2029,7 +2029,8 @@ jobs:
20292029
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20302030
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20312031
os: Windows
2032-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}"'
2032+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2033+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
20332034
extra_flags:
20342035

20352036
- arch: arm64
@@ -2042,7 +2043,8 @@ jobs:
20422043
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20432044
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20442045
os: Windows
2045-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}"'
2046+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2047+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
20462048
extra_flags:
20472049

20482050
- arch: x86
@@ -2055,7 +2057,8 @@ jobs:
20552057
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20562058
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20572059
os: Windows
2058-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}"'
2060+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2061+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
20592062
extra_flags:
20602063

20612064
- arch: arm64
@@ -2068,7 +2071,8 @@ jobs:
20682071
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20692072
swiftflags: -sdk $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -target -Xclang-linker aarch64-unknown-linux-android${{ inputs.ANDROID_API_LEVEL }} -Xclang-linker --sysroot -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -resource-dir -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17 -L ${{ github.workspace }}/BinaryCache/swift/lib/swift/android -g
20702073
os: Android
2071-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2074+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2075+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20722076
extra_flags: -DSWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT=YES -DLLVM_ENABLE_LIBCXX=YES -DSWIFT_USE_LINKER=lld -DCMAKE_ANDROID_API=${{ inputs.ANDROID_API_LEVEL }} -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a
20732077

20742078
- arch: armv7
@@ -2081,7 +2085,8 @@ jobs:
20812085
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20822086
swiftflags: -sdk $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -target -Xclang-linker armv7a-unknown-linux-androideabi${{ inputs.ANDROID_API_LEVEL }} -Xclang-linker --sysroot -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -resource-dir -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17 -L ${{ github.workspace }}/BinaryCache/swift/lib/swift/android -g
20832087
os: Android
2084-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2088+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2089+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20852090
extra_flags: -DSWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT=YES -DLLVM_ENABLE_LIBCXX=YES -DSWIFT_USE_LINKER=lld -DCMAKE_ANDROID_API=${{ inputs.ANDROID_API_LEVEL }} -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
20862091

20872092
- arch: i686
@@ -2094,7 +2099,8 @@ jobs:
20942099
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20952100
swiftflags: -sdk $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -target -Xclang-linker i686-unknown-linux-android${{ inputs.ANDROID_API_LEVEL }} -Xclang-linker --sysroot -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -resource-dir -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17 -L ${{ github.workspace }}/BinaryCache/swift/lib/swift/android -g
20962101
os: Android
2097-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2102+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2103+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20982104
extra_flags: -DSWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT=YES -DLLVM_ENABLE_LIBCXX=YES -DSWIFT_USE_LINKER=lld -DCMAKE_ANDROID_API=${{ inputs.ANDROID_API_LEVEL }} -DCMAKE_ANDROID_ARCH_ABI=x86
20992105

21002106
- arch: x86_64
@@ -2107,7 +2113,8 @@ jobs:
21072113
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
21082114
swiftflags: -sdk $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -target -Xclang-linker x86_64-unknown-linux-android${{ inputs.ANDROID_API_LEVEL }} -Xclang-linker --sysroot -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Xclang-linker -resource-dir -Xclang-linker $NDKPATH/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17 -L ${{ github.workspace }}/BinaryCache/swift/lib/swift/android -g
21092115
os: Android
2110-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2116+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2117+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
21112118
extra_flags: -DSWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT=YES -DLLVM_ENABLE_LIBCXX=YES -DSWIFT_USE_LINKER=lld -DCMAKE_ANDROID_API=${{ inputs.ANDROID_API_LEVEL }} -DCMAKE_ANDROID_ARCH_ABI=x86_64
21122119

21132120
name: ${{ matrix.os }} ${{ matrix.arch }} SDK
@@ -2262,7 +2269,8 @@ jobs:
22622269
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
22632270
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
22642271
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2265-
${{ matrix.linker_flags }} `
2272+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2273+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
22662274
${{ matrix.extra_flags }} `
22672275
$CMAKE_NDK_FLAG `
22682276
$SWIFT_NDK_FLAG `
@@ -2282,6 +2290,13 @@ jobs:
22822290
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/clang-cl.exe
22832291
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/swiftc.exe
22842292
2293+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2294+
# TODO: Once we have CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2295+
$CMAKE_SHARED_LINKER_FLAGS =
2296+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2297+
$CMAKE_EXE_LINKER_FLAGS =
2298+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2299+
22852300
if ("${{ matrix.os }}" -eq "Android") {
22862301
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
22872302
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2319,7 +2334,6 @@ jobs:
23192334
-D CMAKE_CXX_COMPILER=${{ matrix.cxx }} `
23202335
-D CMAKE_CXX_COMPILER_TARGET=${{ matrix.triple }} `
23212336
-D CMAKE_CXX_FLAGS="${{ matrix.cxxflags }}" `
2322-
-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" `
23232337
-D CMAKE_FIND_PACKAGE_PREFER_CONFIG=YES `
23242338
-D CMAKE_INSTALL_PREFIX=${{ github.workspace }}/BuildRoot/Library/Developer/Platforms/${{ matrix.os }}.platform/Developer/SDKs/${{ matrix.os }}.sdk/usr `
23252339
-D CMAKE_Swift_COMPILER=${SWIFTC} `
@@ -2330,8 +2344,10 @@ jobs:
23302344
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
23312345
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
23322346
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2333-
${{ matrix.linker_flags }} `
2334-
${{ matrix.extra_flags }} `
2347+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2348+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2349+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2350+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
23352351
$CMAKE_NDK_FLAG `
23362352
$SWIFT_NDK_FLAG `
23372353
-G Ninja `
@@ -2361,6 +2377,14 @@ jobs:
23612377
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/clang-cl.exe
23622378
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/swiftc.exe
23632379
2380+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2381+
# Pass these as "-Xlinker" flags to avoid the issue.
2382+
# TODO: Once we use CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2383+
$CMAKE_SHARED_LINKER_FLAGS =
2384+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2385+
$CMAKE_EXE_LINKER_FLAGS =
2386+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2387+
23642388
if ("${{ matrix.os }}" -eq "Android") {
23652389
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
23662390
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2395,8 +2419,10 @@ jobs:
23952419
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
23962420
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
23972421
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2398-
${{ matrix.linker_flags }} `
2399-
${{ matrix.extra_flags }} `
2422+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2423+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2424+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2425+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
24002426
$CMAKE_NDK_FLAG `
24012427
$SWIFT_NDK_FLAG `
24022428
-G Ninja `
@@ -2450,7 +2476,8 @@ jobs:
24502476
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
24512477
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
24522478
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2453-
${{ matrix.linker_flags }} `
2479+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2480+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
24542481
${{ matrix.extra_flags }} `
24552482
$CMAKE_NDK_FLAG `
24562483
$SWIFT_NDK_FLAG `

0 commit comments

Comments
 (0)