From 458353ebabcc8a80b29a8942a1708c2e2c8a3feb Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Fri, 11 Nov 2022 19:39:12 -0700 Subject: [PATCH] Add windows and reorganize --- .github/workflows/default.yml | 103 +++++++++++++++++++++++++++++----- buildPy2App.py | 8 ++- create_pyinstaller_file.py | 7 +++ package_alias.py | 11 ++++ project/__init__.py | 5 -- project/main.py | 3 +- pyinstallertemplate.py | 6 -- 7 files changed, 116 insertions(+), 27 deletions(-) create mode 100644 create_pyinstaller_file.py create mode 100644 package_alias.py delete mode 100644 pyinstallertemplate.py diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml index 4d7b200..cbf7910 100644 --- a/.github/workflows/default.yml +++ b/.github/workflows/default.yml @@ -35,7 +35,8 @@ jobs: - name: Setup Env Vars run: | - echo "BUILD_DIR=dist" >> $GITHUB_ENV + echo "BUILD_DIR=build" >> $GITHUB_ENV + echo "DIST_DIR=build" >> $GITHUB_ENV FILE_LOC=$(find . -name info.py) export VER="$(cat $FILE_LOC | grep -w version | awk -F'"' '$0=$2')" export PROJ_NAME="$(cat $FILE_LOC | grep -w name | awk -F'"' '$0=$2')" @@ -55,7 +56,6 @@ jobs: echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV echo "EMAIL=$EMAIL" >> $GITHUB_ENV - cat > pyinstaller.py <(envsubst < pyinstallertemplate.py) - name: Check Python install run: | @@ -90,13 +90,15 @@ jobs: - name: Setup Deb run: | source venv/bin/activate + python3 create_pyinstaller_file.py pyinstaller -w --noconfirm --hidden-import PySide6 \ --add-data "${{ env.PROJ_DIR }}/resources:." \ --icon "${{ env.PROJ_DIR }}/resources/icon.png" \ --hidden-import configobj \ - --distpath "${{ env.BUILD_DIR }}" \ + --workpath "${{ env.BUILD_DIR }}" \ + --distpath "${{ env.DIST_DIR }}" \ -n "${{ env.PROJ_MOD }}" pyinstaller.py - mv "${{ env.BUILD_DIR }}/${{ env.PROJ_MOD }}" "./${{ env.PROJ_MOD }}-tar" + mv "${{ env.DIST_DIR }}/${{ env.PROJ_MOD }}" "./${{ env.PROJ_MOD }}-tar" tar -czvf ${{ env.PROJ_MOD }}.tar.gz ${{ env.PROJ_MOD }}-tar/* ci/deb-script.sh @@ -123,8 +125,82 @@ jobs: name: ${{ env.PROJ_PATH }}_${{ env.VER }}_${{ matrix.os }}-deb path: | ./*.deb - # windows: - # name: Build for Windows + windows: + name: Build for Windows + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-2019] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - uses: actions/setup-python@v4 + with: + python-version: '3.10.8' + + - name: Check Python install + run: | + python -m venv venv + venv\Scripts\Activate.ps1 + which python + python --version + python -c "import struct; print(struct.calcsize('P') * 8)" + which pip + pip --version + + - name: Install Python dependencies + run: | + venv\Scripts\Activate.ps1 + pip3 install -U setuptools wheel pip + pip3 install -r requirements.txt + pip3 install https://github.com/pyinstaller/pyinstaller/tarball/develop + + - name: Check Python dependencies + run: | + venv\Scripts\Activate.ps1 + python3 -c "from PySide6 import __version__; print(__version__)" + python3 -c "from PySide6.QtCore import __version__; print(__version__)" + python3 -c "from PySide6.QtCore import QLibraryInfo; print(QLibraryInfo.location(QLibraryInfo.LibrariesPath))" + + - name: Setup Env Vars + run: | + $FILE_LOC = (Get-ChildItem -Path .\ -Filter info.py -Recurse -ErrorAction SilentlyContinue -Force | foreach {$_.FullName}) + $VER = (findstr version $FILE_LOC).split("'")[1] + echo "VER=$VER" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "BUILD_DIR=build" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "DIST_DIR=dist" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + $PROJ_NAME = (findstr /b name $FILE_LOC).split('"')[1] + $PROJ_MOD = (findstr /b module_name $FILE_LOC).split('"')[1] + $MAIN_FILE = (findstr /b main_file $FILE_LOC).split('"')[1] + $MAIN_MOD = (findstr /b main_mod $FILE_LOC).split('"')[1] + echo "PROJECT_NAME=$PROJ_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "PROJ_MOD=$PROJ_MOD" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "MAIN_FILE=$MAIN_FILE" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "MAIN_MOD=$MAIN_MOD" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "DIST_DIR=$DIST_DIR" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + + - name: Build + run: | + venv\Scripts\Activate.ps1 + python3 create_pyinstaller_file.py + pyinstaller -w --noconfirm --hidden-import PySide6 ` + --add-data ${{ env.PROJ_DIR }}\resources;.\ ` + --icon ${{ env.PROJ_DIR }}\resources\icon.png ` + --hidden-import pkg_resources ` + --workpath "${{ env.BUILD_DIR }}" ` + --distpath "${{ env.DIST_DIR }}" ` + --onedir -n "${{ env.PROJECT_NAME }}" pyinstaller.py + Compress-Archive -Path .\${{env.DIST_DIR}}\${{env.PROJECT_NAME}} -DestinationPath ${{env.PROJECT_NAME}}-${{ env.VER }}.zip + + + - name: Deploy Zip + uses: actions/upload-artifact@v3 + with: + name: ${{ env.PROJECT_NAME }}_${{ env.VER }}-${{ matrix.os }}-zip + path: | + ${{ env.PROJECT_NAME }}-${{ env.VER }}.zip + macos: name: Build for macOS @@ -147,7 +223,8 @@ jobs: echo "/Library/Frameworks/Python.framework/Versions/3.10/bin" >> $GITHUB_PATH - name: Setup Env Vars run: | - echo "BUILD_DIR=dist" >> $GITHUB_ENV + echo "BUILD_DIR=build" >> $GITHUB_ENV + echo "DIST_DIR=dist" >> $GITHUB_ENV FILE_LOC=$(find . -name info.py) export VER="$(cat $FILE_LOC | grep -w version | awk -F'"' '$0=$2')" export PROJ_NAME="$(cat $FILE_LOC | grep -w name | awk -F'"' '$0=$2')" @@ -165,8 +242,6 @@ jobs: echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV echo "DIST_DIR=$DIST_DIR" >> $GITHUB_ENV - cat > pyinstaller.py <(envsubst < pyinstallertemplate.py) - - name: Check Python install run: | pip3 install --upgrade pip @@ -210,6 +285,7 @@ jobs: - name: Build run: | source venv/bin/activate + python3 create_pyinstaller_file.py # py2app works better python3 buildPy2app.py py2app # pyinstaller -w --noconfirm --hidden-import PySide6 \ @@ -220,13 +296,12 @@ jobs: # --hidden-import pkg_resources \ # --distpath "${{ env.BUILD_DIR }}/ProjectMac" \ # --onefile -n "${{ env.PROJECT_NAME }}" pyinstaller.py - ls -al "dist/" - mv "dist/${{ env.PROJECT_NAME }}.app" "${{ env.PROJECT_NAME }}.app" + mv "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}.app" "${{ env.PROJECT_NAME }}.app" # Clean the directory so it's not full of python bytecode pyclean "${{ env.PROJECT_NAME }}.app" python3 ci/cleandist.py "${{ env.PROJECT_NAME }}.app" python3 ci/codesign.py "${{ env.PROJECT_NAME }}.app" - zip -ry "${{ env.PROJECT_NAME }}-${{ env.VER }}.zip" "${{ env.PROJECT_NAME }}.app" + zip -ry "${{ env.PROJECT_NAME }}_${{ env.VER }}.zip" "${{ env.PROJECT_NAME }}.app" - name: Prepare for deployment run: | @@ -250,9 +325,9 @@ jobs: - name: Deploy Zip uses: actions/upload-artifact@v3 with: - name: ${{ env.PROJECT_NAME }}-${{ env.VER }}-${{ matrix.os }}-zip + name: ${{ env.PROJECT_NAME }}_${{ env.VER }}-${{ matrix.os }}-zip path: | - ${{ env.PROJECT_NAME }}-${{ env.VER }}.zip + ${{ env.PROJECT_NAME }}_${{ env.VER }}.zip - name: Deploy DMG uses: actions/upload-artifact@v3 diff --git a/buildPy2App.py b/buildPy2App.py index dcb9499..dda1feb 100644 --- a/buildPy2App.py +++ b/buildPy2App.py @@ -1,8 +1,14 @@ from setuptools import setup from glob import glob from datetime import datetime +from package_alias import package -from project.info import main_module, name, version, main_file, bundle_identifier, module_name +info = package.info + +name = info.name +version = info.version +bundle_identifier = info.bundle_identifier +module_name = info.module_name APP = [f'pyinstaller.py'] DATA_FILES = [ diff --git a/create_pyinstaller_file.py b/create_pyinstaller_file.py new file mode 100644 index 0000000..0d671e0 --- /dev/null +++ b/create_pyinstaller_file.py @@ -0,0 +1,7 @@ +from package_alias import package_name, package + +with open("pyinstaller.py", "w+") as f: + f.writelines([ + f"from {package_name} import {package.info.main_module}\n", + f"{package.info.main_module}.main()" + ]) diff --git a/package_alias.py b/package_alias.py new file mode 100644 index 0000000..a1e42a9 --- /dev/null +++ b/package_alias.py @@ -0,0 +1,11 @@ +import sys +import os +from glob import glob + +info_name = 'info' +info_file = glob(os.path.join('*', f'{info_name}.py'))[0] +package_name = info_file.split(os.path.sep)[0] + +package = __import__(f"{package_name}", fromlist=["main", "info"]) +if package_name not in sys.modules: + sys.modules[package_name] = package diff --git a/project/__init__.py b/project/__init__.py index e9eb49f..e69de29 100644 --- a/project/__init__.py +++ b/project/__init__.py @@ -1,5 +0,0 @@ -from . import info - -version = info.version -name = info.name -module_name = info.module_name diff --git a/project/main.py b/project/main.py index 820e5dc..1706b3b 100644 --- a/project/main.py +++ b/project/main.py @@ -1,6 +1,7 @@ from PySide6.QtWidgets import QMainWindow, QApplication, QLabel, QVBoxLayout, QPushButton, QWidget from PySide6.QtGui import QIcon -from . import name as project_name +from . import info +project_name = info.name import sys diff --git a/pyinstallertemplate.py b/pyinstallertemplate.py deleted file mode 100644 index cc89823..0000000 --- a/pyinstallertemplate.py +++ /dev/null @@ -1,6 +0,0 @@ -""" -This file is needed to get pyinstaller to understand modules. -""" - -from $PROJ_MOD.$MAIN_MOD import main -main()