Skip to content

Commit e5767fc

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 fc68912 commit e5767fc

File tree

1 file changed

+44
-20
lines changed

1 file changed

+44
-20
lines changed

.github/workflows/swift-toolchain.yml

+44-20
Original file line numberDiff line numberDiff line change
@@ -2017,8 +2017,9 @@ jobs:
20172017
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20182018
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20192019
os: Windows
2020-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}" -D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
2021-
extra_flags:
2020+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2021+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
2022+
extra_flags: '-D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
20222023

20232024
- arch: arm64
20242025
cpu: 'aarch64'
@@ -2030,8 +2031,9 @@ jobs:
20302031
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20312032
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20322033
os: Windows
2033-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}" -D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
2034-
extra_flags:
2034+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2035+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
2036+
extra_flags: '-D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
20352037

20362038
- arch: x86
20372039
cpu: 'i686'
@@ -2043,8 +2045,9 @@ jobs:
20432045
cxxflags: ${{ inputs.WINDOWS_CMAKE_CXX_FLAGS }}
20442046
swiftflags: ${{ inputs.CMAKE_Swift_FLAGS }}
20452047
os: Windows
2046-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}" -D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
2047-
extra_flags:
2048+
exe_linker_flags: ${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}
2049+
shared_linker_flags: ${{ inputs.WINDOWS_CMAKE_SHARED_LINKER_FLAGS }}
2050+
extra_flags: '-D CMAKE_STATIC_LIBRARY_PREFIX_Swift=lib'
20482051

20492052
- arch: arm64
20502053
cpu: 'aarch64'
@@ -2056,7 +2059,8 @@ jobs:
20562059
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20572060
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
20582061
os: Android
2059-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2062+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2063+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20602064
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
20612065

20622066
- arch: armv7
@@ -2069,7 +2073,8 @@ jobs:
20692073
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20702074
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
20712075
os: Android
2072-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2076+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2077+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20732078
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
20742079

20752080
- arch: i686
@@ -2082,7 +2087,8 @@ jobs:
20822087
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20832088
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
20842089
os: Android
2085-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2090+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2091+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20862092
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
20872093

20882094
- arch: x86_64
@@ -2095,7 +2101,8 @@ jobs:
20952101
cxxflags: ${{ inputs.ANDROID_CMAKE_CXX_FLAGS }}
20962102
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
20972103
os: Android
2098-
linker_flags: '-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}" -D CMAKE_SHARED_LINKER_FLAGS="${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}"'
2104+
exe_linker_flags: ${{ inputs.ANDROID_CMAKE_EXE_LINKER_FLAGS }}
2105+
shared_linker_flags: ${{ inputs.ANDROID_CMAKE_SHARED_LINKER_FLAGS }}
20992106
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
21002107

21012108
name: ${{ matrix.os }} ${{ matrix.arch }} SDK
@@ -2197,11 +2204,6 @@ jobs:
21972204
components: 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64;Microsoft.VisualStudio.Component.VC.Tools.ARM64'
21982205
arch: ${{ matrix.arch }}
21992206

