diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml index a95454e..16c9834 100644 --- a/.github/workflows/default.yml +++ b/.github/workflows/default.yml @@ -15,9 +15,120 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: + ubuntu: + name: Build Ubuntu Debian package + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04, ubuntu-22.04] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - uses: actions/setup-python@v4 + with: + python-version: '3.10.8' + + - name: Install prereqs + run: | + sudo apt install -y libegl-dev libxcb-keysyms1 libxcb-randr0 libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-shape0 libxcb-xkb1 libxcb-render-util0 + + - name: Setup Env Vars + run: | + echo "BUILD_DIR=build" >> $GITHUB_ENV + export VER="$(cat info.py | grep -w version | awk -F'"' '$0=$2')" + export PROJ_NAME="$(cat info.py | grep -w name | awk -F'"' '$0=$2')" + export PROJ_MOD="$(cat info.py | grep -w module_name | awk -F'"' '$0=$2')" + export MAIN_FILE="$(cat info.py | grep -w main_file | awk -F'"' '$0=$2')" + export BUNDLE_ID="$(cat info.py | grep -w bundle_identifier | awk -F'"' '$0=$2')" + export EMAIL="$(cat info.py | grep -w email | awk -F'"' '$0=$2')" + export DESCRIPTION="$(cat info.py | grep -w description | awk -F'"' '$0=$2')" + echo "VER=$VER" >> $GITHUB_ENV + echo "DESCRIPTION=$DESCRIPTION" >> $GITHUB_ENV + echo "PROJECT_NAME=$PROJ_NAME" >> $GITHUB_ENV + echo "PROJ_DIR=$PROJ_MOD" >> $GITHUB_ENV + echo "PROJ_PATH=$PROJ_MOD" >> $GITHUB_ENV + echo "PROJ_MOD=$PROJ_MOD" >> $GITHUB_ENV + echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV + echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV + echo "EMAIL=$EMAIL" >> $GITHUB_ENV + + - name: Check Python install + run: | + pip3 install --upgrade pip + python3 -m venv venv + source venv/bin/activate + + which python3 + python3 --version + which pip3 + pip3 --version + file python3 + + - name: Install Python dependencies + run: | + source venv/bin/activate + pip3 install -U pip setuptools wheel certifi + pip3 install -r requirements.txt + pip3 install py2app + PYINSTALLER_COMPILE_BOOTLOADER=1 MACOSX_DEPLOYMENT_TARGET=10.9 pip3 install https://github.com/pyinstaller/pyinstaller/tarball/develop --no-binary :all: + + - name: Check Python dependencies + run: | + source venv/bin/activate + 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))" + python3 -c "import ssl; print(ssl)" + python3 -c "from py2app.recipes import pyside6" + python3 -c 'from distutils.sysconfig import get_config_var; print(get_config_var("LDLIBRARY"))' + + - name: Setup Deb + run: | + source venv/bin/activate + 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 }}/ProjectLinux" \ + --onefile -n "${{ env.PROJ_MOD }}-bin" "${{ env.PROJ_DIR }}/${{ env.MAIN_FILE }}" + cp "${{ env.BUILD_DIR }}/ProjectLinux/${{ env.PROJ_MOD }}-bin" . + ls -al "${{ env.BUILD_DIR }}/ProjectLinux" + ci/deb-script.sh + + - uses: jiro4989/build-deb-action@v2 + with: + package: ${{ env.PROJ_PATH }} + file_name: ${{ env.PROJ_PATH }}_${{ env.VER }}.deb + package_root: .debpkg + maintainer: ${{ env.EMAIL }} + version: ${{ env.VER }} # refs/tags/v*.*.* + arch: 'all' + depends: 'libc6 (>= 2.2.1)' + desc: "${{ env.DESCRIPTION }}" + + - name: Deploy bin + uses: actions/upload-artifact@v2.0.1 + with: + name: ${{ env.PROJ_PATH }}_${{ env.VER }} + path: | + ${{ env.PROJ_MOD }}-bin + + - name: Deploy deb + uses: actions/upload-artifact@v2.0.1 + with: + name: ${{ env.PROJ_PATH }}_${{ env.VER }}.deb + path: | + ${{ env.PROJ_PATH }}_*.deb + # windows: + # name: Build for Windows + macos: name: Build for macOS - runs-on: [macos-11, macos-12] + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-11, macos-12] steps: - name: Checkout uses: actions/checkout@v2 @@ -34,44 +145,53 @@ jobs: - name: Setup Env Vars run: | echo "BUILD_DIR=build" >> $GITHUB_ENV - export VER="$(cat info.py | awk '/version/ {gsub("\047", "", $3); print $NF}')" - export PROJ_NAME="$(cat info.py | awk '/name/ {gsub("\047", "", $3); print $NF}')" - export PROJ_MOD="$(cat info.py | awk '/module_name/ {gsub("\047", "", $3); print $NF}')" - export MAIN_FILE="$(cat info.py | awk '/main_file/ {gsub("\047", "", $3); print $NF}')" - export BUNDLE_ID="$(cat info.py | awk '/bundle_identifier/ {gsub("\047", "", $3); print $NF}')" + export VER="$(cat info.py | grep -w version | awk -F'"' '$0=$2')" + export PROJ_NAME="$(cat info.py | grep -w name | awk -F'"' '$0=$2')" + export PROJ_MOD="$(cat info.py | grep -w module_name | awk -F'"' '$0=$2')" + export MAIN_FILE="$(cat info.py | grep -w main_file | awk -F'"' '$0=$2')" + export BUNDLE_ID="$(cat info.py | grep -w bundle_identifier | awk -F'"' '$0=$2')" + export DIST_DIR="dist_actions" echo "VER=$VER" >> $GITHUB_ENV echo "PROJECT_NAME=$PROJ_NAME" >> $GITHUB_ENV echo "PROJ_DIR=$PROJ_MOD" >> $GITHUB_ENV echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV + echo "DIST_DIR=$DIST_DIR" >> $GITHUB_ENV + - name: Check Python install run: | + pip3 install --upgrade pip + python3 -m venv venv + source venv/bin/activate which python3 python3 --version which pip3 pip3 --version file python3 + - name: Install Python dependencies run: | - pip3 install --upgrade pip - python3 -m venv venv source venv/bin/activate pip3 install -U pip setuptools wheel certifi pip3 install -r requirements.txt pip3 install py2app PYINSTALLER_COMPILE_BOOTLOADER=1 MACOSX_DEPLOYMENT_TARGET=10.9 pip3 install https://github.com/pyinstaller/pyinstaller/tarball/develop --no-binary :all: + - name: Install universal2 dependencies env: CFLAGS: -arch x86_64 -arch arm64 ARCHFLAGS: -arch x86_64 -arch arm64 run: | + source venv/bin/activate pip3 uninstall cffi -y pip3 install --no-binary :all: cffi pip3 uninstall cryptography -y pip3 download --platform macosx_10_10_universal2 --only-binary :all: --no-deps --dest . cryptography pip3 install --no-cache-dir --no-index --find-links . cryptography + - name: Check Python dependencies run: | + source venv/bin/activate 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))" @@ -80,19 +200,25 @@ jobs: python3 -c 'from distutils.sysconfig import get_config_var; print(get_config_var("LDLIBRARY"))' - name: Build run: | - python3 buildPy2app.py py2app - pyinstaller -w --hidden-import PySide6 \ - --add-data "${{ env.PROJ_DIR }}/resources" \ + source venv/bin/activate + # python3 buildPy2app.py py2app + pyinstaller -w --noconfirm --hidden-import PySide6 \ + --add-data "${{ env.PROJ_DIR }}/resources:." \ --icon "${{ env.PROJ_DIR }}/resources/icon.icns" \ --target-architecture universal2 \ - --osx-bundle-identifier "pl.${{ env.PROJ_DIR }}.${{ env.PROJ_DIR }}" + --osx-bundle-identifier "${{ env.BUNDLE_ID }}" \ --hidden-import pkg_resources \ - --distpath "${{ env.BUILD_DIR }}/" \ + --distpath "${{ env.BUILD_DIR }}/ProjectMac" \ --onefile -n "${{ env.PROJECT_NAME }}" "${{ env.PROJ_DIR }}/${{ env.MAIN_FILE }}" + ls -al "${{ env.BUILD_DIR }}/ProjectMac" + zip -r "${{ env.PROJECT_NAME }}-${{ env.VER }}.zip" "${{ env.BUILD_DIR }}/ProjectMac/${{ env.PROJECT_NAME }}.app" + - name: Prepare for deployment run: | - mkdir "${{ env.BUILD_DIR }}/" + source venv/bin/activate + mkdir -p "${{ env.DIST_DIR }}/dmg" test -f "${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg" && rm "${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg" + cp -r "${{ env.BUILD_DIR }}/ProjectMac/${{ env.PROJECT_NAME }}.app" "${{ env.DIST_DIR}}/dmg" create-dmg \ --volname "${{ env.PROJECT_NAME }}-${{ env.VER }} Installer" \ --volicon "${{ env.PROJ_DIR }}/resources/icon.icns" \ @@ -103,13 +229,20 @@ jobs: --hide-extension "${{ env.PROJECT_NAME }}.app" \ --app-drop-link 600 185 \ "${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg" \ - "${{ env.BUILD_DIR }}/" - ci/macos-deploy.sh + "${{ env.DIST_DIR }}/dmg/" ls -al dist_actions - - name: Deploy - uses: actions/upload-artifact@v2 + + - name: Deploy Zip + uses: actions/upload-artifact@v2.0.1 + with: + name: ${{ env.PROJECT_NAME }}-${{ env.VER }}.zip + path: | + ${{ env.PROJECT_NAME }}-${{ env.VER }}.zip + + - name: Deploy DMG + uses: actions/upload-artifact@v2.0.1 with: name: ${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg path: | - dist_actions/${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg + ${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg diff --git a/buildPy2App.py b/buildPy2App.py index 0cb9291..d78a345 100644 --- a/buildPy2App.py +++ b/buildPy2App.py @@ -6,6 +6,7 @@ module_name = "project" name = "Project" version = "" main_file = "main.py" +bundle_identifier = "com.project.Project" # Overrides the above exec(open("info.py").read()) @@ -29,7 +30,7 @@ OPTIONS = { 'plist': { 'CFBundleName': name, 'CFBundleShortVersionString': version, - 'CFBundleIdentifier': f'pl.{module_name}.{name}', + 'CFBundleIdentifier': bundle_identifier, 'LSMinimumSystemVersion': '10.12.0', 'NSHumanReadableCopyright': f'Copyright © {datetime.now().year} {name} All Rights Reserved', } diff --git a/ci/appdatatemplate.xml b/ci/appdatatemplate.xml new file mode 100644 index 0000000..321f32e --- /dev/null +++ b/ci/appdatatemplate.xml @@ -0,0 +1,21 @@ + + + $BUNDLE_ID + $METADATA_LICENSE + $PROJECT_LICENSE + $PROJ_NAME + $SUMMARY + +

