Skip to content

Commit 63e404c

Browse files
committed
1 parent 9427b75 commit 63e404c

File tree

3 files changed

+152
-109
lines changed

3 files changed

+152
-109
lines changed

.github/workflows/pull_request.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ jobs:
6464
- name: Install Dependencies
6565
run: |
6666
sudo apt install -q ninja-build patchelf
67-
- name: Build Android SDK
67+
- name: Build Android SDK in Docker
6868
working-directory: swift-ci/sdks/android
6969
run: |
7070
BUILD_VERSION=${{ matrix.swift-version }} TARGET_ARCHS=${{ matrix.arch }} ./build
71+
- name: Build Android SDK
72+
working-directory: swift-ci/sdks/android
73+
run: |
74+
BUILD_VERSION=${{ matrix.swift-version }} TARGET_ARCHS=${{ matrix.arch }} ./build-local
7175
- name: Get artifact info
7276
id: info
7377
shell: bash

swift-ci/sdks/android/build

Lines changed: 33 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,39 @@
1-
#!/bin/bash -e
2-
# Swift Android SDK: Top-level Build Script
3-
4-
# default architectures to build for
5-
TARGET_ARCHS=${TARGET_ARCHS:-aarch64,x86_64,armv7}
6-
7-
ANDROID_NDK_VERSION=android-ndk-r27c
8-
ANDROID_API=28
9-
10-
SDKROOT=${RUNNER_TEMP:-${TMPDIR:-'/tmp'}}/swift-android-sdk
11-
mkdir -p ${SDKROOT}
12-
13-
# Install a Swift host toolchain if it isn't already present
14-
SWIFT_ROOT=${SDKROOT}/host-toolchain
15-
HOST_OS=ubuntu$(lsb_release -sr)
16-
17-
#BUILD_VERSION='release'
18-
#BUILD_VERSION='trunk'
19-
BUILD_VERSION=${BUILD_VERSION:-'devel'}
20-
21-
if [ "${BUILD_VERSION}" = 'release' ]; then
22-
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/releases | grep -m1 swift-6.1 | cut -d- -f2)
23-
SWIFT_TAG="swift-${LATEST_TOOLCHAIN_VERSION}-RELEASE"
24-
SWIFT_BRANCH="swift-$(echo $SWIFT_TAG | cut -d- -f2)-release"
25-
elif [ "${BUILD_VERSION}" = 'devel' ]; then
26-
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-6.2-DEV | cut -d- -f8-10)
27-
SWIFT_TAG="swift-6.2-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
28-
SWIFT_BRANCH="swift-$(echo $SWIFT_TAG | cut -d- -f2)-branch"
29-
elif [ "${BUILD_VERSION}" = 'trunk' ]; then
30-
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-DEV | cut -d- -f7-9)
31-
SWIFT_TAG="swift-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
32-
SWIFT_BRANCH="development"
33-
else
34-
echo "$0: invalid BUILD_VERSION=${BUILD_VERSION}"
35-
exit 1
1+
#!/bin/bash
2+
#
3+
# ===----------------------------------------------------------------------===
4+
#
5+
# Swift Android SDK: Top-level Build Script
6+
#
7+
# ===----------------------------------------------------------------------===
8+
9+
if [[ "$DOCKER" == "" ]]; then
10+
DOCKER=docker
3611
fi
3712

