diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 70b32e66..00000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: Build
-
-on:
- push:
- tags:
- - '*'
-
-jobs:
- build:
- strategy:
- fail-fast: false
- matrix:
- 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:
- ##
- # PREPARE
- ##
- - name: Checkout
- uses: actions/checkout@v3
- with:
- submodules: 'true'
-
- - name: Set short version
- shell: bash
- run: |
- ver_short=`git rev-parse --short HEAD`
- 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: |
- pip3 install sphinx
-
- ##
- # BUILD
- ##
-
- - name: Build (macOS)
- if: runner.os == 'macOS'
- run: |
- ./setup/macos/build.sh
-
- ##
- # UPLOAD BUILDS
- ##
-
- - name: Upload binary zip (macOS)
- if: runner.os == 'macOS'
- uses: actions/upload-artifact@v3
- with:
- name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.app.zip
- path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip
-
- - name: Upload dmg (macOS)
- if: runner.os == 'macOS'
- uses: actions/upload-artifact@v3
- with:
- name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.dmg
- path: dist_macos/novelWriter-${{ env.VERSION }}.dmg
-
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
new file mode 100644
index 00000000..afeb6966
--- /dev/null
+++ b/.github/workflows/build_macos.yml
@@ -0,0 +1,75 @@
+name: Packaging
+
+on: workflow_dispatch
+
+jobs:
+ buildAssets:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Python Setup
+ uses: actions/setup-python@v4
+ with:
+ python-version: 3
+ architecture: x64
+
+ - name: Install Packages (apt)
+ run: |
+ sudo apt update
+ sudo apt install qttools5-dev-tools python3-sphinx latexmk texlive texlive-latex-extra
+
+ - name: Checkout Source
+ uses: actions/checkout@v3
+
+ - name: Run Build Commands
+ run: python setup.py qtlrelease sample manual
+
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: nw-assets-${{ github.sha }}
+ path: |
+ novelwriter/assets/sample.zip
+ novelwriter/assets/manual.pdf
+ novelwriter/assets/i18n/*.qm
+ if-no-files-found: error
+ retention-days: 1
+
+ buildMac:
+ needs: buildAssets
+ strategy:
+ fail-fast: false
+ runs-on: macos-12
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Get Version
+ shell: bash
+ run: |
+ NW_VERSION=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py`
+ echo "novelWriter Version: $NW_VERSION"
+ echo "VERSION=$NW_VERSION" >> $GITHUB_ENV
+
+ - name: Download Artifact
+ uses: actions/download-artifact@v3
+ with:
+ name: nw-assets-${{ github.sha }}
+ path: novelwriter/assets
+
+ - name: Build
+ run: |
+ ./setup/macos/build.sh
+
+ - name: Upload ZIP
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ env.VERSION }}-macos.app.zip
+ path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip
+ # retention-days: 1
+
+ - name: Upload DMG
+ uses: actions/upload-artifact@v3
+ with:
+ name: novelWriter-${{ env.VERSION }}-macos.dmg
+ path: dist_macos/novelWriter-${{ env.VERSION }}.dmg
+ # retention-days: 1
diff --git a/.gitignore b/.gitignore
index e12c3f96..20079fdc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
setup.iss
/novelwriter.desktop
/novelWriter.pyw
+/setup/macos/Info.plist
# Translations
/novelwriter/assets/i18n/*.qm
diff --git a/setup.py b/setup.py
index 574096ef..b54f3797 100755
--- a/setup.py
+++ b/setup.py
@@ -71,25 +71,6 @@ def extractVersion():
return numVers, hexVers, relDate
-def extractCopyright():
- """Extract the novelWriter copyright notice without having to import
- anything else from the main package.
- """
- copyright = "Unknown"
- initFile = os.path.join("novelwriter", "__init__.py")
- try:
- with open(initFile, mode="r", encoding="utf-8") as inFile:
- for aLine in inFile:
- if aLine.startswith("__copyright__"):
- copyright = (aLine).partition("=")[2].strip().strip('"')
- except Exception as exc:
- print("Could not read file: %s" % initFile)
- print(str(exc))
-
- print("novelWriter copyright: %s " % (copyright))
-
- return copyright
-
def compactVersion(numVers):
"""Make the version number more compact."""
@@ -414,102 +395,36 @@ def buildQtI18nTS(sysArgs):
return
+
##
# Generage MacOS PList
##
def genMacOSPlist():
-
- # Set Up Folder
- # =============
-
+ """Set necessary values for .plist file.
+ """
numVers, _, _ = extractVersion()
pkgVers = compactVersion(numVers)
-
outDir = "setup/macos"
- macosBundleName = "novelWriter"
- macosBundleExeName = "novelWriter"
- macosBundleInfo = "novelWriter: A markdown-like text editor for planning and writing novels."
- macosBundleIcon = "novelwriter.icns"
- macosBundleIdent = "io.novelwriter.novelWriter"
- macosBundleSVers = pkgVers
- macosBundleVers = numVers
- macosBundleCopyright = extractCopyright()
+ copyrightYear = datetime.datetime.now().year
# These keys are no longer used but are present for compatability
- macosBundleVersMajor, macosBundleVersMinor, _ = pkgVers.split(".")
+ pkgVersMaj, pkgVersMin, _ = pkgVers.split(".")
-
- plistXML = (
- "\n"
- "\n"
- "\n"
- "\n"
- "NSPrincipalClass\n"
- "NSApplication\n"
- "NSHighResolutionCapable\n"
- "True\n"
- "CFBundleDevelopmentRegion\n"
- "English\n"
- "CFBundleExecutable\n"
- f"{macosBundleExeName}\n"
- "CFBundleGetInfoString\n"
- f"{macosBundleInfo}\n"
- "CFBundleIconFile\n"
- f"{macosBundleIcon}\n"
- "CFBundleIdentifier\n"
- f"{macosBundleIdent}\n"
- "CFBundleName\n"
- f"{macosBundleName}\n"
- "CFBundleDisplayName\n"
- f"{macosBundleName}\n"
- "CFBundleInfoDictionaryVersion\n"
- "6.0\n"
- "CFBundleShortVersionString\n"
- f"{macosBundleSVers}\n"
- "CFBundleSignature\n"
- "????\n"
- "CFBundleVersion\n"
- f"{macosBundleVers}\n"
- "CFBundlePackageType\n"
- "APPL\n"
- "NSHumanReadableCopyright\n"
- f"{macosBundleCopyright}\n"
- "IFMajorVersion\n"
- f"{macosBundleVersMajor}\n"
- "IFMinorVersion\n"
- f"{macosBundleVersMinor}\n"
- "CFBundleDocumentTypes\n"
- " \n"
- " \n"
- " CFBundleTypeExtensions\n"
- " \n"
- " nwx\n"
- " \n"
- " CFBundleTypeName\n"
- " novelWriter Project\n"
- " CFBundleTypeOSTypes\n"
- " \n"
- " TEXT\n"
- " utxt\n"
- " TUTX\n"
- " ****\n"
- " \n"
- " CFBundleTypeRole\n"
- " Viewer\n"
- " LSHandlerRank\n"
- " Alternate\n"
- " \n"
- " \n"
- "\n"
- "\n"
+ plistXML = readFile(f"{outDir}/Info.plist.template").format(
+ macosBundleSVers=pkgVers,
+ macosBundleVers=numVers,
+ macosBundleVersMajor=pkgVersMaj,
+ macosBundleVersMinor=pkgVersMin,
+ macosBundleCopyright=f"Copyright 2018–{copyrightYear}, Veronica Berglyd Olsen",
)
print(f"Writing Info.plist to {outDir}/Info.plist")
-
writeFile(f"{outDir}/Info.plist", plistXML)
+ return
+
##
# Sample Project ZIP File Builder (sample)
@@ -2059,7 +1974,7 @@ if __name__ == "__main__":
if "clean-assets" in sys.argv:
sys.argv.remove("clean-assets")
cleanBuiltAssets()
-
+
if "gen-plist" in sys.argv:
sys.argv.remove("gen-plist")
genMacOSPlist()
diff --git a/setup/macos/App.entitlements b/setup/macos/App.entitlements
index 40dc976a..8274a218 100644
--- a/setup/macos/App.entitlements
+++ b/setup/macos/App.entitlements
@@ -7,4 +7,4 @@
com.apple.security.cs.allow-dyld-environment-variables
-
\ No newline at end of file
+
diff --git a/setup/macos/Info.plist.template b/setup/macos/Info.plist.template
new file mode 100644
index 00000000..d239a050
--- /dev/null
+++ b/setup/macos/Info.plist.template
@@ -0,0 +1,62 @@
+
+
+
+
+ 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
+ CFBundleDisplayName
+ novelWriter
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleShortVersionString
+ {macosBundleSVers}
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ {macosBundleVers}
+ CFBundlePackageType
+ APPL
+ NSHumanReadableCopyright
+ {macosBundleCopyright}
+ IFMajorVersion
+ {macosBundleVersMajor}
+ IFMinorVersion
+ {macosBundleVersMinor}
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeExtensions
+
+ nwx
+
+ CFBundleTypeName
+ novelWriter Project
+ CFBundleTypeOSTypes
+
+ TEXT
+ utxt
+ TUTX
+ ****
+
+ CFBundleTypeRole
+ Viewer
+ LSHandlerRank
+ Alternate
+
+
+
+
diff --git a/setup/macos/build.sh b/setup/macos/build.sh
index 96e261c3..e3e8e2ff 100755
--- a/setup/macos/build.sh
+++ b/setup/macos/build.sh
@@ -33,7 +33,33 @@ VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SRC_DIR/nove
pushd "$SRC_DIR" || exit 1
-python3 setup.py manual qtlrelease sample gen-plist
+python3 setup.py gen-plist
+if [ -f $SRC_DIR/setup/macos/Info.plist ]; then
+ echo "Found: setup/macos/Info.plist"
+else
+ echo "Missing: setup/macos/Info.plist"
+ exit 1
+fi
+
+# Check that other assets are present
+if [ -f $SRC_DIR/novelwriter/assets/sample.zip ]; then
+ echo "Found: novelwriter/assets/sample.zip"
+else
+ echo "Missing: novelwriter/assets/sample.zip"
+ exit 1
+fi
+if [ -f $SRC_DIR/novelwriter/assets/manual.pdf ]; then
+ echo "Found: novelwriter/assets/manual.pdf"
+else
+ echo "Missing: novelwriter/assets/manual.pdf"
+ exit 1
+fi
+if [ -f $SRC_DIR/novelwriter/assets/i18n/nw_en_US.qm ]; then
+ echo "Found: novelwriter/assets/i18n/nw_en_US.qm"
+else
+ echo "Missing: novelwriter/assets/i18n/nw_en_US.qm"
+ exit 1
+fi
ls -lah .
@@ -70,15 +96,12 @@ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWri
cp $SRC_DIR/setup/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/
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"
+ "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "novelwriter"
"novelWriter.py"
)
@@ -114,7 +137,10 @@ rm -rf pkgs
rm -rf cmake
rm -rf share/{gtk-,}doc
-#remove web engine
+# Remove the files from the 3.1 symlink
+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
rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true