diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml new file mode 100644 index 00000000..d1d308a8 --- /dev/null +++ b/.github/workflows/macos_build.yml @@ -0,0 +1,95 @@ +name: Release +on: + push: + tags: + - 'v*' + +jobs: + build-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - name: Rust Cache + uses: Swatinem/rust-cache@v1.2.0 + - name: rust-cargo + uses: actions-rs/cargo@v1.0.3 + with: + command: install + args: pyoxidizer + - name: Build Hydrus + run: | + cd $GITHUB_WORKSPACE + basename $(rustc --print sysroot) | sed -e "s/^stable-//" > triple.txt + pyoxidizer build --release + cd build/$(head -n 1 triple.txt)/release + mkdir -p "Hydrus Network.app/Contents/MacOS" + mkdir -p "Hydrus Network.app/Contents/Resources" + mkdir -p "Hydrus Network.app/Contents/Frameworks" + mv install/static/icon.icns "Hydrus Network.app/Contents/Resources/icon.icns" + cat > "Hydrus Network.app/Contents/Info.plist" < + + + + CFBundleDisplayName + client + CFBundleExecutable + MacOS/client + CFBundleIconFile + icon.icns + CFBundleIdentifier + client + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + client + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.0.0 + NSHighResolutionCapable + True + + EOF + mv install/* "Hydrus Network.app/Contents/MacOS/" + rm -rf install + cd $GITHUB_WORKSPACE + temp_dmg="$(mktemp).dmg" + hdiutil create "$temp_dmg" -ov -volname "HydrusNetwork" -fs HFS+ -srcfolder "$GITHUB_WORKSPACE/build/$(head -n 1 triple.txt)/release" + hdiutil convert "$temp_dmg" -format UDZO -o HydrusNetwork.dmg + - name: Upload a Build Artifact + uses: actions/upload-artifact@v2.2.1 + with: + name: MacOS-DMG + path: HydrusNetwork.dmg + if-no-files-found: error + retention-days: 2 + + create-release: + name: Create Release Entry + runs-on: ubuntu-20.04 + needs: [build-macos] + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Get All Artifacts + uses: actions/download-artifact@v2 + - name: Extract version metadata + id: meta + run: | + echo "::set-output name=version::${GITHUB_REF##*/}" + echo "::set-output name=version_short::${GITHUB_REF##*/v}" + - name: Rename Files + run: | + mv MacOS-DMG/HydrusNetwork.dmg HydrusNetwork-${{ steps.meta.outputs.version }}.dmg + - name: Release new + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: | + HydrusNetwork-${{ steps.meta.outputs.version }}.dmg + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/pyoxidizer.bzl b/pyoxidizer.bzl new file mode 100644 index 00000000..d401b612 --- /dev/null +++ b/pyoxidizer.bzl @@ -0,0 +1,63 @@ +def make_dist(): + return default_python_distribution() + +def make_packaging_policy(dist): + policy = dist.make_python_packaging_policy() + policy.set_resource_handling_mode("files") + policy.resources_location = "filesystem-relative:lib" + policy.allow_files = True + policy.bytecode_optimize_level_zero = True + + return policy + +def make_client(dist, policy): + python_config = dist.make_python_interpreter_config() + python_config.module_search_paths = ["$ORIGIN", "$ORIGIN/lib"] + python_config.filesystem_importer = True + python_config.sys_frozen = True + python_config.run_command = "import os; import sys; exec(open(os.path.join(os.path.split(sys.executable)[0], 'client.py')).read())" + + client = dist.to_python_executable( + name="client", + packaging_policy=policy, + config=python_config, + ) + + client.add_python_resources(client.pip_install(["--prefer-binary", "-r", "requirements.txt"])) + + return client + +def make_embedded_resources(client): + return client.to_embedded_resources() + +def make_install(client, resources): + files = FileManifest() + files.add_python_resource(".", client) + + static_resources = glob(["./*.py", "./*.md", "./*txt", "./static/**/*", "./help/**/*"], strip_prefix="{}/".format(CWD)) + files.add_manifest(static_resources) + + hydrus_source = glob(["./hydrus/**/*.py"], strip_prefix="{}/".format(CWD)) + files.add_manifest(hydrus_source) + + return files + +print(BUILD_TARGET_TRIPLE) +print(CWD) + +# Tell PyOxidizer about the build targets defined above. +register_target("dist", make_dist) +register_target("policy", make_packaging_policy, depends=["dist"]) +register_target("client", make_client, depends=["dist", "policy"]) +register_target("resources", make_embedded_resources, depends=["client"], default_build_script=True) +register_target("install", make_install, depends=["client", "resources"], default=True) + +resolve_targets() + +# END OF COMMON USER-ADJUSTED SETTINGS. +# +# Everything below this is typically managed by PyOxidizer and doesn't need +# to be updated by people. + +PYOXIDIZER_VERSION = "0.10.3" +PYOXIDIZER_COMMIT = "UNKNOWN" \ No newline at end of file