38-
SWIFT_BASE=$SWIFT_TAG-$HOST_OS
39-
40-
if [[ ! -d "$SWIFT_ROOT/$SWIFT_BASE" ]]; then
41-
mkdir -p $SWIFT_ROOT
42-
pushd $SWIFT_ROOT
43-
44-
SWIFT_URL="https://download.swift.org/$SWIFT_BRANCH/$(echo $HOST_OS | tr -d '.')/$SWIFT_TAG/$SWIFT_BASE.tar.gz"
45-
wget -q $SWIFT_URL
46-
tar xzf $SWIFT_BASE.tar.gz
47-
48-
popd
49-
fi
50-
51-
#HOST_TOOLCHAIN=${HOST_TOOLCHAIN:-$(dirname $(dirname $(which swiftc)))}
52-
HOST_TOOLCHAIN=$SWIFT_ROOT/$SWIFT_BASE/usr
53-
$HOST_TOOLCHAIN/bin/swift --version
54-
55-
# ensure the correct Swift is first in the PATH
56-
export PATH=$HOST_TOOLCHAIN/bin:$PATH
57-
58-
export ANDROID_NDK_HOME=${SDKROOT}/ndk/${ANDROID_NDK_VERSION}
59-
export ANDROID_NDK=${ANDROID_NDK_HOME}
60-
61-
if [[ ! -d ${ANDROID_NDK_HOME} ]]; then
62-
mkdir -p $(dirname ${ANDROID_NDK_HOME})
63-
pushd $(dirname ${ANDROID_NDK_HOME})
64-
NDKFILE=$(basename $ANDROID_NDK_HOME)-linux.zip
65-
wget -q https://dl.google.com/android/repository/${NDKFILE}
66-
unzip -q ${NDKFILE}
67-
popd
68-
fi
69-
70-
mkdir -p ${SDKROOT}/products
13+
case $(arch) in
14+
arm64|aarch64)
15+
OS_ARCH_SUFFIX=-aarch64
16+
;;
17+
amd64|x86_64)
18+
OS_ARCH_SUFFIX=
19+
;;
20+
*)
21+
echo "Unknown architecture $(arch)"
22+
exit 1
23+
;;
24+
esac
25+
26+
# Build the Docker image
27+
$DOCKER build --build-arg OS_ARCH_SUFFIX=$OS_ARCH_SUFFIX -t swift-android .
7128

7229
# Check-out the sources
73-
if [[ ! -d ${SDKROOT}/src ]]; then
74-
scripts/fetch-source.sh --source-dir ${SDKROOT}/src --swift-tag ${SWIFT_TAG}
75-
fi
76-
77-
# fetch and apply the patches
78-
PATCHDIR=${SDKROOT}/patches
79-
if [[ ! -d ${PATCHDIR} ]]; then
80-
git clone https://github.com/finagolfin/swift-android-sdk.git ${PATCHDIR}
81-
82-
# TODO: need to selectively apply patches based on release or not release
83-
pushd ${SDKROOT}/src/swift-project
84-
echo "Applying patches"
85-
86-
# patch the patch, which seems to only be needed for an API less than 28
87-
# https://github.com/finagolfin/swift-android-sdk/blob/main/swift-android.patch#L110
88-
perl -pi -e 's/#if os\(Windows\)/#if os\(Android\)/g' $PATCHDIR/swift-android.patch
89-
90-
# remove the need to link in android-execinfo
91-
perl -pi -e 's/dispatch android-execinfo/dispatch/g' $PATCHDIR/swift-android.patch
92-
93-
git apply -v $PATCHDIR/swift-android.patch
94-
# swift-android-ci.patch is not needed, since it is only used for llbuild, etc.
95-
#git apply -C1 $PATCHDIR/swift-android-ci.patch
96-
#git apply -v $PATCHDIR/swift-android-ci-release.patch
97-
if [ "${BUILD_VERSION}" = 'release' ]; then
98-
git apply -v $PATCHDIR/swift-android-testing-release.patch
99-
else
100-
git apply -v $PATCHDIR/swift-android-testing-except-release.patch
101-
fi
102-
103-
perl -pi -e 's%String\(cString: getpass%\"fake\" //%' swiftpm/Sources/PackageRegistryCommand/PackageRegistryCommand+Auth.swift
104-
# disable backtrace() for Android (needs either API33+ or libandroid-execinfo, or to manually add in backtrace backport)
105-
perl -pi -e 's/os\(Android\)/os\(AndroidDISABLED\)/g' swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
106-
107-
# need to un-apply libandroid-spawn since we don't need it for API28+
108-
perl -pi -e 's/MATCHES "Android"/MATCHES "AndroidDISABLED"/g' llbuild/lib/llvm/Support/CMakeLists.txt
109-
perl -pi -e 's/ STREQUAL Android\)/ STREQUAL AndroidDISABLED\)/g' swift-corelibs-foundation/Sources/Foundation/CMakeLists.txt
110-
popd
111-
fi
30+
scripts/fetch-source.sh --source-dir source
11231

