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