Skip to content

Commit f46b164

Browse files
committed
Add builder for MacOS
1 parent 36de3f6 commit f46b164

File tree

2 files changed

+254
-0
lines changed

2 files changed

+254
-0
lines changed

.github/workflows/macos_build.yml

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
name: MacOS Build Steps
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
build_macos:
7+
name: macOS Build
8+
runs-on: macos-14
9+
env:
10+
CCACHE_BASEDIR: ${{ github.workspace }}
11+
CCACHE_DIR: ${{ github.workspace }}/.ccache
12+
CCACHE_COMPRESS: true
13+
CCACHE_COMPRESSLEVEL: 9
14+
CCACHE_MAXSIZE: 200M
15+
16+
steps:
17+
- name: Checkout Repository
18+
uses: actions/checkout@v4
19+
with:
20+
submodules: recursive
21+
22+
- name: Install Packages
23+
env:
24+
HOMEBREW_NO_INSTALL_CLEANUP: 1
25+
HOMEBREW_NO_ANALYTICS: 1
26+
run: |
27+
if ! brew install ccache ninja; then
28+
brew update
29+
brew install ccache ninja
30+
fi
31+
32+
- name: Cache Dependencies
33+
id: cache-deps
34+
uses: actions/cache@v4
35+
with:
36+
path: ~/deps
37+
key: macOS deps ${{ hashFiles('.github/workflows/scripts/macos/build-dependencies.sh') }}
38+
39+
- name: Build Dependencies
40+
if: steps.cache-deps.outputs.cache-hit != 'true'
41+
run: .github/workflows/scripts/macos/build-dependencies.sh
42+
43+
- name: Cache MoltenVK
44+
id: cache-moltenvk
45+
uses: actions/cache@v4
46+
with:
47+
path: ~/moltenvk
48+
key: macOS MoltenVK ${{ hashFiles('Externals/MoltenVK') }}
49+
50+
- name: Build MoltenVK
51+
if: steps.cache-moltenvk.outputs.cache-hit != 'true'
52+
run: |
53+
MVK_VER="$(sed -nr 's/^.*set\(MOLTENVK_VERSION "([^"]+)".*$/\1/p' Externals/MoltenVK/CMakeLists.txt)"
54+
if [ -z "$MVK_VER" ]; then
55+
echo "::error::Failed to parse MoltenVK version from CMakeLists"
56+
exit 1
57+
fi
58+
git clone --depth 1 --branch "$MVK_VER" https://github.com/KhronosGroup/MoltenVK.git mvk-build
59+
pushd mvk-build
60+
git apply ../Externals/MoltenVK/patches/*.patch
61+
./fetchDependencies --macos
62+
make macos
63+
ls -l Package/Release/MoltenVK/dynamic/*
64+
chmod 755 Package/Release/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib
65+
mkdir -p "$HOME/moltenvk/lib/"
66+
mv Package/Release/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib "$HOME/moltenvk/lib/"
67+
popd
68+
rm -rf mvk-build
69+
70+
# -- SETUP CCACHE - https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/
71+
- name: Prepare ccache timestamp
72+
id: ccache_cache_timestamp
73+
run: echo "timestamp=$(date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
74+
75+
- name: Cache ccache cache
76+
uses: actions/cache@v4
77+
with:
78+
path: .ccache
79+
key: macOS ccache ${{ steps.ccache_cache_timestamp.outputs.timestamp }}
80+
restore-keys: macOS ccache
81+
82+
- name: Generate CMake Files
83+
run: |
84+
COMMON_ARGS=(
85+
-DCMAKE_PREFIX_PATH="$HOME/deps;$HOME/moltenvk"
86+
-DCMAKE_BUILD_TYPE=Release
87+
-DUSE_BUNDLED_MOLTENVK=OFF
88+
-DMACOS_CODE_SIGNING=OFF
89+
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON
90+
-DCMAKE_C_COMPILER_LAUNCHER=ccache
91+
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
92+
-DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON
93+
-DUSE_SYSTEM_LIBS=OFF
94+
-DUSE_SYSTEM_BZIP2=ON
95+
-DUSE_SYSTEM_CURL=ON
96+
-DUSE_SYSTEM_ICONV=ON
97+
-DUSE_SYSTEM_SDL2=ON
98+
-GNinja
99+
)
100+
101+
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 \
102+
-DCMAKE_SYSTEM_PROCESSOR=x86_64 \
103+
-DCMAKE_SYSTEM_NAME=Darwin \
104+
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 \
105+
"${COMMON_ARGS[@]}" \
106+
-B build .
107+
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 \
108+
-DCMAKE_SYSTEM_PROCESSOR=arm64 \
109+
-DCMAKE_SYSTEM_NAME=Darwin \
110+
-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
111+
"${COMMON_ARGS[@]}" \
112+
-B build-arm .
113+
114+
- name: Build Dolphin (x86_64)
115+
working-directory: build
116+
run: |
117+
ccache -p
118+
ccache -s
119+
ccache -z
120+
ninja dolphin-emu
121+
ccache -s
122+
123+
- name: Build Dolphin (arm64)
124+
working-directory: build-arm
125+
run: |
126+
ccache -p
127+
ccache -s
128+
ccache -z
129+
ninja dolphin-emu
130+
ccache -s
131+
132+
- name: Prepare Build Artifacts
133+
id: create-artifact
134+
env:
135+
EVENT_NAME: ${{ github.event_name }}
136+
PR_TITLE: ${{ github.event.pull_request.title }}
137+
PR_NUM: ${{ github.event.pull_request.number }}
138+
PR_SHA: ${{ github.event.pull_request.head.sha }}
139+
run: |
140+
lipo -create build/Binaries/DolphinQt.app/Contents/MacOS/DolphinQt build-arm/Binaries/DolphinQt.app/Contents/MacOS/DolphinQt -o dolphin
141+
mv dolphin build/Binaries/DolphinQt.app/Contents/MacOS/DolphinQt
142+
TAG="$(git tag --points-at HEAD)"
143+
if [ ! -z "$TAG" ]; then
144+
SUFFIX="$TAG"
145+
elif [ "$EVENT_NAME" == "pull_request" ]; then
146+
PR_TITLE=$(echo "${PR_TITLE}" | tr -cd '[a-zA-Z0-9[:space:]]_-')
147+
SUFFIX="pr[$PR_NUM]-sha[$PR_SHA]-title[$PR_TITLE"
148+
SUFFIX=$(printf "%.99s]" "$SUFFIX")
149+
else
150+
SUFFIX="sha[$(git rev-parse --short HEAD)]"
151+
fi
152+
APPNAME="PrimeHack-$SUFFIX"
153+
mv build/Binaries/DolphinQt.app "$APPNAME.app"
154+
tar --options xz:compression-level=9 -cvJf "$APPNAME.tar.xz" "$APPNAME.app"
155+
echo "name=$APPNAME" >> "$GITHUB_OUTPUT"
156+
157+
- name: Upload Artifact
158+
uses: actions/upload-artifact@v4
159+
with:
160+
name: ${{ steps.create-artifact.outputs.name }}
161+
path: "*.tar.xz"
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
export MACOSX_DEPLOYMENT_TARGET=10.15
6+
INSTALLDIR="$HOME/deps"
7+
NPROCS="$(getconf _NPROCESSORS_ONLN)"
8+
SDL=SDL2-2.30.9
9+
QT=6.2.10
10+
QT_SUFFIX=-opensource
11+
12+
mkdir deps-build
13+
cd deps-build
14+
15+
export PKG_CONFIG_PATH="$INSTALLDIR/lib/pkgconfig:$PKG_CONFIG_PATH"
16+
export LDFLAGS="-L$INSTALLDIR/lib -dead_strip $LDFLAGS"
17+
export CFLAGS="-I$INSTALLDIR/include -Os $CFLAGS"
18+
export CXXFLAGS="-I$INSTALLDIR/include -Os $CXXFLAGS"
19+
20+
cat > SHASUMS <<EOF
21+
24b574f71c87a763f50704bbb630cbe38298d544a1f890f099a4696b1d6beba4 $SDL.tar.gz
22+
efbeff5ad6f4d46e82734a681909892401688432fd7ef02c63d2083304d8265c qtbase-everywhere$QT_SUFFIX-src-$QT.tar.xz
23+
5e04e4b7699d837c52641310ca386373801a24e8924de7ffcc4b84890431eb38 qtsvg-everywhere$QT_SUFFIX-src-$QT.tar.xz
24+
62809b242ebcb0e65ac6738f76d005d24c352a8b813128fa3772906ca50cf980 qttools-everywhere$QT_SUFFIX-src-$QT.tar.xz
25+
57e7cb80d31c32ccbb00bbd7da170970b9effb992970aaf687d4524117aca41e qttranslations-everywhere$QT_SUFFIX-src-$QT.tar.xz
26+
EOF
27+
28+
curl -L \
29+
-O "https://libsdl.org/release/$SDL.tar.gz" \
30+
-O "https://download.qt.io/archive/qt/${QT%.*}/$QT/submodules/qtbase-everywhere$QT_SUFFIX-src-$QT.tar.xz" \
31+
-O "https://download.qt.io/archive/qt/${QT%.*}/$QT/submodules/qtsvg-everywhere$QT_SUFFIX-src-$QT.tar.xz" \
32+
-O "https://download.qt.io/archive/qt/${QT%.*}/$QT/submodules/qttools-everywhere$QT_SUFFIX-src-$QT.tar.xz" \
33+
-O "https://download.qt.io/archive/qt/${QT%.*}/$QT/submodules/qttranslations-everywhere$QT_SUFFIX-src-$QT.tar.xz" \
34+
35+
shasum -a 256 --check SHASUMS
36+
37+
echo "Installing SDL..."
38+
tar xf "$SDL.tar.gz"
39+
cd "$SDL"
40+
CC="clang -arch x86_64 -arch arm64" ./configure --prefix "$INSTALLDIR" --without-x
41+
make "-j$NPROCS"
42+
make install
43+
cd ..
44+
45+
echo "Installing Qt Base..."
46+
tar xf "qtbase-everywhere$QT_SUFFIX-src-$QT.tar.xz"
47+
cd "qtbase-everywhere-src-$QT"
48+
cmake -B build -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DFEATURE_optimize_size=ON -DFEATURE_dbus=OFF -DFEATURE_framework=OFF -DFEATURE_icu=OFF -DFEATURE_opengl=OFF -DFEATURE_printsupport=OFF -DFEATURE_sql=OFF -DFEATURE_gssapi=OFF -DFEATURE_system_png=OFF -DFEATURE_system_jpeg=OFF -DCMAKE_MESSAGE_LOG_LEVEL=STATUS
49+
make -C build "-j$NPROCS"
50+
make -C build install
51+
cd ..
52+
53+
echo "Installing Qt SVG..."
54+
tar xf "qtsvg-everywhere$QT_SUFFIX-src-$QT.tar.xz"
55+
cd "qtsvg-everywhere-src-$QT"
56+
cmake -B build -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_BUILD_TYPE=Release
57+
make -C build "-j$NPROCS"
58+
make -C build install
59+
cd ..
60+
61+
echo "Installing Qt Tools..."
62+
tar xf "qttools-everywhere$QT_SUFFIX-src-$QT.tar.xz"
63+
cd "qttools-everywhere-src-$QT"
64+
# Linguist relies on a library in the Designer target, which takes 5-7 minutes to build on the CI
65+
# Avoid it by not building Linguist, since we only need the tools that come with it
66+
patch -u src/linguist/CMakeLists.txt <<EOF
67+
--- src/linguist/CMakeLists.txt
68+
+++ src/linguist/CMakeLists.txt
69+
@@ -14,7 +14,7 @@
70+
add_subdirectory(lrelease-pro)
71+
add_subdirectory(lupdate)
72+
add_subdirectory(lupdate-pro)
73+
-if(QT_FEATURE_process AND QT_FEATURE_pushbutton AND QT_FEATURE_toolbutton AND TARGET Qt::Widgets AND NOT no-png)
74+
+if(QT_FEATURE_process AND QT_FEATURE_pushbutton AND QT_FEATURE_toolbutton AND TARGET Qt::Widgets AND TARGET Qt::PrintSupport AND NOT no-png)
75+
add_subdirectory(linguist)
76+
endif()
77+
EOF
78+
cmake -B build -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=OFF -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF
79+
make -C build "-j$NPROCS"
80+
make -C build install
81+
cd ..
82+
83+
echo "Installing Qt Translations..."
84+
tar xf "qttranslations-everywhere$QT_SUFFIX-src-$QT.tar.xz"
85+
cd "qttranslations-everywhere-src-$QT"
86+
cmake -B build -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_BUILD_TYPE=Release
87+
make -C build "-j$NPROCS"
88+
make -C build install
89+
cd ..
90+
91+
echo "Cleaning up..."
92+
cd ..
93+
rm -r deps-build

0 commit comments

Comments
 (0)