",
+ "MACOSX_BUNDLE_IDENTIFIER": "io.novelwriter.novelWriter",
+ "MACOSX_BUNDLE_NAME": "novelWriter",
+ "MACOSX_BUNDLE_EXACUTABLE_NAME": "novelwriter",
+ "MACOSX_BUNDLE_ICON_FILE": "novelwriter.icns",
+ "MACOSX_BUNDLE_INFO_STRING": "novelWriter: A markdown-like text editor for planning and writing novels.",
+ "MACOSX_BUNDLE_SHORT_VERSION": "2.0.1", # Must be purely numerical
+ "MACOSX_BUNDLE_VERSION": "2.0.1", # Must be purely numerical
+}
+
+if __name__ == "__main__":
+
+ template_filename = os.path.join(SCRIPT_DIR, "Info.plist.in")
+ with open(template_filename, "r") as tmfile:
+ template = tmfile.read()
+
+ plist = template.format(**SETTINGS)
+
+ plist_filename = os.path.join(SCRIPT_DIR, "Info.plist")
+ with open(plist_filename, "w") as plistfile:
+ plistfile.write(plist)
diff --git a/macos/novelwriter.icns b/macos/novelwriter.icns
new file mode 100644
index 0000000000000000000000000000000000000000..8a05c8e916738c6ed6e4b5f3a618927429414dd4
GIT binary patch
literal 77254
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
li%OX|FGRI
Date: Thu, 1 Dec 2022 01:17:14 -0700
Subject: [PATCH 02/12] feat: cleanup build script use python 3.10 use curl
over wget (pre-installed) ensure enchant is installed cleanup better to limit
app bundle size fix Info.plist
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
macos/Info.plist | 2 +-
macos/build.sh | 69 +++++++++++++++++++++++++++++++++++++-----------
2 files changed, 54 insertions(+), 17 deletions(-)
mode change 100644 => 100755 macos/build.sh
diff --git a/macos/Info.plist b/macos/Info.plist
index 835ea503..6db23257 100644
--- a/macos/Info.plist
+++ b/macos/Info.plist
@@ -29,7 +29,7 @@
CFBundlePackageType
APPL
NSHumanReadableCopyright
- © 2018–2022, Veronica Berglyd Olsen
+ © 2018–2022, Veronica Berglyd Olsen <code@vkbo.net>
IFMajorVersion
0
IFMinorVersion
diff --git a/macos/build.sh b/macos/build.sh
old mode 100644
new mode 100755
index 9259d3a7..8956f22d
--- a/macos/build.sh
+++ b/macos/build.sh
@@ -19,6 +19,8 @@ cleanup () {
trap cleanup EXIT
+echo "Building in: $BUILD_DIR"
+
OLD_CWD="$(pwd)"
VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)"
@@ -26,39 +28,61 @@ VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/.
pushd "$BUILD_DIR"/ || exit 1
+echo "Downloading Miniconda ..."
# install Miniconda, a self-contained Python distribution
-wget https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
+curl -LO https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash Miniconda3-latest-MacOSX-x86_64.sh -b -p ~/miniconda -f
rm Miniconda3-latest-MacOSX-x86_64.sh
export PATH="$HOME/miniconda/bin:$PATH"
+echo "Creating conda env ..."
# create conda env
-conda create -n novelWriter python --yes
+conda create -n novelWriter -c conda-forge python=3.10 --yes
source activate novelWriter
+echo "installing dictionaries ..."
+conda install -c conda-forge enchant hunspell-en --yes
+
+echo "installing python deps ..."
# install dependencies
pip install -r "$SCRIPT_DIR/../requirements.txt"
# leave conda env
-source deactivate
+conda deactivate
+echo "Building app bundle ..."
# create .app Framework
mkdir -p novelWriter.app/Contents/
mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWriter.app/Contents/Resources/novelWriter
-mv $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist
+cp $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist
+echo "Copying miniconda env to bundle ..."
# copy Miniconda env
cp -R ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/
-# copy Pext
-cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/
+echo "Copying novelWriter to bundle ..."
+# copy novelWriter
+
+FILES_COPY=(
+ "CHANGELOG.md" "MANIFEST.in" "CREDITS.md" "LICENSE.md"
+ "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "i18n" "novelwriter"
+ "novelWriter.py"
+)
+
+for file in "${FILES_COPY[@]}"; do
+ echo "Copying $SCRIPT_DIR/../$file ..."
+ cp -R $SCRIPT_DIR/../$file novelWriter.app/Contents/Resources/novelWriter/
+done
+
+cp $SCRIPT_DIR/../macos/novelwriter.icns novelWriter.app/Contents/Resources/
+#cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/
# create entry script
cat > novelWriter.app/Contents/MacOS/novelWriter <<\EOF
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-$DIR/../Resources/bin/python -sE $DIR/../Resources/novelWriter/novelwriter $@
+$DIR/../Resources/bin/python -sE $DIR/../Resources/novelWriter/novelWriter.py $@
EOF
# make executable
@@ -67,26 +91,39 @@ chmod a+x novelWriter.app/Contents/MacOS/novelWriter
# remove bloat
pushd novelWriter.app/Contents/Resources || exit 1
+echo "Cleaning unused files from bundle ..."
# cleanup commands HERE
find . -type d -iname '__pycache__' -print0 | xargs -0 rm -r
+rm -rf pkgs
+rm -rf cmake
+rm -rf share/{gtk-,}doc
+
+rm -rf lib/python3.1/
+
#remove web engine
-rm lib/python3.7/site-packages/PyQt5/QtWebEngine* || true
-rm -r lib/python3.7/site-packages/PyQt5/Qt/translations/qtwebengine* || true
-rm lib/python3.7/site-packages/PyQt5/Qt/resources/qtwebengine* || true
-rm -r lib/python3.7/site-packages/PyQt5/Qt/qml/QtWebEngine* || true
-rm -r lib/python3.7/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true
-rm lib/python3.7/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true
-rm lib/python3.7/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true
+rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true
+rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true
+rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true
+rm -r lib/python3.*/site-packages/PyQt5/Qt/qml/QtWebEngine* || true
+rm -r lib/python3.*/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true
+rm lib/python3.*/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true
+rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true
popd || exit 1
popd || exit 1
-
+echo "Packageing App"
# generate .dmg
brew install create-dmg
# "--skip-jenkins" is a temporary workaround for https://github.com/create-dmg/create-dmg/issues/72
-create-dmg --skip-jenkins --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \
+create-dmg --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \
--window-pos 200 120 --window-size 800 400 --icon-size 100 --icon novelWriter.app 200 190 --hide-extension novelWriter.app \
--app-drop-link 600 185 novelWriter-"${VERSION}".dmg "$BUILD_DIR"/
+
+pushd $BUILD_DIR || exit 1
+zip -qr novelWriter.app.zip novelWriter.app
+popd || exit 1
+
+mv $BUILD_DIR/novelWriter.app.zip novelWriter.app.zip
\ No newline at end of file
From faf302c6d89789157d64e2178431267d4b64cc07 Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 02:11:21 -0700
Subject: [PATCH 03/12] feat: add github workflow to build for macos
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 66 +++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
create mode 100644 .github/workflows/build.yml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..550e2910
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,66 @@
+name: Build
+
+on:
+ push:
+ tags:
+ - '*'
+ branches:
+ - 'macos-appbundle'
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - os: macos-12
+ name: macos
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ ##
+ # PREPARE
+ ##
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: 'true'
+
+ - name: Set short version
+ shell: bash
+ run: |
+ ver_short=`git rev-parse --short HEAD`
+ echo "VERSION=$ver_short" >> $GITHUB_ENV
+
+ - name: Install Dependencies (macOS)
+ if: runner.os == 'macOS'
+ run: |
+ brew update
+ brew install create-dmg
+
+ ##
+ # BUILD
+ ##
+
+ - name: Build (macOS)
+ if: runner.os == 'macOS'
+ run: |
+ ./macos/build.sh
+
+ ##
+ # UPLOAD BUILDS
+ ##
+
+ - name: Upload binary zip (macOS)
+ if: runner.os == 'macOS'
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
+ path: novelWriter.app.zip
+
+ - name: Upload dmg (macOS)
+ if: runner.os == 'macOS'
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
+ path: novelWriter-${{ env.VERSION }}.dmg
From 8a9a52da5709e42c11e9e27743b67c6f6a8f0612 Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 02:26:26 -0700
Subject: [PATCH 04/12] fix: pull the version from the python file
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 550e2910..f6c1dd2c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -30,7 +30,9 @@ jobs:
shell: bash
run: |
ver_short=`git rev-parse --short HEAD`
- echo "VERSION=$ver_short" >> $GITHUB_ENV
+ ver_novelwriter=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py`
+ echo "VERSION=$ver_novelwriter" >> $GITHUB_ENV
+ echo "VERSION_SHORT=$ver_short" >> $GITHUB_ENV
- name: Install Dependencies (macOS)
if: runner.os == 'macOS'
From b29b6d6eefc9fd63c3bd0b3a23da373e0893ec5c Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 03:01:43 -0700
Subject: [PATCH 05/12] fix: don't remove the python symlink
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
macos/build.sh | 2 --
1 file changed, 2 deletions(-)
diff --git a/macos/build.sh b/macos/build.sh
index 8956f22d..328c8820 100755
--- a/macos/build.sh
+++ b/macos/build.sh
@@ -99,8 +99,6 @@ rm -rf pkgs
rm -rf cmake
rm -rf share/{gtk-,}doc
-rm -rf lib/python3.1/
-
#remove web engine
rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true
rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true
From 682986d9b9a569e8a11a183ea3b8d97fe4cf1098 Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 03:30:42 -0700
Subject: [PATCH 06/12] fix: add entitlements
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
macos/App.entitlements | 10 ++++++++++
macos/build.sh | 7 ++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 macos/App.entitlements
diff --git a/macos/App.entitlements b/macos/App.entitlements
new file mode 100644
index 00000000..40dc976a
--- /dev/null
+++ b/macos/App.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.cs.disable-library-validation
+
+ com.apple.security.cs.allow-dyld-environment-variables
+
+
+
\ No newline at end of file
diff --git a/macos/build.sh b/macos/build.sh
index 328c8820..79acc276 100755
--- a/macos/build.sh
+++ b/macos/build.sh
@@ -88,6 +88,8 @@ EOF
# make executable
chmod a+x novelWriter.app/Contents/MacOS/novelWriter
+sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter"
+
# remove bloat
pushd novelWriter.app/Contents/Resources || exit 1
@@ -111,7 +113,10 @@ rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true
popd || exit 1
popd || exit 1
-echo "Packageing App"
+echo "Packageing App ..."
+
+
+
# generate .dmg
brew install create-dmg
From a228c4b32ab20c377adf990b808c215c387c3f34 Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 11:49:41 -0700
Subject: [PATCH 07/12] Squashed commit of the following:
commit a1f358b6f0a193be7d3d72fa4082fa09701ebe16
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 11:48:38 2022 -0700
fix: reneable the res of the build
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit 8ed02b09aeb9c302e30023fcbf73c8b5e3bbc8ff
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 11:41:19 2022 -0700
fix: install qt for tools
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit d68dc29d49f1a2547912fc97867126f4fc6d96c4
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 11:32:07 2022 -0700
fix: add tex-gyre to texlive install
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit ff654a2a914cd00c867088baf147f8ccd70a185c
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 11:08:46 2022 -0700
fix: add required latex pkgs
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit 1a4babc11c274f69c6c04edddfc5011f9162759e
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 10:17:31 2022 -0700
fix: install sphinx via pip3
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit 4b602b0955fabc2b5067bae46c3408dab0f0dd72
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 10:05:46 2022 -0700
fix: ensure sphinx is properly installed
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit 59ad26f434d6c5391c2448724aa44587c2cf7a46
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 09:59:40 2022 -0700
feat: install scheme-basic texlive pkg
run setup.py in proper dir
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
commit 16cd50307fbd4519fd6ebdc719e78e99eb37d02b
Author: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu Dec 1 09:54:42 2022 -0700
feat: build manual, translations, and sample project zip
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 61 ++++++++++++++++++++++++++++---------
macos/build.sh | 9 ++++--
2 files changed, 53 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f6c1dd2c..0d4e17b8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -5,7 +5,7 @@ on:
tags:
- '*'
branches:
- - 'macos-appbundle'
+ - 'macos-docs-build'
jobs:
build:
@@ -15,6 +15,12 @@ jobs:
include:
- os: macos-12
name: macos
+ qt_ver: 5
+ qt_host: mac
+ qt_version: '5.15.2'
+ qt_modules: ''
+ qt_tools: ''
+
runs-on: ${{ matrix.os }}
steps:
@@ -33,12 +39,37 @@ jobs:
ver_novelwriter=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py`
echo "VERSION=$ver_novelwriter" >> $GITHUB_ENV
echo "VERSION_SHORT=$ver_short" >> $GITHUB_ENV
+
+ - name: Install Qt (Linux)
+ if: runner.os == 'Linux' && matrix.qt_ver != 6
+ run: |
+ sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5
+
+ - name: Install Qt (macOS, AppImage & Windows MSVC)
+ if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '')
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt_version }}
+ host: ${{ matrix.qt_host }}
+ target: 'desktop'
+ arch: ${{ matrix.qt_arch }}
+ modules: ${{ matrix.qt_modules }}
+ tools: ${{ matrix.qt_tools }}
+ cache: true
+
+ - name: Setup TeX Live
+ uses: teatimeguest/setup-texlive-action@v2
+ with:
+ packages: >-
+ scheme-basic
+ collection-latexextra
+ latexmk
+ tex-gyre
- name: Install Dependencies (macOS)
if: runner.os == 'macOS'
run: |
- brew update
- brew install create-dmg
+ pip3 install sphinx
##
# BUILD
@@ -53,16 +84,16 @@ jobs:
# UPLOAD BUILDS
##
- - name: Upload binary zip (macOS)
- if: runner.os == 'macOS'
- uses: actions/upload-artifact@v3
- with:
- name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
- path: novelWriter.app.zip
+ # - name: Upload binary zip (macOS)
+ # if: runner.os == 'macOS'
+ # uses: actions/upload-artifact@v3
+ # with:
+ # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
+ # path: novelWriter.app.zip
- - name: Upload dmg (macOS)
- if: runner.os == 'macOS'
- uses: actions/upload-artifact@v3
- with:
- name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
- path: novelWriter-${{ env.VERSION }}.dmg
+ # - name: Upload dmg (macOS)
+ # if: runner.os == 'macOS'
+ # uses: actions/upload-artifact@v3
+ # with:
+ # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
+ # path: novelWriter-${{ env.VERSION }}.dmg
diff --git a/macos/build.sh b/macos/build.sh
index 79acc276..4faa875e 100755
--- a/macos/build.sh
+++ b/macos/build.sh
@@ -25,6 +25,13 @@ OLD_CWD="$(pwd)"
VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)"
+pushd "$SCRIPT_DIR/../" || exit 1
+
+python3 setup.py manual qtlrelease sample
+
+ls -lah .
+
+popd || exit 1
pushd "$BUILD_DIR"/ || exit 1
@@ -115,8 +122,6 @@ popd || exit 1
echo "Packageing App ..."
-
-
# generate .dmg
brew install create-dmg
From 82dd1c46cf9a61425dde0c0d6aeffa4acf1d804c Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 11:50:20 -0700
Subject: [PATCH 08/12] fix: force build on this branch for testing
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0d4e17b8..fa3d9290 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -5,7 +5,7 @@ on:
tags:
- '*'
branches:
- - 'macos-docs-build'
+ - 'macos-appbundle'
jobs:
build:
@@ -84,16 +84,16 @@ jobs:
# UPLOAD BUILDS
##
- # - name: Upload binary zip (macOS)
- # if: runner.os == 'macOS'
- # uses: actions/upload-artifact@v3
- # with:
- # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
- # path: novelWriter.app.zip
+ - name: Upload binary zip (macOS)
+ if: runner.os == 'macOS'
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
+ path: novelWriter.app.zip
- # - name: Upload dmg (macOS)
- # if: runner.os == 'macOS'
- # uses: actions/upload-artifact@v3
- # with:
- # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
- # path: novelWriter-${{ env.VERSION }}.dmg
+ - name: Upload dmg (macOS)
+ if: runner.os == 'macOS'
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
+ path: novelWriter-${{ env.VERSION }}.dmg
From b7e7a087f8185f36be46715c6d962e262a6f5781 Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Thu, 1 Dec 2022 15:53:51 -0700
Subject: [PATCH 09/12] fix: remove codesign for now, only build on tags
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 2 --
macos/build.sh | 3 ++-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fa3d9290..e34ab056 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -4,8 +4,6 @@ on:
push:
tags:
- '*'
- branches:
- - 'macos-appbundle'
jobs:
build:
diff --git a/macos/build.sh b/macos/build.sh
index 4faa875e..b04491aa 100755
--- a/macos/build.sh
+++ b/macos/build.sh
@@ -95,7 +95,8 @@ EOF
# make executable
chmod a+x novelWriter.app/Contents/MacOS/novelWriter
-sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter"
+#do codesigning
+#sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter"
# remove bloat
pushd novelWriter.app/Contents/Resources || exit 1
From f912d55177c6c1f3f7580e9531a55b550076960d Mon Sep 17 00:00:00 2001
From: Rachel Powers <508861+Ryex@users.noreply.github.com>
Date: Sun, 8 Jan 2023 21:08:21 -0700
Subject: [PATCH 10/12] refactor: move plist gen into setup.py
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
---
.github/workflows/build.yml | 15 +--
macos/Info.plist | 60 ------------
macos/Info.plist.in | 60 ------------
macos/generate_plist.py | 26 ------
setup.py | 116 ++++++++++++++++++++++++
{macos => setup/macos}/App.entitlements | 0
{macos => setup/macos}/build.sh | 30 +++---
{macos => setup/macos}/generate_icns.sh | 2 +-
{macos => setup/macos}/novelwriter.icns | Bin
9 files changed, 139 insertions(+), 170 deletions(-)
delete mode 100644 macos/Info.plist
delete mode 100644 macos/Info.plist.in
delete mode 100644 macos/generate_plist.py
rename {macos => setup/macos}/App.entitlements (100%)
rename {macos => setup/macos}/build.sh (82%)
rename {macos => setup/macos}/generate_icns.sh (95%)
rename {macos => setup/macos}/novelwriter.icns (100%)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index e34ab056..1f66fb62 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -76,22 +76,17 @@ jobs:
- name: Build (macOS)
if: runner.os == 'macOS'
run: |
- ./macos/build.sh
+ ./setup/macos/build.sh
##
# UPLOAD BUILDS
##
- - name: Upload binary zip (macOS)
+ - name: Upload binary zip / dmg (macOS)
if: runner.os == 'macOS'
uses: actions/upload-artifact@v3
with:
name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip
- path: novelWriter.app.zip
-
- - name: Upload dmg (macOS)
- if: runner.os == 'macOS'
- uses: actions/upload-artifact@v3
- with:
- name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg
- path: novelWriter-${{ env.VERSION }}.dmg
+ path: |
+ dist_macos/novelWriter-${{ env.VERSION }}.zip
+ dist_macos/novelWriter-${{ env.VERSION }}.dmg
diff --git a/macos/Info.plist b/macos/Info.plist
deleted file mode 100644
index 6db23257..00000000
--- a/macos/Info.plist
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
- NSPrincipalClass
- NSApplication
- NSHighResolutionCapable
- True
- CFBundleDevelopmentRegion
- English
- CFBundleExecutable
- novelwriter
- CFBundleGetInfoString
- novelWriter: A markdown-like text editor for planning and writing novels.
- CFBundleIconFile
- novelwriter.icns
- CFBundleIdentifier
- io.novelwriter.novelWriter
- CFBundleName
- novelWriter
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleShortVersionString
- 2.0.1
- CFBundleSignature
- ????
- CFBundleVersion
- 2.0.1
- CFBundlePackageType
- APPL
- NSHumanReadableCopyright
- © 2018–2022, Veronica Berglyd Olsen <code@vkbo.net>
- IFMajorVersion
- 0
- IFMinorVersion
- 1
- CFBundleDocumentTypes
-
-