$DESCRIPTION

+
+ $BUNDLE_ID.desktop + $HOMEPAGE + + + $SCREENSHOT + + + + $BUNDLE_ID.desktop + +
diff --git a/ci/deb-script.sh b/ci/deb-script.sh new file mode 100755 index 0000000..f9f3e92 --- /dev/null +++ b/ci/deb-script.sh @@ -0,0 +1,47 @@ +#! /bin/bash + +set -x +set -e + +BUILD_DIR=".debpkg" +mkdir -p "$BUILD_DIR" + +# store repo root as variable +REPO_ROOT=$(readlink -f $(dirname $(dirname "$0"))) +OLD_CWD=$(readlink -f .) + +export VER="$(cat $REPO_ROOT/info.py | grep -w version | awk -F'"' '$0=$2')" +export PROJ_NAME="$(cat $REPO_ROOT/info.py | grep -w name | awk -F'"' '$0=$2')" +export PROJ_MOD="$(cat $REPO_ROOT/info.py | grep -w module_name | awk -F'"' '$0=$2')" +export MAIN_FILE="$(cat $REPO_ROOT/info.py | grep -w main_file | awk -F'"' '$0=$2')" +export BUNDLE_ID="$(cat $REPO_ROOT/info.py | grep -w bundle_identifier | awk -F'"' '$0=$2')" +export PROJECT_LICENSE="$(cat $REPO_ROOT/info.py | grep -w project_license | awk -F'"' '$0=$2')" +export SCREENSHOT="$(cat $REPO_ROOT/info.py | grep -w screenshot | awk -F'"' '$0=$2')" +export METADATA_LICENSE="$(cat $REPO_ROOT/info.py | grep -w metadata_license | awk -F'"' '$0=$2')" +export DESCRIPTION="$(cat $REPO_ROOT/info.py | grep -w description | awk -F'"' '$0=$2')" +export HOMEPAGE="$(cat $REPO_ROOT/info.py | grep -w homepage | awk -F'"' '$0=$2')" +export SUMMARY="$(cat $REPO_ROOT/info.py | grep -w summary | awk -F'"' '$0=$2')" +export CATEGORIES="$(cat $REPO_ROOT/info.py | grep -w categories | awk -F'"' '$0=$2')" +export MIMETYPE="$(cat $REPO_ROOT/info.py | grep -w mimetype | awk -F'"' '$0=$2')" +export KEYWORDS="$(cat $REPO_ROOT/info.py | grep -w keywords | awk -F'"' '$0=$2')" +export APP_TYPE="$(cat $REPO_ROOT/info.py | grep -w application_type | awk -F'"' '$0=$2')" +export MAIN_MOD="$(cat $REPO_ROOT/info.py | grep -w main_module | awk -F'"' '$0=$2')" +export EMAIL="$(cat $REPO_ROOT/info.py | grep -w email | awk -F'"' '$0=$2')" + +pushd "$BUILD_DIR" + +# move and rename .desktop file +cat > $PROJ_MOD.desktop <(envsubst < $REPO_ROOT/ci/projectemplate.desktop) + + +mkdir -p $PROJ_MOD/usr/bin + +chmod +x $REPO_ROOT/$PROJ_MOD-bin +cp $REPO_ROOT/$PROJ_MOD-bin $PROJ_MOD/usr/bin/$PROJ_MOD + +mkdir -p $PROJ_MOD/usr/share/applications +mkdir -p $PROJ_MOD/usr/lib/$PROJ_MOD +chmod +x $PROJ_MOD/usr/bin/$PROJ_MOD +cp $PROJ_MOD.desktop $PROJ_MOD/usr/share/applications +chmod +x $PROJ_MOD/usr/share/applications/$PROJ_MOD.desktop +mkdir -p $PROJ_MOD/DEBIAN diff --git a/ci/projectemplate.desktop b/ci/projectemplate.desktop new file mode 100644 index 0000000..ae248e1 --- /dev/null +++ b/ci/projectemplate.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=$PROJ_NAME +Comment=$DESCRIPTION +Exec=$PROJ_MOD %u +Type=$APP_TYPE +Icon=icon +Categories=$CATEGORIES; +MimeType=$MIME_TYPES +Keywords=$PROJ_MOD;$KEYWORDS diff --git a/info.py b/info.py index 29f6aee..3b67cda 100644 --- a/info.py +++ b/info.py @@ -4,3 +4,15 @@ module_name="project" company_name="Project Company" bundle_identifier="com.projectcompany.project.Project" main_file="main.py" +main_module="main" +metadata_license="MIT" +project_license="PRIVATE" +email="user@example.com" +homepage="https://example.com" +screenshot="" +summary="A project of your creation." +description="A project of your creation." +keywords="interesting;good" +categories="CategoryA;CategoryB" +mimetype="image/x-foo;image/y-foo" +application_type="Application" diff --git a/project/resources/icon.png b/project/resources/icon.png new file mode 100644 index 0000000..22bfcae Binary files /dev/null and b/project/resources/icon.png differ