Add support for Apple Silicon builds via Cirrus CI

rnhmjoj
Joe Donofry 2022-10-27 22:21:58 +00:00
parent 48ecc2b45a
commit 35b18700ac
6 changed files with 119 additions and 84 deletions

32
.ci/macos/build.sh Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env sh
set -u
# unused
#TAG=$(git tag -l --points-at HEAD)
# Add Qt binaries to path
PATH="$(brew --prefix qt5):${PATH}"
export PATH
CMAKE_PREFIX_PATH="$(brew --prefix qt5)"
export CMAKE_PREFIX_PATH
cmake -GNinja -S. -Bbuild \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=.deps/usr \
-DHUNTER_ROOT="../.hunter" \
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo \
-DUSE_BUNDLED_OPENSSL=ON \
-DCI_BUILD=ON
cmake --build build
( cd build || exit
git clone https://github.com/Nheko-Reborn/qt-jdenticon.git
( cd qt-jdenticon || exit
qmake
make -j 4
cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS
)
macdeployqt nheko.app -always-overwrite -qmldir=../resources/qml/
)

View File

@ -1,34 +0,0 @@
#!/usr/bin/env sh
set -eux
# unused
#TAG=$(git tag -l --points-at HEAD)
# Add Qt binaries to path
PATH=/usr/local/opt/qt@5/bin/:${PATH}
( cd build
# macdeployqt does not copy symlinks over.
# this specifically addresses icu4c issues but nothing else.
ICU_LIB="$(brew --prefix icu4c)/lib"
export ICU_LIB
mkdir -p nheko.app/Contents/Frameworks
find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/
user=$(id -nu)
chown "${user}" nheko.dmg
mv nheko.dmg ..
)
dmgbuild -s ./.ci/macos/settings.json "Nheko" nheko.dmg
VERSION=${CI_COMMIT_SHORT_SHA}
if [ -n "$VERSION" ]; then
mv nheko.dmg "nheko-${VERSION}.dmg"
mkdir artifacts
cp "nheko-${VERSION}.dmg" artifacts/
fi

View File

@ -7,24 +7,28 @@ set -u
# Add Qt binaries to path
PATH="/usr/local/opt/qt@5/bin/:${PATH}"
export PATH
security unlock-keychain -p "${RUNNER_USER_PW}" login.keychain
( cd build || exit
# macdeployqt does not copy symlinks over.
# this specifically addresses icu4c issues but nothing else.
# We might not even need this any longer...
# ICU_LIB="$(brew --prefix icu4c)/lib"
# export ICU_LIB
# mkdir -p nheko.app/Contents/Frameworks
# find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
if [ "${CI_PIPELINE_TRIGGERED}" ] && [ "${TRIGGERED_BY}" = "cirrus" ]; then
echo "cirrus build id: ${TRIGGER_BUILD_ID}"
cat "${TRIGGER_PAYLOAD}"
# download the build artifacts from cirrus api
curl "https://api.cirrus-ci.com/v1/artifact/build/${TRIGGER_BUILD_ID}/binaries.zip" -o binaries.zip
# cirrus ci artifacts task name is 'binaries' so that's the zip name.
unzip binaries.zip
# we zip 'build/nheko.app' in cirrus ci, cirrus itself puts it in a 'build' directory
# so move it to the right place for the rest of the process.
( cd build || exit
unzip nheko.zip
)
fi
#macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/ -sign-for-notarization="${APPLE_DEV_IDENTITY}"
macdeployqt nheko.app -always-overwrite -qmldir=../resources/qml/
# user=$(id -nu)
# chown "${user}" nheko.dmg
)
if [ ! -d "build/nheko.app" ]; then
echo "nheko.app is missing, you did something wrong!"
exit 1
fi
echo "[INFO] Signing app contents"
find "build/nheko.app/Contents"|while read -r fname; do
@ -46,6 +50,7 @@ trap finish EXIT
dmgbuild -s .ci/macos/settings.json "Nheko" nheko.dmg
codesign -s "${APPLE_DEV_IDENTITY}" nheko.dmg
user=$(id -nu)
chown "${user}" nheko.dmg
@ -72,7 +77,7 @@ while sleep 60 && date; do
#isSuccess=$(grep "success" "$NOTARIZE_STATUS_LOG")
#isFailure=$(grep "invalid" "$NOTARIZE_STATUS_LOG")
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
if [ "${sub_status}" = "Accepted" ]; then
echo "Notarization done!"
@ -82,6 +87,7 @@ while sleep 60 && date; do
fi
if [ "${sub_status}" = "Invalid" ] || [ "${sub_status}" = "Rejected" ]; then
echo "Notarization failed"
xcrun notarytool log "${requestUUID}" --apple-id "${APPLE_DEV_USER}" --password "${APPLE_DEV_PASS}" --team-id "${APPLE_TEAM_ID}" > "$NOTARIZE_STATUS_LOG" 2>&1
cat "$NOTARIZE_STATUS_LOG" 1>&2
exit 1
fi
@ -91,7 +97,7 @@ done
VERSION=${CI_COMMIT_SHORT_SHA}
if [ -n "$VERSION" ]; then
mv nheko.dmg "nheko-${VERSION}.dmg"
mv nheko.dmg "nheko-${VERSION}_${PLAT}.dmg"
mkdir artifacts
cp "nheko-${VERSION}.dmg" artifacts/
cp "nheko-${VERSION}_${PLAT}.dmg" artifacts/
fi

