You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
8.7 KiB

name: macOS
on:
workflow_call:
workflow_dispatch:
jobs:
# This job is mainly to make sure Notes will compile with Qt from homebrew's repository.
# So it doesn't make much sense to have different build types other than 'debug' here.
# The release dmg is built using aqtinstall instead (the job below this one).
build-homebrew:
name: Build (${{ matrix.build-type }}, homebrew (qt${{ matrix.qt-version-major }}), ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-12
qt-version-major: 5
build-type: debug
- os: macos-12
qt-version-major: 6
build-type: debug
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Qt ${{ matrix.qt-version-major }} (homebrew)
env:
# TODO: remove once https://github.com/actions/setup-python/issues/577 gets fixed.
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
run: |
brew update
brew install ninja qt@${{ matrix.qt-version-major }}
- name: Configure Qt ${{ matrix.qt-version-major }} (homebrew)
run: |
brew link qt@${{ matrix.qt-version-major }}
cat << EOF
LDFLAGS="-L/usr/local/opt/qt@${{ matrix.qt-version-major }}/lib"
export CPPFLAGS="-I/usr/local/opt/qt@${{ matrix.qt-version-major }}/include"
export PATH="/usr/local/opt/qt@${{ matrix.qt-version-major }}/bin:$PATH"
EOF >> ~/.bashrc
- name: Setup CLang problem matcher
# Technically, this action only supports GCC, but it seems to work well for Clang too.
if: matrix.build-type == 'debug'
uses: ammaraskar/gcc-problem-matcher@0.3.0
- name: Build (${{ matrix.build-type }})
env:
VERBOSE: 1
run: |
export CMAKE_BUILD_PARALLEL_LEVEL=$(sysctl -n hw.logicalcpu)
cmake . --warn-uninitialized --warn-unused-vars \
-G Ninja -B build \
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
-DCMAKE_PREFIX_PATH="$(brew --prefix qt@${{ matrix.qt-version-major }})" \
-DPRO_VERSION=OFF
cmake --build build
# Build the dmg disk image using the official Qt 5 release downloaded by aqtinstall.
# This is also done for Linux and Windows, just to make sure we use the exact same Qt version across all three OSes.
#
# NOTE: This job uses a fixed Qt version (set in the 'qt-version' key below)!
# So, remember to keep it updated whenever a new Qt version is available on aqtinstall.
dmg-aqtinstall:
name: dmg (${{ matrix.build-type }}, Qt ${{ matrix.qt-version }}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-11
qt-version: 5.15.2
build-type: release
- os: macos-11
qt-version: 6.5.2
build-type: release
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup variables
id: vars
run: |
set -x
version=$(grep -Em1 '\bAPP_VERSION' CMakeLists.txt | sed -r 's/.*APP_VERSION +//; s/ *)//')
if [ -z "${version}" ]
then
echo 'Failed to extract app version from CMakeLists.txt.'
exit 1
fi
if [ '${{ github.ref_type }}' != 'tag' ]
then
version="${version}+g${GITHUB_SHA::7}"
fi
arches='x86_64'
if [[ '${{ matrix.qt-version }}' == 6.* ]]
then
arches+='-arm64'
fi
artifact_name="Notes_${version}-Qt${{ matrix.qt-version }}-${arches}"
if [ '${{ matrix.build-type }}' == 'debug' ]
then
file_name="${artifact_name}-debug.dmg"
else
file_name="${artifact_name}.dmg"
fi
echo "version=${version}" >> "${GITHUB_OUTPUT}"
echo "artifact_name=${artifact_name}" >> "${GITHUB_OUTPUT}"
echo "file_name=${file_name}" >> "${GITHUB_OUTPUT}"
- name: Install Qt ${{ matrix.qt-version }} (aqtinstall)
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt-version }}
cache: true
- name: Install dependencies
run: |
brew update
brew install create-dmg ninja
- name: Build (${{ matrix.build-type }})
env:
# Only commercial Qt 5 supports targeting Apple Silicon at the moment:
# https://www.qt.io/blog/qt-on-apple-silicon
TARGET_ARCH: ${{ startsWith(matrix.qt-version, '6.') && 'x86_64;arm64' || 'x86_64' }}
VERBOSE: 1
run: |
export CMAKE_BUILD_PARALLEL_LEVEL=$(sysctl -n hw.logicalcpu)
cmake . --warn-uninitialized --warn-unused-vars \
-B build -G Ninja \
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
-DGIT_REVISION=${{ github.ref_type != 'tag' && 'ON' || 'OFF' }} \
-DCMAKE_OSX_ARCHITECTURES="${{ env.TARGET_ARCH }}" \
-DPRO_VERSION=OFF
cmake --build build
- name: (FIXME) Run qmllint
if: startsWith(matrix.qt-version, '6.')
run: |
cmake --build build --target all_qmllint || true
- name: Install (${{ matrix.build-type }})
run: |
cmake --install build --prefix .
- name: Deploy (${{ matrix.build-type }})
run: |
cd build
plutil -insert NSRequiresAquaSystemAppearance -bool true Notes.app/Contents/Info.plist
# Rename the app folder to "Notes Better", so it doesn't conflict with macOS' "Notes" app.
mv Notes.app 'Notes Better.app'
macdeployqt 'Notes Better.app' -qmldir=../src/qml -appstore-compliant
- name: Remove unnecessary Qt plugins and libraries
run: |
set -x
set -e
cd 'build/Notes Better.app'
if [[ '${{ matrix.qt-version }}' == 5.* ]]
then
# The bearer plugin has caused problems for us in the past. Plus, it was removed altogether in Qt 6.
rm -rv Contents/PlugIns/bearer
fi
- name: Import signing certificate
if: github.repository == 'nuttyartist/notes' && github.event_name != 'pull_request'
run: |
openssl base64 -d -out cert.p12 <<< '${{ secrets.MACOS_CERTIFICATE }}'
security create-keychain -p '${{ secrets.KEYCHAIN_PWD }}' nuttyartist/notes
security default-keychain -s nuttyartist/notes
security unlock-keychain -p '${{ secrets.KEYCHAIN_PWD }}' nuttyartist/notes
security -q import cert.p12 -f pkcs12 -k nuttyartist/notes -P '${{ secrets.MACOS_CERTIFICATE_PWD }}' -T /usr/bin/codesign -x
security set-key-partition-list -S 'apple-tool:,apple:' -s -k '${{ secrets.KEYCHAIN_PWD }}' nuttyartist/notes
- name: Sign
if: github.repository == 'nuttyartist/notes' && github.event_name != 'pull_request'
run: |
codesign --deep --force --verify --verbose --sign Mamistvalove --options runtime 'build/Notes Better.app'
- name: Build dmg (${{ matrix.build-type }})
run: |
cd build
create-dmg \
--no-internet-enable \
--format ULFO \
--background ../packaging/macos/dmg-background.png \
--hide-extension 'Notes Better.app' \
--icon 'Notes Better.app' 180 170 \
--icon-size 160 \
--text-size 12 \
--volname Notes \
--volicon ../src/images/notes_icon.icns \
--window-size 660 400 \
--app-drop-link 480 170 \
'${{ steps.vars.outputs.file_name }}' \
'Notes Better.app'
- name: Notarize
if: github.repository == 'nuttyartist/notes' && github.event_name != 'pull_request'
run: |
xcrun notarytool submit \
--apple-id '${{ secrets.NOTARIZATION_USERNAME }}' \
--password '${{ secrets.NOTARIZATION_PASSWORD }}' \
--team-id '${{ secrets.NOTARIZATION_TEAM }}' \
--wait \
'build/${{ steps.vars.outputs.file_name }}'
- name: Staple
if: github.repository == 'nuttyartist/notes' && github.event_name != 'pull_request'
run: |
xcrun stapler staple 'build/${{ steps.vars.outputs.file_name }}'
- name: Upload dmg artifact (${{ matrix.build-type }})
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ steps.vars.outputs.artifact_name }}-${{ runner.os }}-${{ matrix.build-type }}
path: build/${{ steps.vars.outputs.file_name }}