2200-
# FIXME(compnerd): workaround CMake 3.29-3.30 issue
2201-
- uses: lukka/get-cmake@aa1df13cce8c30d2cb58efa871271c5a764623f8 # main
2202-
with:
2203-
cmakeVersion: 3.28.6
2204-
22052207
- uses: nttld/setup-ndk@v1
22062208
if: matrix.os == 'Android' && inputs.build_android
22072209
id: setup-ndk
@@ -2250,7 +2252,8 @@ jobs:
22502252
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
22512253
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
22522254
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2253-
${{ matrix.linker_flags }} `
2255+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2256+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
22542257
${{ matrix.extra_flags }} `
22552258
$CMAKE_NDK_FLAG `
22562259
$SWIFT_NDK_FLAG `
@@ -2270,6 +2273,13 @@ jobs:
22702273
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/${{ inputs.swift_version }}+Asserts/usr/bin/clang-cl.exe
22712274
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/${{ inputs.swift_version }}+Asserts/usr/bin/swiftc.exe
22722275
2276+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2277+
# TODO: Once we have CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2278+
$CMAKE_SHARED_LINKER_FLAGS =
2279+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2280+
$CMAKE_EXE_LINKER_FLAGS =
2281+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2282+
22732283
if ("${{ matrix.os }}" -eq "Android") {
22742284
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
22752285
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2307,7 +2317,6 @@ jobs:
23072317
-D CMAKE_CXX_COMPILER=${{ matrix.cxx }} `
23082318
-D CMAKE_CXX_COMPILER_TARGET=${{ matrix.triple }} `
23092319
-D CMAKE_CXX_FLAGS="${{ matrix.cxxflags }}" `
2310-
-D CMAKE_EXE_LINKER_FLAGS="${{ inputs.WINDOWS_CMAKE_EXE_LINKER_FLAGS }}" `
23112320
-D CMAKE_FIND_PACKAGE_PREFER_CONFIG=YES `
23122321
-D CMAKE_INSTALL_PREFIX=${{ github.workspace }}/BuildRoot/Library/Developer/Platforms/${{ matrix.os }}.platform/Developer/SDKs/${{ matrix.os }}.sdk/usr `
23132322
-D CMAKE_Swift_COMPILER=${SWIFTC} `
@@ -2318,7 +2327,10 @@ jobs:
23182327
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
23192328
-D MSVC_C_ARCHITECTURE_ID=${{ matrix.arch }} `
23202329
-D MSVC_CXX_ARCHITECTURE_ID=${{ matrix.arch }} `
2321-
${{ matrix.linker_flags }} `
2330+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2331+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2332+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2333+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
23222334
${{ matrix.extra_flags }} `
23232335
$CMAKE_NDK_FLAG `
23242336
$SWIFT_NDK_FLAG `
@@ -2349,6 +2361,14 @@ jobs:
23492361
$CLANG_CL = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/${{ inputs.swift_version }}+Asserts/usr/bin/clang-cl.exe
23502362
$SWIFTC = cygpath -m ${{ github.workspace }}/BinaryCache/Library/Developer/Toolchains/${{ inputs.swift_version }}+Asserts/usr/bin/swiftc.exe
23512363
2364+
# Worarkound CMake 3.30 issue where CMAKE_[*]_FLAGS are passed as-is to the linker driver.
2365+
# Pass these as "-Xlinker" flags to avoid the issue.
2366+
# TODO: Once we use CMake 4.0, set CMP0181 to NEW and pass these as "LINKER:" flags.
2367+
$CMAKE_SHARED_LINKER_FLAGS =
2368+
("${{ matrix.shared_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2369+
$CMAKE_EXE_LINKER_FLAGS =
2370+
("${{ matrix.exe_linker_flags }}".Split(" ").Where({ $_.Trim() -ne ''}) | ForEach-Object { "-Xlinker $_" }) -join " "
2371+
23522372
if ("${{ matrix.os }}" -eq "Android") {
23532373
$NDKPATH = cygpath -m ${{ steps.setup-ndk.outputs.ndk-path }}
23542374
# Since win/arm64 doesn't have one, this logic is necessary because
@@ -2383,7 +2403,10 @@ jobs:
23832403
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
23842404
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
23852405
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2386-
${{ matrix.linker_flags }} `
2406+
-D CMAKE_EXE_LINKER_FLAGS="${CMAKE_EXE_LINKER_FLAGS}" `
2407+
-D CMAKE_SHARED_LINKER_FLAGS="${CMAKE_SHARED_LINKER_FLAGS}" `
2408+
-D CMAKE_EXE_LINKER_FLAGS_RELEASE="" `
2409+
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="" `
23872410
${{ matrix.extra_flags }} `
23882411
$CMAKE_NDK_FLAG `
23892412
$SWIFT_NDK_FLAG `
@@ -2438,7 +2461,8 @@ jobs:
24382461
-D CMAKE_Swift_FLAGS_RELEASE="-O" `
24392462
-D CMAKE_SYSTEM_NAME=${{ matrix.os }} `
24402463
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_CPU} `
2441-
${{ matrix.linker_flags }} `
2464+
-D CMAKE_EXE_LINKER_FLAGS="${{ matrix.exe_linker_flags }}" `
2465+
-D CMAKE_SHARED_LINKER_FLAGS="${{ matrix.shared_linker_flags }}" `
24422466
${{ matrix.extra_flags }} `
24432467
$CMAKE_NDK_FLAG `
24442468
$SWIFT_NDK_FLAG `

0 commit comments

Comments
 (0)