113-
./scripts/build.sh --products-dir ${SDKROOT}/products --source-dir ${SDKROOT}/src --build-dir ${SDKROOT}/build --ndk-home ${ANDROID_NDK_HOME} --android-api ${ANDROID_API} --host-toolchain ${HOST_TOOLCHAIN} --archs ${TARGET_ARCHS} ${@}
32+
mkdir -p products
11433

34+
# Run the build
35+
$DOCKER run -it --rm \
36+
-v ./source:/source \
37+
-v ./products:/products \
38+
swift-android \
39+
/scripts/build.sh --source-dir /source --products-dir /products

swift-ci/sdks/android/build-local

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#!/bin/bash -e
2+
# Swift Android SDK: Top-level Build Script
3+
4+
# default architectures to build for
5+
TARGET_ARCHS=${TARGET_ARCHS:-aarch64,x86_64,armv7}
6+
7+
ANDROID_NDK_VERSION=android-ndk-r27c
8+
ANDROID_API=28
9+
10+
SDKROOT=${RUNNER_TEMP:-${TMPDIR:-'/tmp'}}/swift-android-sdk
11+
mkdir -p ${SDKROOT}
12+
13+
# Install a Swift host toolchain if it isn't already present
14+
SWIFT_ROOT=${SDKROOT}/host-toolchain
15+
HOST_OS=ubuntu$(lsb_release -sr)
16+
17+
#BUILD_VERSION='release'
18+
#BUILD_VERSION='trunk'
19+
BUILD_VERSION=${BUILD_VERSION:-'devel'}
20+
21+
if [ "${BUILD_VERSION}" = 'release' ]; then
22+
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/releases | grep -m1 swift-6.1 | cut -d- -f2)
23+
SWIFT_TAG="swift-${LATEST_TOOLCHAIN_VERSION}-RELEASE"
24+
SWIFT_BRANCH="swift-$(echo $SWIFT_TAG | cut -d- -f2)-release"
25+
elif [ "${BUILD_VERSION}" = 'devel' ]; then
26+
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-6.2-DEV | cut -d- -f8-10)
27+
SWIFT_TAG="swift-6.2-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
28+
SWIFT_BRANCH="swift-$(echo $SWIFT_TAG | cut -d- -f2)-branch"
29+
elif [ "${BUILD_VERSION}" = 'trunk' ]; then
30+
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-DEV | cut -d- -f7-9)
31+
SWIFT_TAG="swift-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
32+
SWIFT_BRANCH="development"
33+
else
34+
echo "$0: invalid BUILD_VERSION=${BUILD_VERSION}"
35+
exit 1
36+
fi
37+
38+
SWIFT_BASE=$SWIFT_TAG-$HOST_OS
39+
40+
if [[ ! -d "$SWIFT_ROOT/$SWIFT_BASE" ]]; then
41+
mkdir -p $SWIFT_ROOT
42+
pushd $SWIFT_ROOT
43+
44+
SWIFT_URL="https://download.swift.org/$SWIFT_BRANCH/$(echo $HOST_OS | tr -d '.')/$SWIFT_TAG/$SWIFT_BASE.tar.gz"
45+
wget -q $SWIFT_URL
46+
tar xzf $SWIFT_BASE.tar.gz
47+
48+
popd
49+
fi
50+
51+
#HOST_TOOLCHAIN=${HOST_TOOLCHAIN:-$(dirname $(dirname $(which swiftc)))}
52+
HOST_TOOLCHAIN=$SWIFT_ROOT/$SWIFT_BASE/usr
53+
$HOST_TOOLCHAIN/bin/swift --version
54+
55+
# ensure the correct Swift is first in the PATH
56+
export PATH=$HOST_TOOLCHAIN/bin:$PATH
57+
58+
export ANDROID_NDK_HOME=${SDKROOT}/ndk/${ANDROID_NDK_VERSION}
59+
export ANDROID_NDK=${ANDROID_NDK_HOME}
60+
61+
if [[ ! -d ${ANDROID_NDK_HOME} ]]; then
62+
mkdir -p $(dirname ${ANDROID_NDK_HOME})
63+
pushd $(dirname ${ANDROID_NDK_HOME})
64+
NDKFILE=$(basename $ANDROID_NDK_HOME)-linux.zip
65+
wget -q https://dl.google.com/android/repository/${NDKFILE}
66+
unzip -q ${NDKFILE}
67+
popd
68+
fi
69+
70+
mkdir -p ${SDKROOT}/products
71+
72+
# Check-out the sources
73+
if [[ ! -d ${SDKROOT}/src ]]; then
74+
scripts/fetch-source.sh --source-dir ${SDKROOT}/src --swift-tag ${SWIFT_TAG}
75+
fi
76+
77+
# fetch and apply the patches
78+
PATCHDIR=${SDKROOT}/patches
79+
if [[ ! -d ${PATCHDIR} ]]; then
80+
git clone https://github.com/finagolfin/swift-android-sdk.git ${PATCHDIR}
81+
82+
# TODO: need to selectively apply patches based on release or not release
83+
pushd ${SDKROOT}/src/swift-project
84+
echo "Applying patches"
85+
86+
# patch the patch, which seems to only be needed for an API less than 28
87+
# https://github.com/finagolfin/swift-android-sdk/blob/main/swift-android.patch#L110
88+
perl -pi -e 's/#if os\(Windows\)/#if os\(Android\)/g' $PATCHDIR/swift-android.patch
89+
90+
# remove the need to link in android-execinfo
91+
perl -pi -e 's/dispatch android-execinfo/dispatch/g' $PATCHDIR/swift-android.patch
92+
93+
git apply -v $PATCHDIR/swift-android.patch
94+
# swift-android-ci.patch is not needed, since it is only used for llbuild, etc.
95+
#git apply -C1 $PATCHDIR/swift-android-ci.patch
96+
#git apply -v $PATCHDIR/swift-android-ci-release.patch
97+
if [ "${BUILD_VERSION}" = 'release' ]; then
98+
git apply -v $PATCHDIR/swift-android-testing-release.patch
99+
else
100+
git apply -v $PATCHDIR/swift-android-testing-except-release.patch
101+
fi
102+
103+
perl -pi -e 's%String\(cString: getpass%\"fake\" //%' swiftpm/Sources/PackageRegistryCommand/PackageRegistryCommand+Auth.swift
104+
# disable backtrace() for Android (needs either API33+ or libandroid-execinfo, or to manually add in backtrace backport)
105+
perl -pi -e 's/os\(Android\)/os\(AndroidDISABLED\)/g' swift-testing/Sources/Testing/SourceAttribution/Backtrace.swift
106+
107+
# need to un-apply libandroid-spawn since we don't need it for API28+
108+
perl -pi -e 's/MATCHES "Android"/MATCHES "AndroidDISABLED"/g' llbuild/lib/llvm/Support/CMakeLists.txt
109+
perl -pi -e 's/ STREQUAL Android\)/ STREQUAL AndroidDISABLED\)/g' swift-corelibs-foundation/Sources/Foundation/CMakeLists.txt
110+
popd
111+
fi
112+
113+
./scripts/build.sh --products-dir ${SDKROOT}/products --source-dir ${SDKROOT}/src --build-dir ${SDKROOT}/build --ndk-home ${ANDROID_NDK_HOME} --android-api ${ANDROID_API} --host-toolchain ${HOST_TOOLCHAIN} --archs ${TARGET_ARCHS} ${@}
114+

0 commit comments

Comments
 (0)