Skip to content

Commit 84d25da

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 84d25da

File tree

1 file changed

+41
-19
lines changed

1 file changed

+41
-19
lines changed

.github/workflows/swift-toolchain.yml

Lines changed: 41 additions & 19 deletions
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
@@ -2209,11 +2216,6 @@ jobs:
22092216
components: 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64;Microsoft.VisualStudio.Component.VC.Tools.ARM64'
22102217
arch: ${{ matrix.arch }}
22112218

2212-
# FIXME(compnerd): workaround CMake 3.29-3.30 issue
2213-
- uses: lukka/get-cmake@aa1df13cce8c30d2cb58efa871271c5a764623f8 # main
2214-
with:
2215-
cmakeVersion: 3.28.6
2216-
22172219
- uses: nttld/setup-ndk@v1
22182220
if: matrix.os == 'Android' && inputs.build_android
22192221
id: setup-ndk
@@ -2262,7 +2264,8 @@ jobs:
22622264
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
22632265
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
22642266
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2265-
${{ matrix.linker_flags }} `
2267+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2268+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
22662269
${{ matrix.extra_flags }} `
22672270
$CMAKE_NDK_FLAG `
22682271
$SWIFT_NDK_FLAG `
@@ -2282,6 +2285,13 @@ jobs:
22822285
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/clang-cl.exe
22832286
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/swiftc.exe
22842287
2288+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2289+
# TODO: Once we have CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2290+
$CMAKE_SHARED_LINKER_FLAGS =
2291+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2292+
$CMAKE_EXE_LINKER_FLAGS =
2293+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2294+
22852295
if ("${{ matrix.os }}" -eq "Android") {
22862296
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
22872297
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2319,7 +2329,6 @@ jobs:
23192329
-D CMAKE_CXX_COMPILER=${{ matrix.cxx }} `
23202330
-D CMAKE_CXX_COMPILER_TARGET=${{ matrix.triple }} `
23212331
-D CMAKE_CXX_FLAGS="${{ matrix.cxxflags }}" `
2322-
-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" `
23232332
-D CMAKE_FIND_PACKAGE_PREFER_CONFIG=YES `
23242333
-D CMAKE_INSTALL_PREFIX=${{ github.workspace }}/BuildRoot/Library/Developer/Platforms/${{ matrix.os }}.platform/Developer/SDKs/${{ matrix.os }}.sdk/usr `
23252334
-D CMAKE_Swift_COMPILER=${SWIFTC} `
@@ -2330,8 +2339,10 @@ jobs:
23302339
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
23312340
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
23322341
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2333-
${{ matrix.linker_flags }} `
2334-
${{ matrix.extra_flags }} `
2342+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2343+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2344+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2345+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
23352346
$CMAKE_NDK_FLAG `
23362347
$SWIFT_NDK_FLAG `
23372348
-G Ninja `
@@ -2361,6 +2372,14 @@ jobs:
23612372
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/clang-cl.exe
23622373
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin/swiftc.exe
23632374
2375+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2376+
# Pass these as "-Xlinker" flags to avoid the issue.
2377+
# TODO: Once we use CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2378+
$CMAKE_SHARED_LINKER_FLAGS =
2379+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2380+
$CMAKE_EXE_LINKER_FLAGS =
2381+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2382+
23642383
if ("${{ matrix.os }}" -eq "Android") {
23652384
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
23662385
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2395,8 +2414,10 @@ jobs:
23952414
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
23962415
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
23972416
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2398-
${{ matrix.linker_flags }} `
2399-
${{ matrix.extra_flags }} `
2417+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2418+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2419+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2420+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
24002421
$CMAKE_NDK_FLAG `
24012422
$SWIFT_NDK_FLAG `
24022423
-G Ninja `
@@ -2450,7 +2471,8 @@ jobs:
24502471
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
24512472
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
24522473
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2453-
${{ matrix.linker_flags }} `
2474+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2475+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
24542476
${{ matrix.extra_flags }} `
24552477
$CMAKE_NDK_FLAG `
24562478
$SWIFT_NDK_FLAG `

0 commit comments

Comments
 (0)