Skip to content

Commit 29bedad

Browse files
committed
Start cross-compiling the new Swift Testing library on the CI for the development branches
1 parent 4190147 commit 29bedad

5 files changed

+155
-6
lines changed

.github/workflows/sdks.yml

+8-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
SWIFT_TAG="swift-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
3232
fi
3333
echo "tag=$SWIFT_TAG" >> $GITHUB_OUTPUT
34-
echo "key=$SWIFT_TAG-ndk-${NDK_VERSION}-pic-bundle" >> $GITHUB_OUTPUT
34+
echo "key=$SWIFT_TAG-ndk-${NDK_VERSION}-testing-bundle" >> $GITHUB_OUTPUT
3535
- name: Get cached SDK bundle
3636
id: cache-bundle
3737
uses: actions/cache/restore@v4
@@ -136,7 +136,11 @@ jobs:
136136
if [ ${{ matrix.version }} = 'devel' ]; then
137137
perl -pi -e 's%r26%ndk/27%' swift/stdlib/cmake/modules/AddSwiftStdlib.cmake
138138
LSP_BUILD="--sourcekit-lsp"
139+
git apply swift-android-testing-devel.patch
140+
else
141+
git apply swift-android-testing-trunk.patch
139142
fi
143+
TESTING_BUILD="--swift-testing --install-swift-testing"
140144
git apply swift-android-ci-except-release.patch swift-android-foundation-except-release.patch
141145
fi
142146
@@ -159,7 +163,7 @@ jobs:
159163
perl -pi -e "s%/data/data/com.termux/files%$SDK%g" $SDK/usr/lib/pkgconfig/sqlite3.pc
160164
fi
161165
162-
./swift/utils/build-script -RA --skip-build-cmark --build-llvm=0 --android --android-ndk $ANDROID_NDK_LATEST_HOME --android-arch $arch --android-api-level $ANDROID_API_LEVEL --build-swift-tools=0 --native-swift-tools-path=${TOOLCHAIN}/bin --native-clang-tools-path=${TOOLCHAIN}/bin --cross-compile-hosts=android-$arch --cross-compile-deps-path=$SDK --skip-local-build --build-swift-static-stdlib --xctest --install-swift --install-libdispatch --install-foundation --install-xctest --install-destdir=$SDK --swift-install-components='compiler;clang-resource-dir-symlink;license;stdlib;sdk-overlay' --cross-compile-append-host-target-to-destdir=False -b -p --install-llbuild $LSP_BUILD
166+
./swift/utils/build-script -RA --skip-build-cmark --build-llvm=0 --android --android-ndk $ANDROID_NDK_LATEST_HOME --android-arch $arch --android-api-level $ANDROID_API_LEVEL --build-swift-tools=0 --native-swift-tools-path=${TOOLCHAIN}/bin --native-clang-tools-path=${TOOLCHAIN}/bin --cross-compile-hosts=android-$arch --cross-compile-deps-path=$SDK --skip-local-build --build-swift-static-stdlib --xctest --install-swift --install-libdispatch --install-foundation --install-xctest --install-destdir=$SDK --swift-install-components='compiler;clang-resource-dir-symlink;license;stdlib;sdk-overlay' --cross-compile-append-host-target-to-destdir=False -b -p --install-llbuild $LSP_BUILD $TESTING_BUILD
163167
164168
pushd ${SDK_NAME}/usr
165169
@@ -169,9 +173,9 @@ jobs:
169173
if [ ${{ matrix.version }} = 'release' ]; then
170174
rm -r lib/swift/pm
171175
fi
172-
mv include/curl include/libxml2 include/spawn.h .
176+
mv include/curl include/execinfo.h include/libxml2 include/spawn.h .
173177
rm -r include/*
174-
mv curl libxml2 spawn.h include/
178+
mv curl execinfo.h libxml2 spawn.h include/
175179
cp -r ../../swift/lib/ClangImporter/SwiftBridging/{module.modulemap,swift} include/
176180
177181
TRIPLE="$arch-linux-android"

get-packages-and-swift-source.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import Foundation
33
// The Termux packages to download and unpack
44
// libxml2 needs liblzma and libiconv
55
// libcurl needs zlib, libnghttp3, libnghttp2, libssh2, and openssl
6-
var termuxPackages = ["libandroid-spawn", "libandroid-spawn-static", "libcurl", "zlib", "libxml2", "libnghttp3", "libnghttp2", "libssh2", "openssl", "liblzma", "libiconv"]
6+
// Testing needs backtrace() from libandroid-execinfo
7+
var termuxPackages = ["libandroid-execinfo", "libandroid-spawn", "libandroid-spawn-static", "libcurl", "zlib", "libxml2", "libnghttp3", "libnghttp2", "libssh2", "openssl", "liblzma", "libiconv"]
78
let termuxURL = "https://packages.termux.dev/apt/termux-main"
89

910
let swiftRepos = ["llvm-project", "swift", "swift-experimental-string-processing", "swift-corelibs-libdispatch",
1011
"swift-corelibs-foundation", "swift-corelibs-xctest", "swift-syntax", "swift-collections",
11-
"swift-foundation", "swift-foundation-icu"]
12+
"swift-foundation", "swift-foundation-icu", "swift-testing"]
1213

1314
let extraSwiftRepos = ["swift-llbuild", "swift-package-manager", "swift-driver",
1415
"swift-tools-support-core", "swift-argument-parser", "swift-crypto",

swift-android-foundation-except-release.patch

+95
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,43 @@ index 16e05052609..7ab8cebfab8 100755
1010

1111
cmake_options=(
1212
-DENABLE_SWIFT=YES
13+
diff --git a/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py b/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
14+
index 324d1a77eea..e88601a8701 100644
15+
--- a/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
16+
+++ b/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
17+
@@ -13,6 +13,9 @@
18+
import os
19+
20+
from build_swift.build_swift.versions import Version
21+
+from ..host_specific_configuration \
22+
+ import HostSpecificConfiguration
23+
+from ..targets import StdlibDeploymentTarget
24+
25+
from . import cmake_product
26+
from . import product
27+
@@ -115,6 +117,22 @@ class SwiftTestingCMakeShim(cmake_product.CMakeProduct):
28+
# FIXME: If we build macros for the builder, specify the path.
29+
self.cmake_options.define('SwiftTesting_MACRO', 'NO')
30+
31+
+ if host_target.startswith('android') and self.is_cross_compile_target(host_target):
32+
+ host_config = HostSpecificConfiguration(host_target, self.args)
33+
+ self.cmake_options.extend(host_config.cmake_options)
34+
+ flags = '-target %s-unknown-linux-android%s ' % (self.args.android_arch,
35+
+ self.args.android_api_level)
36+
+
37+
+ flags += '-resource-dir %s/lib/swift ' % (
38+
+ self.host_install_destdir(host_target) + self.args.install_prefix)
39+
+
40+
+ ndk_path = StdlibDeploymentTarget.get_target_for_name(host_target).platform.ndk_toolchain_path(self.args)
41+
+ flags += '-sdk %s/sysroot ' % (ndk_path)
42+
+ flags += '-tools-directory %s/bin' % (ndk_path)
43+
+ self.cmake_options.define('CMAKE_Swift_FLAGS', flags)
44+
+ self.cmake_options.define('CMAKE_CXX_COMPILER_WORKS', 'True')
45+
+ self.cmake_options.define('CMAKE_FIND_ROOT_PATH', self.args.cross_compile_deps_path)
46+
+
47+
self.generate_toolchain_file_for_darwin_or_linux(
48+
host_target, override_macos_deployment_version=override_deployment_version)
49+
self.build_with_cmake([], self.args.build_variant, [],
1350
diff --git a/swift-corelibs-foundation/Sources/Foundation/Process.swift b/swift-corelibs-foundation/Sources/Foundation/Process.swift
1451
index 758dd1df..02970992 100644
1552
--- a/swift-corelibs-foundation/Sources/Foundation/Process.swift
@@ -39,3 +76,61 @@ index 758dd1df..02970992 100644
3976
#endif
4077
try _throwIfPosixError(posix_spawnattr_init(&spawnAttrs))
4178
try _throwIfPosixError(posix_spawnattr_setflags(&spawnAttrs, .init(POSIX_SPAWN_SETPGROUP)))
79+
diff --git a/swift-testing/CMakeLists.txt b/swift-testing/CMakeLists.txt
80+
index 1be9a4b..bd7b1bd 100644
81+
--- a/swift-testing/CMakeLists.txt
82+
+++ b/swift-testing/CMakeLists.txt
83+
@@ -28,6 +28,7 @@ list(APPEND CMAKE_MODULE_PATH
84+
${PROJECT_SOURCE_DIR}/cmake/modules
85+
${PROJECT_SOURCE_DIR}/cmake/modules/shared)
86+
87+
+set(CMAKE_SHARED_LINKER_FLAGS "")
88+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
89+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
90+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
91+
diff --git a/swift-testing/Sources/Testing/CMakeLists.txt b/swift-testing/Sources/Testing/CMakeLists.tx
92+
index e40cb1b..ff2f920 100644
93+
--- a/swift-testing/Sources/Testing/CMakeLists.txt
94+
+++ b/swift-testing/Sources/Testing/CMakeLists.txt
95+
@@ -110,7 +110,10 @@ target_link_libraries(Testing PRIVATE
96+
if(NOT APPLE)
97+
if(NOT CMAKE_SYSTEM_NAME STREQUAL WASI)
98+
target_link_libraries(Testing PUBLIC
99+
- dispatch)
100+
+ dispatch android-execinfo)
101+
+ list(GET CMAKE_FIND_ROOT_PATH 0 BT_DIR)
102+
+ target_include_directories(Testing PUBLIC ${BT_DIR}/usr/include)
103+
+ target_link_directories(Testing PUBLIC ${BT_DIR}/usr/lib)
104+
endif()
105+
target_link_libraries(Testing PUBLIC
106+
Foundation)
107+
diff --git a/swift-testing/cmake/modules/SwiftModuleInstallation.cmake b/swift-testing/cmake/modules/SwiftModuleInstallation.cmake
108+
index 1553725..d9f9e5b 100644
109+
--- a/swift-testing/cmake/modules/SwiftModuleInstallation.cmake
110+
+++ b/swift-testing/cmake/modules/SwiftModuleInstallation.cmake
111+
@@ -75,6 +75,10 @@ function(_swift_testing_install_target module)
112+
set(module_triple_command "${CMAKE_Swift_COMPILER}" -print-target-info)
113+
if(CMAKE_Swift_COMPILER_TARGET)
114+
list(APPEND module_triple_command -target ${CMAKE_Swift_COMPILER_TARGET})
115+
+ else()
116+
+ set(arg_list ${CMAKE_Swift_FLAGS})
117+
+ separate_arguments(arg_list)
118+
+ list(APPEND module_triple_command ${arg_list})
119+
endif()
120+
execute_process(COMMAND ${module_triple_command} OUTPUT_VARIABLE target_info_json)
121+
string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple")
122+
diff --git a/swift-testing/cmake/modules/TargetTriple.cmake b/swift-testing/cmake/modules/TargetTriple.cmake
123+
index e087cc4..02f3a95 100644
124+
--- a/swift-testing/cmake/modules/TargetTriple.cmake
125+
+++ b/swift-testing/cmake/modules/TargetTriple.cmake
126+
@@ -10,6 +10,10 @@
127+
set(SWT_TARGET_INFO_COMMAND "${CMAKE_Swift_COMPILER}" -print-target-info)
128+
if(CMAKE_Swift_COMPILER_TARGET)
129+
list(APPEND SWT_TARGET_INFO_COMMAND -target ${CMAKE_Swift_COMPILER_TARGET})
130+
+else()
131+
+ set(arg_list ${CMAKE_Swift_FLAGS})
132+
+ separate_arguments(arg_list)
133+
+ list(APPEND SWT_TARGET_INFO_COMMAND ${arg_list})
134+
endif()
135+
execute_process(COMMAND ${SWT_TARGET_INFO_COMMAND} OUTPUT_VARIABLE SWT_TARGET_INFO_JSON)
136+
string(JSON SWT_TARGET_TRIPLE GET "${SWT_TARGET_INFO_JSON}" "target" "unversionedTriple")

swift-android-testing-devel.patch

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
diff --git a/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py b/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
2+
index b6bfa5760ef..324d1a77eea 100644
3+
--- a/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
4+
+++ b/swift/utils/swift_build_support/swift_build_support/products/swift_testing.py
5+
@@ -51,7 +51,7 @@ class SwiftTesting(product.Product):
6+
return False
7+
8+
def should_install(self, host_target):
9+
- return self.args.install_swift_testing_macros
10+
+ return self.args.install_swift_testing
11+
12+
def _cmake_product(self, host_target):
13+
build_root = os.path.dirname(self.build_dir)
14+
diff --git a/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift b/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
15+
index 78227e3..e0db2e9 100644
16+
--- a/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
17+
+++ b/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
18+
@@ -65,11 +65,11 @@ public struct Backtrace: Sendable {
19+
} else {
20+
initializedCount = .init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
21+
}
22+
-#elseif os(Android)
23+
+#elseif os(Androi)
24+
initializedCount = addresses.withMemoryRebound(to: UnsafeMutableRawPointer.self) { addresses in
25+
.init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
26+
}
27+
-#elseif os(Linux) || os(FreeBSD)
28+
+#elseif os(Linux) || os(FreeBSD) || os(Android)
29+
initializedCount = .init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
30+
#elseif os(Windows)
31+
initializedCount = Int(clamping: RtlCaptureStackBackTrace(0, ULONG(clamping: addresses.count), addresses.baseAddress!, nil))

swift-android-testing-trunk.patch

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
diff --git a/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift b/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
2+
index 78227e3..e0db2e9 100644
3+
--- a/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
4+
+++ b/swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
5+
@@ -65,11 +65,11 @@ public struct Backtrace: Sendable {
6+
} else {
7+
initializedCount = .init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
8+
}
9+
-#elseif os(Android)
10+
+#elseif os(Androi)
11+
initializedCount = addresses.withMemoryRebound(to: UnsafeMutableRawPointer.self) { addresses in
12+
.init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
13+
}
14+
-#elseif os(Linux) || os(FreeBSD) || os(OpenBSD)
15+
+#elseif os(Linux) || os(FreeBSD) || os(OpenBSD) || os(Android)
16+
initializedCount = .init(clamping: backtrace(addresses.baseAddress!, .init(clamping: addresses.count)))
17+
#elseif os(Windows)
18+
initializedCount = Int(clamping: RtlCaptureStackBackTrace(0, ULONG(clamping: addresses.count), addresses.baseAddress!, nil))

0 commit comments

Comments
 (0)