24
.cirrus.yml Normal file
View File

@ -0,0 +1,24 @@
task:
macos_instance:
image: ghcr.io/cirruslabs/macos-monterey-xcode:13
name: Build - macOS Apple Silicon
only_if: $CIRRUS_REPO_OWNER == 'Nheko-Reborn'
environment:
GITLAB_TRIGGER_TOKEN: ENCRYPTED[!5fb4bbdecbde3b2c766ac7383dca573cd5ec8b815c5ac9bede0cadfe9ad70ecd3e64b1728f7840da087099f3fc1fd4f7!]
homebrew_script:
- brew bundle --file .ci/macos/Brewfile
build_script:
- export PATH="$(brew --prefix qt5)/bin/:${PATH}"
- ./.ci/macos/build.sh
zip_script:
- ditto -c -k --sequesterRsrc --keepParent build/nheko.app build/nheko.zip
gitlab_script:
- curl -X POST
--fail
-F token="${GITLAB_TRIGGER_TOKEN}"
-F ref="${CIRRUS_BRANCH}"
-F "variables[TRIGGER_BUILD_ID]=${CIRRUS_BUILD_ID}"
-F "variables[TRIGGERED_BY]=cirrus"
"https://nheko.im/api/v4/projects/2/trigger/pipeline"
binaries_artifacts:
path: build/nheko.zip

View File

@ -14,10 +14,10 @@ build-clazy:
before_script:
- apt-get update
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake liblmdb-dev libre2-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
script:
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
@ -28,6 +28,8 @@ build-clazy:
-DCMAKE_BUILD_TYPE=Release
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF -DCMAKE_CXX_COMPILER=clazy
- cmake --build build
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -41,11 +43,11 @@ build-gcc11:
TRAVIS_OS_NAME: linux
before_script:
- apt-get update
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
# need recommended deps for wget
- apt-get -y install wget
- /usr/sbin/update-ccache-symlinks
@ -63,6 +65,8 @@ build-gcc11:
- cmake --build build
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -77,11 +81,11 @@ build-gcc10:
TRAVIS_OS_NAME: linux
before_script:
- apt-get update
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
# need recommended deps for wget
- apt-get -y install wget
- /usr/sbin/update-ccache-symlinks
@ -100,6 +104,8 @@ build-gcc10:
- cmake --build build
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -112,22 +118,11 @@ build-macos:
before_script:
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt@5
- cmake -GNinja -H. -Bbuild
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo
-DUSE_BUNDLED_OPENSSL=ON
-DUSE_BUNDLED_BOOST=ON
-DCI_BUILD=ON
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.15
- cmake --build build
- (cd build && git clone https://github.com/Nheko-Reborn/qt-jdenticon.git && cd qt-jdenticon && qmake && make -j 4 && cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS)
- ./.ci/macos/build.sh
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
artifacts:
paths:
- build/nheko.app
@ -143,22 +138,27 @@ build-macos:
codesign-macos:
stage: deploy
tags: [macos]
variables:
PLAT: "intel"
before_script:
- 'brew upgrade qt@5'
- pip3 install dmgbuild
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
- ./.ci/macos/notarize.sh
after_script:
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
needs:
- build-macos
- job: build-macos
optional: true # optional since we want to be able to also trigger this job from cirrus ci for apple silicon builds.
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
- if : '$CI_COMMIT_BRANCH == "master"'
- if : $CI_COMMIT_TAG
- if : '$CI_PIPELINE_TRIGGERED && $CI_COMMIT_REF_PROTECTED'
variables:
PLAT: "m1"
artifacts:
paths:
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
- /tmp/notarize*
name: nheko-${CI_COMMIT_SHORT_SHA}-macos
@ -181,6 +181,8 @@ build-flatpak-amd64:
after_script:
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-amd64.flatpak
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -209,6 +211,8 @@ build-flatpak-arm64:
after_script:
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-arm64.flatpak
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -230,4 +234,6 @@ linting:
script:
- make lint
- make license
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'

View File

@ -1,3 +1,4 @@
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)