From f2664daaec6a8c21a8c2be4ebc37d215a998f4a3 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Sun, 10 Aug 2025 00:03:13 +0800 Subject: [PATCH] [feat] add github actions scripts --- .github/workflows/other.bak | 258 +++++++++++++++++++++++++++++ .github/workflows/release.yaml | 132 +++++++++++++++ .github/workflows/release.yaml.bak | 213 ++++++++++++++++++++++++ config/config.ini | 19 --- {icon => icons}/app.rc | 0 {icon => icons}/app_icon.ico | Bin icons/crossdesk.icns | Bin 0 -> 58111 bytes icons/crossdesk.ico | Bin 0 -> 687 bytes icons/crossdesk.png | Bin 0 -> 840 bytes scripts/linux/pkg_x86_64.sh | 126 ++++++++++++++ scripts/macosx/pkg_arm64.sh | 152 +++++++++++++++++ scripts/macosx/pkg_x86_64.sh | 152 +++++++++++++++++ scripts/windows/nsis_script.nsi | 99 +++++++++++ xmake.lua | 5 +- 14 files changed, 1134 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/other.bak create mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/release.yaml.bak delete mode 100644 config/config.ini rename {icon => icons}/app.rc (100%) rename {icon => icons}/app_icon.ico (100%) create mode 100644 icons/crossdesk.icns create mode 100644 icons/crossdesk.ico create mode 100644 icons/crossdesk.png create mode 100644 scripts/linux/pkg_x86_64.sh create mode 100644 scripts/macosx/pkg_arm64.sh create mode 100644 scripts/macosx/pkg_x86_64.sh create mode 100644 scripts/windows/nsis_script.nsi diff --git a/.github/workflows/other.bak b/.github/workflows/other.bak new file mode 100644 index 0000000..1d94a84 --- /dev/null +++ b/.github/workflows/other.bak @@ -0,0 +1,258 @@ +name: Build and Release CrossDesk + +on: + push: + branches: [release] + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: write + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + # Linux Job with CUDA container + build-linux: + name: Build on (ubuntu + CUDA) + runs-on: ubuntu-22.04 + container: + image: nvidia/cuda:12.6.3-devel-ubuntu22.04 + options: --user root + defaults: + run: + working-directory: ${{ github.workspace }} + + steps: + - name: Install system dependencies + run: | + apt-get update + apt-get install -y \ + git \ + curl \ + unzip \ + software-properties-common \ + build-essential \ + libxcb-randr0-dev \ + libxcb-xtest0-dev \ + libxcb-xinerama0-dev \ + libxcb-shape0-dev \ + libxcb-xkb-dev \ + libxcb-xfixes0-dev \ + libxv-dev \ + libxtst-dev \ + libasound2-dev \ + libsndio-dev \ + libxcb-shm0-dev \ + libxrandr-dev \ + libpulse-dev + add-apt-repository ppa:xmake-io/xmake + apt-get update + apt-get install -y xmake + + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Cache xmake dependencies + uses: actions/cache@v4 + with: + path: ~/.xmake/packages + key: linux-xmake-deps-intel-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + linux-xmake-deps-intel- + + - name: Build CrossDesk + run: xmake b -vy --root crossdesk + + # - name: Package + # run: | + # chmod +x ./scripts/linux/pkg_x86_64.sh + # ./scripts/linux/pkg_x86_64.sh + + # - name: Upload artifact + # uses: actions/upload-artifact@v4 + # with: + # name: crossdesk-linux-x86_64 + # path: ${{ github.workspace }}/build/linux/x86_64/release/crossdesk + + # Non-Linux platforms (macOS, Windows) + build-other: + name: Build on (${{ matrix.runner }} ${{ matrix.arch }}) + runs-on: ${{ matrix.runner }} + strategy: + matrix: + include: + - arch: x86_64 + platform: macos + runner: macos-13 + cache-key: intel + out-dir: ./build/macosx/x86_64/release/crossdesk + artifact-name: crossdesk-macos-x86_64 + package_script: ./scripts/macosx/pkg_x86_64.sh + - arch: arm64 + platform: macos + runner: macos-14 + cache-key: arm + out-dir: ./build/macosx/arm64/release/crossdesk + artifact-name: crossdesk-macos-arm64 + package_script: ./scripts/macosx/pkg_arm64.sh + - arch: x86_64 + platform: windows + runner: windows-2022 + cache-key: intel + out-dir: ./build/win/x86_64/release/crossdesk + artifact-name: crossdesk-win-x86_64 + package_script: ./scripts/windows/nsis_script.nsi + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Initialize submodules + run: git submodule update --init --recursive + + - name: Install xmake (macOS) + if: runner.os == 'macOS' + run: brew install xmake + + - name: Install xmake (Windows) + if: runner.os == 'Windows' + run: | + Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content + echo "C:\Users\runneradmin\xmake" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Cache xmake dependencies (macOS) + if: runner.os == 'macOS' + uses: actions/cache@v4 + with: + path: ~/.xmake/packages + key: ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}- + + - name: Get LOCALAPPDATA path (Windows) + if: runner.os == 'Windows' + id: localappdata + run: | + echo "localappdata=$env:LOCALAPPDATA" >> $env:GITHUB_OUTPUT + shell: pwsh + + - name: Cache xmake dependencies (Windows) + if: runner.os == 'Windows' + uses: actions/cache@v4 + with: + path: ${{ steps.localappdata.outputs.localappdata }}\.xmake\packages + key: ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}- + + - name: Build CrossDesk + run: xmake b -vy crossdesk + + - name: Package + run: | + chmod +x ${{ matrix.package_script }} + ${{ matrix.package_script }} + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.artifact-name }} + path: ${{ matrix.out-dir }} + + # - name: Decode and save certificate + # shell: bash + # run: | + # mkdir -p certs + # echo "${{ secrets.CROSSDESK_CERT_BASE64 }}" | base64 --decode > certs/cert.crt + + # - name: Package CrossDesk app + # if: runner.os != 'Windows' + # run: | + # chmod +x ${{ matrix.package_script }} + # ${{ matrix.package_script }} + + # - name: Package CrossDesk app (Windows) + # if: runner.os == 'Windows' + # run: "& makensis.exe ${{ matrix.package_script }}" + # working-directory: ${{ github.workspace }} + + # - name: Upload build artifacts + # uses: actions/upload-artifact@v4 + # with: + # name: ${{ matrix.artifact-name }}-pkg + # path: crossdesk-${{ matrix.platform }}-${{ matrix.arch }}-v0.0.1.pkg + + # - name: Move files to release dir + # run: | + # mkdir -p release + # cp crossdesk-${{ matrix.platform }}-${{ matrix.arch }}-v0.0.1.pkg release/ + + # release: + # name: Publish Release + # if: startsWith(github.ref, 'refs/tags/v') + # needs: build + # runs-on: ubuntu-latest + + # steps: + # - name: Checkout repository + # uses: actions/checkout@v4 + + # - name: Download all artifacts + # uses: actions/download-artifact@v4 + # with: + # path: artifacts + + # - name: Extract version number + # id: version + # run: | + # VERSION="${GITHUB_REF##*/}" + # VERSION_NUM="${VERSION#v}" + # echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_OUTPUT + + # - name: Rename artifacts + # run: | + # mkdir -p release + # cp artifacts/crossdesk-macos-x86_64-pkg/* release/crossdesk-macos-x86_64-v${{ steps.version.outputs.VERSION_NUM }}.pkg + # cp artifacts/crossdesk-macos-arm64-pkg/* release/crossdesk-macos-aarch64-v${{ steps.version.outputs.VERSION_NUM }}.pkg + + # - name: Upload to Versioned GitHub Release + # uses: softprops/action-gh-release@v2 + # with: + # tag_name: v${{ steps.version.outputs.VERSION_NUM }} + # name: Release v${{ steps.version.outputs.VERSION_NUM }} + # draft: false + # prerelease: false + # files: release/* + # generate_release_notes: false + # body: | + # Binary release only. Source code is not included. + + # - name: Upload to 'latest' Release + # run: | + # mkdir -p release/latest + # cp release/crossdesk-macos-x86_64-v${{ steps.version.outputs.VERSION_NUM }}.pkg release/latest/crossdesk-macos-x86_64-latest.pkg + # cp release/crossdesk-macos-aarch64-v${{ steps.version.outputs.VERSION_NUM }}.pkg release/latest/crossdesk-macos-aarch64-latest.pkg + + # - name: Create or update 'latest' tag + # run: | + # git config user.name "github-actions[bot]" + # git config user.email "github-actions[bot]@users.noreply.github.com" + # git tag -f latest + # git push origin latest --force + + # - name: Upload to GitHub Release (latest) + # uses: softprops/action-gh-release@v2 + # with: + # tag_name: latest + # name: Latest Release + # draft: false + # prerelease: false + # files: | + # release/latest/crossdesk-macos-*.pkg + # generate_release_notes: false + # \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..b77667a --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,132 @@ +name: Build and Release CrossDesk + +on: + push: + branches: [release] + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: write + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + # Linux + build-linux: + name: Build on Ubuntu + runs-on: ubuntu-22.04 + container: + image: crossdesk/ubuntu22.04:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build CrossDesk + env: + CUDA_PATH: /usr/local/cuda + XMAKE_GLOBALDIR: /data + run: | + ls -la $XMAKE_GLOBALDIR + xmake b -vy --root crossdesk + + # macOS + build-macos: + name: Build on macOS + runs-on: ${{ matrix.runner }} + strategy: + matrix: + include: + - arch: x86_64 + runner: macos-13 + cache-key: intel + out-dir: ./build/macosx/x86_64/release/crossdesk + artifact-name: crossdesk-macos-x86_64 + package_script: ./scripts/macosx/pkg_x86_64.sh + - arch: arm64 + runner: macos-14 + cache-key: arm + out-dir: ./build/macosx/arm64/release/crossdesk + artifact-name: crossdesk-macos-arm64 + package_script: ./scripts/macosx/pkg_arm64.sh + steps: + - name: Cache xmake dependencies + uses: actions/cache@v4 + with: + path: ~/.xmake/packages + key: ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}- + + - name: Install xmake + run: brew install xmake + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Initialize submodules + run: git submodule update --init --recursive + + - name: Build CrossDesk + run: xmake b -vy crossdesk + + # Windows + build-windows: + name: Build on Windows + runs-on: windows-2022 + env: + XMAKE_GLOBALDIR: D:\xmake_global + steps: + - name: Cache xmake dependencies + uses: actions/cache@v4 + with: + path: D:\xmake_global\.xmake\packages + key: ${{ runner.os }}-xmake-deps-intel-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-intel- + + - name: Install xmake + run: | + Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content + echo "C:\Users\runneradmin\xmake" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + xmake create cuda + Set-Location cuda + xmake g --theme=plain + $cudaPath = "" + $packagesPath = "D:\xmake_global\.xmake\packages" + + if (Test-Path $packagesPath) { + Write-Host "Packages directory exists: $packagesPath" + try { + $info = xmake require --info "cuda 12.6.3" 2>$null + if ($null -ne $info -and $info -ne "") { + $cudaPath = (($info | Select-String installdir).ToString() -replace '.*installdir:\s*','').Trim() + Write-Host "Resolved CUDA_PATH = $cudaPath" + } + } catch {} + } else { + Write-Host "Packages directory not found: $packagesPath" + Write-Host "Installing CUDA package..." + xmake require -vy "cuda 12.6.3" + $info = xmake require --info "cuda 12.6.3" + $cudaPath = (($info | Select-String installdir).ToString() -replace '.*installdir:\s*','').Trim() + Write-Host "Resolved CUDA_PATH = $cudaPath" + } + + echo "CUDA_PATH=$cudaPath" >> $env:GITHUB_ENV + Write-Host "Resolved CUDA_PATH = $cudaPath" + Pop-Location + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Initialize submodules + run: git submodule update --init --recursive + + - name: Build CrossDesk + run: xmake b -vy crossdesk diff --git a/.github/workflows/release.yaml.bak b/.github/workflows/release.yaml.bak new file mode 100644 index 0000000..e189f4e --- /dev/null +++ b/.github/workflows/release.yaml.bak @@ -0,0 +1,213 @@ +name: Build and Release CrossDesk + +on: + push: + branches: [release] + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: write + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + build: + name: Build on (${{ matrix.runner }} ${{ matrix.arch }}) + runs-on: ${{ matrix.runner }} + strategy: + matrix: + include: + - arch: x86_64 + platform: macos + runner: macos-13 + cache-key: intel + out-dir: ./build/macosx/x86_64/release/crossdesk + artifact-name: crossdesk-macos-x86_64 + package_script: ./scripts/macosx/pkg_x86_64.sh + - arch: arm64 + platform: macos + runner: macos-14 + cache-key: arm + out-dir: ./build/macosx/arm64/release/crossdesk + artifact-name: crossdesk-macos-arm64 + package_script: ./scripts/macosx/pkg_arm64.sh + - arch: x86_64 + platform: windows + runner: windows-2022 + cache-key: intel + out-dir: ./build/win/x86_64/release/crossdesk + artifact-name: crossdesk-win-x86_64 + package_script: ./scripts/windows/nsis_script.nsi + - arch: x86_64 + platform: linux + runner: ubuntu-22.04 + cache-key: intel + out-dir: ./build/linux/x86_64/release/crossdesk + artifact-name: crossdesk-linux-x86_64 + package_script: ./scripts/linux/pkg_x86_64.sh + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Initialize submodules + run: git submodule update --init --recursive + + - name: Install xmake + if: runner.os == 'macOS' + run: brew install xmake + + - name: Install xmake (Ubuntu) + if: runner.os == 'Linux' + run: | + curl -fsSL https://xmake.io/shget.text | bash + source ~/.xmake/profile + + - name: Install system dependencies (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get -y install \ + libxcb-randr0-dev \ + libxcb-xtest0-dev \ + libxcb-xinerama0-dev \ + libxcb-shape0-dev \ + libxcb-xkb-dev \ + libxcb-xfixes0-dev \ + libxv-dev \ + libxtst-dev \ + libasound2-dev \ + libsndio-dev \ + libxcb-shm0-dev \ + libxrandr-dev \ + libpulse-dev + + - name: Install xmake (Windows) + if: runner.os == 'Windows' + run: | + Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content + echo "C:\Users\runneradmin\xmake" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Build CrossDesk + run: xmake b -vy crossdesk + + - name: Cache xmake dependencies (Linux/macOS) + if: runner.os != 'Windows' + uses: actions/cache@v4 + with: + path: ~/.xmake/packages + key: ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}- + + - name: Get LOCALAPPDATA path (Windows) + if: runner.os == 'Windows' + id: localappdata + run: | + echo "localappdata=$env:LOCALAPPDATA" >> $env:GITHUB_OUTPUT + shell: pwsh + + - name: Cache xmake dependencies (Windows) + if: runner.os == 'Windows' + uses: actions/cache@v4 + with: + path: ${{ steps.localappdata.outputs.localappdata }}\.xmake\packages + key: ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}-${{ hashFiles('**/xmake.lua') }} + restore-keys: | + ${{ runner.os }}-xmake-deps-${{ matrix.cache-key }}- + + + # - name: Decode and save certificate + # shell: bash + # run: | + # mkdir -p certs + # echo "${{ secrets.CROSSDESK_CERT_BASE64 }}" | base64 --decode > certs/cert.crt + + # - name: Package CrossDesk app + # if: runner.os != 'Windows' + # run: | + # chmod +x ${{ matrix.package_script }} + # ${{ matrix.package_script }} + + # - name: Package CrossDesk app (Windows) + # if: runner.os == 'Windows' + # run: "& makensis.exe ${{ matrix.package_script }}" + # working-directory: ${{ github.workspace }} + + # - name: Upload build artifacts + # uses: actions/upload-artifact@v4 + # with: + # name: ${{ matrix.artifact-name }}-pkg + # path: crossdesk-${{ matrix.platform }}-${{ matrix.arch }}-v0.0.1.pkg + + # - name: Move files to release dir + # run: | + # mkdir -p release + # cp crossdesk-${{ matrix.platform }}-${{ matrix.arch }}-v0.0.1.pkg release/ + + # release: + # name: Publish Release + # if: startsWith(github.ref, 'refs/tags/v') + # needs: build + # runs-on: ubuntu-latest + + # steps: + # - name: Checkout repository + # uses: actions/checkout@v4 + + # - name: Download all artifacts + # uses: actions/download-artifact@v4 + # with: + # path: artifacts + + # - name: Extract version number + # id: version + # run: | + # VERSION="${GITHUB_REF##*/}" + # VERSION_NUM="${VERSION#v}" + # echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_OUTPUT + + # - name: Rename artifacts + # run: | + # mkdir -p release + # cp artifacts/crossdesk-macos-x86_64-pkg/* release/crossdesk-macos-x86_64-v${{ steps.version.outputs.VERSION_NUM }}.pkg + # cp artifacts/crossdesk-macos-arm64-pkg/* release/crossdesk-macos-aarch64-v${{ steps.version.outputs.VERSION_NUM }}.pkg + + # - name: Upload to Versioned GitHub Release + # uses: softprops/action-gh-release@v2 + # with: + # tag_name: v${{ steps.version.outputs.VERSION_NUM }} + # name: Release v${{ steps.version.outputs.VERSION_NUM }} + # draft: false + # prerelease: false + # files: release/* + # generate_release_notes: false + # body: | + # Binary release only. Source code is not included. + + # - name: Upload to 'latest' Release + # run: | + # mkdir -p release/latest + # cp release/crossdesk-macos-x86_64-v${{ steps.version.outputs.VERSION_NUM }}.pkg release/latest/crossdesk-macos-x86_64-latest.pkg + # cp release/crossdesk-macos-aarch64-v${{ steps.version.outputs.VERSION_NUM }}.pkg release/latest/crossdesk-macos-aarch64-latest.pkg + + # - name: Create or update 'latest' tag + # run: | + # git config user.name "github-actions[bot]" + # git config user.email "github-actions[bot]@users.noreply.github.com" + # git tag -f latest + # git push origin latest --force + + # - name: Upload to GitHub Release (latest) + # uses: softprops/action-gh-release@v2 + # with: + # tag_name: latest + # name: Latest Release + # draft: false + # prerelease: false + # files: | + # release/latest/crossdesk-macos-*.pkg + # generate_release_notes: false diff --git a/config/config.ini b/config/config.ini deleted file mode 100644 index 0dd66bc..0000000 --- a/config/config.ini +++ /dev/null @@ -1,19 +0,0 @@ -[signal server] -ip = 150.158.81.30 -port = 9099 - -[stun server] -ip = 150.158.81.30 -port = 3478 - -[turn server] -ip = 150.158.81.30 -port = 3478 -username = dijunkun -password = dijunkunpw - -[hardware acceleration] -turn_on = false - -[av1 encoding] -turn_on = true \ No newline at end of file diff --git a/icon/app.rc b/icons/app.rc similarity index 100% rename from icon/app.rc rename to icons/app.rc diff --git a/icon/app_icon.ico b/icons/app_icon.ico similarity index 100% rename from icon/app_icon.ico rename to icons/app_icon.ico diff --git a/icons/crossdesk.icns b/icons/crossdesk.icns new file mode 100644 index 0000000000000000000000000000000000000000..99245bf7ec653c3e7b2ba14bef83a31f763c096a GIT binary patch literal 58111 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 bZ0;SIUpyNraCFY5`PqL=7axCp-}?Ums8|YR literal 0 HcmV?d00001 diff --git a/icons/crossdesk.ico b/icons/crossdesk.ico new file mode 100644 index 0000000000000000000000000000000000000000..e51034c0442a99a4d5218b49e62bb8c8a67af313 GIT binary patch literal 687 zcmZQzU<5)CU}R8Wn90PzAO>W22Kc%2a!GLknY^AJE~)y>pPORYAZZkoW)p>A80wIbQHyKC}2+qh`!9*KHu>1i{g-E$>Zavws;s^XH3Z zU}E3^I-~(;0d*K)ldfErx3d@C7i=bY{)8oKA`{RnEDQn+4j?~K%-A8ZO<`{y_m872 z)N(V}oC3of$139&yLK(Uc^+hP$P?j)tVMM~Tem&je1e6cl@mw!98mu$$?>lGclz9& zRlaHr8a_mNvw>sYJd%fndfY&*Xy9^X>^JY%cfI%49Iby?`<=T$pYaH%f*(U6Q-`p_9EL|M0_qJGR1(^@ z>{;*Zcjl*S_D%fEl^%JSvy5s+!=3rA_&ayZJI3N#w@u8{_sCvJ$JYnaZ4>TIkOhU& zUgZQa<^Dy&?GwRVTtRkvf#uu1cYfAx-SSbznv_7@{?+%v4o!<>b|snb4Lj|WZ!(e* zA8tp_WxjX+^3QxiGCY*f;} "$DEBIAN_DIR/control" << EOF +Package: $APP_NAME +Version: $APP_VERSION +Architecture: $ARCHITECTURE +Maintainer: $MAINTAINER +Description: $DESCRIPTION +Depends: libc6 (>= 2.29), libstdc++6 (>= 9), libx11-6, libxcb1, + libxcb-randr0, libxcb-xtest0, libxcb-xinerama0, libxcb-shape0, + libxcb-xkb1, libxcb-xfixes0, libxv1, libxtst6, libasound2, + libsndio7.0, libxcb-shm0, libpulse0, nvidia-cuda-toolkit +Priority: optional +Section: utils +EOF + +# 创建 desktop 文件 +cat > "$DESKTOP_DIR/$APP_NAME.desktop" << EOF +[Desktop Entry] +Version=$APP_VERSION +Name=$APP_NAME +Comment=$DESCRIPTION +Exec=/usr/local/bin/crossdesk +Icon=crossdesk +Terminal=false +Type=Application +Categories=Utility; +EOF + +# 创建卸载脚本 postrm +cat > "$DEBIAN_DIR/postrm" << EOF +#!/bin/bash +# post-removal script for $APP_NAME + +set -e + +if [ "\$1" = "remove" ] || [ "\$1" = "purge" ]; then + rm -f /usr/local/bin/crossdesk + rm -f /usr/share/icons/hicolor/256x256/apps/crossdesk.png + rm -f /usr/share/applications/$APP_NAME.desktop + rm -rf /opt/$APP_NAME +fi + +exit 0 +EOF + +chmod +x "$DEBIAN_DIR/postrm" + +# 创建安装后脚本 postinst(拷贝证书到每个用户 XDG_CONFIG_HOME) +cat > "$DEBIAN_DIR/postinst" << 'EOF' +#!/bin/bash +set -e + +CERT_SRC="/opt/CrossDesk/certs" +CERT_FILE="crossdesk.cn_root.crt" + +# 处理每个普通用户的配置目录 +for user_home in /home/*; do + [ -d "$user_home" ] || continue + username=$(basename "$user_home") + config_dir="$user_home/.config/CrossDesk/certs" + target="$config_dir/$CERT_FILE" + + if [ ! -f "$target" ]; then + mkdir -p "$config_dir" + cp "$CERT_SRC/$CERT_FILE" "$target" + chown -R "$username:$username" "$user_home/.config/CrossDesk" + echo "✔ Installed cert for $username at $target" + fi +done + +# 处理 root 用户(可选) +if [ -d "/root" ]; then + config_dir="/root/.config/CrossDesk/certs" + mkdir -p "$config_dir" + cp "$CERT_SRC/$CERT_FILE" "$config_dir/$CERT_FILE" + chown -R root:root /root/.config/CrossDesk +fi + +exit 0 +EOF + +chmod +x "$DEBIAN_DIR/postinst" + +# 构建 .deb 包 +dpkg-deb --build "$DEB_DIR" + +# 清理构建目录 +rm -rf "$DEB_DIR" + +echo "✅ Deb package for $APP_NAME created successfully." diff --git a/scripts/macosx/pkg_arm64.sh b/scripts/macosx/pkg_arm64.sh new file mode 100644 index 0000000..0f27cf0 --- /dev/null +++ b/scripts/macosx/pkg_arm64.sh @@ -0,0 +1,152 @@ +#!/bin/bash +set -e # 遇错退出 + +# === 配置变量 === +APP_NAME="crossdesk" +APP_NAME_UPPER="CrossDesk" # 这个变量用来指定大写的应用名 +EXECUTABLE_PATH="./build/macosx/arm64/release/crossdesk" # 可执行文件路径 +APP_VERSION="0.0.1" +PLATFORM="macos" +ARCH="arm64" +IDENTIFIER="cn.crossdesk.app" +ICON_PATH="./icons/crossdesk.icns" # .icns 图标路径 +MACOS_MIN_VERSION="10.12" + +CERTS_SOURCE="./certs" # 你的证书文件目录,里面放所有需要安装的文件 +CERT_NAME="crossdesk.cn_root.crt" + +APP_BUNDLE="${APP_NAME_UPPER}.app" # 使用大写的应用名称 +CONTENTS_DIR="${APP_BUNDLE}/Contents" +MACOS_DIR="${CONTENTS_DIR}/MacOS" +RESOURCES_DIR="${CONTENTS_DIR}/Resources" + +PKG_NAME="${APP_NAME}-${PLATFORM}-${ARCH}-v${APP_VERSION}.pkg" # 保持安装包名称小写 +DMG_NAME="${APP_NAME}-${PLATFORM}-${ARCH}-v${APP_VERSION}.dmg" +VOL_NAME="Install ${APP_NAME_UPPER}" + +# === 清理旧文件 === +echo "🧹 清理旧文件..." +rm -rf "${APP_BUNDLE}" "${PKG_NAME}" "${DMG_NAME}" build_pkg_temp CrossDesk_dmg_temp + +mkdir -p build_pkg_temp + +# === 创建 .app 结构 === +echo "📦 创建 ${APP_BUNDLE}..." +mkdir -p "${MACOS_DIR}" "${RESOURCES_DIR}" + +echo "🚚 拷贝可执行文件..." +cp "${EXECUTABLE_PATH}" "${MACOS_DIR}/${APP_NAME_UPPER}" # 拷贝时使用大写的应用名称 +chmod +x "${MACOS_DIR}/${APP_NAME_UPPER}" + +# === 图标 === +if [ -f "${ICON_PATH}" ]; then + cp "${ICON_PATH}" "${RESOURCES_DIR}/crossedesk.icns" + ICON_KEY="CFBundleIconFilecrossedesk.icns" + echo "🎨 图标添加完成" +else + ICON_KEY="" + echo "⚠️ 未找到图标文件,跳过图标设置" +fi + +# === 生成 Info.plist === +echo "📝 生成 Info.plist..." +cat > "${CONTENTS_DIR}/Info.plist" < + + + + CFBundleName + ${APP_NAME_UPPER} + CFBundleDisplayName + ${APP_NAME_UPPER} + CFBundleIdentifier + ${IDENTIFIER} + CFBundleVersion + ${APP_VERSION} + CFBundleShortVersionString + ${APP_VERSION} + CFBundleExecutable + ${APP_NAME_UPPER} + CFBundlePackageType + APPL + ${ICON_KEY} + LSMinimumSystemVersion + ${MACOS_MIN_VERSION} + NSHighResolutionCapable + + NSCameraUsageDescription + 应用需要访问摄像头 + NSMicrophoneUsageDescription + 应用需要访问麦克风 + NSAppleEventsUsageDescription + 应用需要发送 Apple 事件 + NSScreenCaptureUsageDescription + 应用需要录屏权限以捕获屏幕内容 + + +EOF + +echo "✅ .app 创建完成" + +# === 构建应用组件包 === +echo "📦 构建应用组件包..." +pkgbuild \ + --identifier "${IDENTIFIER}" \ + --version "${APP_VERSION}" \ + --install-location "/Applications" \ + --component "${APP_BUNDLE}" \ + build_pkg_temp/${APP_NAME}-component.pkg + +# === 构建 certs 组件包 === +# 先创建脚本目录和脚本文件 +mkdir -p scripts + +cat > scripts/postinstall <<'EOF' +#!/bin/bash +USER_HOME=$( /usr/bin/stat -f "%Su" /dev/console ) +HOME_DIR=$( /usr/bin/dscl . -read /Users/$USER_HOME NFSHomeDirectory | awk '{print $2}' ) + +DEST="$HOME_DIR/Library/Application Support/CrossDesk/certs" + +mkdir -p "$DEST" +cp -R "/Library/Application Support/CrossDesk/certs/"* "$DEST/" + +exit 0 +EOF + +chmod +x scripts/postinstall + +# 构建 certs 组件包,增加 --scripts 参数指定 postinstall +pkgbuild \ + --root "${CERTS_SOURCE}" \ + --identifier "${IDENTIFIER}.certs" \ + --version "${APP_VERSION}" \ + --install-location "/Library/Application Support/CrossDesk/certs" \ + --scripts scripts \ + build_pkg_temp/${APP_NAME}-certs.pkg + +# === 组合产品包 === +echo "🏗️ 组合最终安装包..." +productbuild \ + --package build_pkg_temp/${APP_NAME}-component.pkg \ + --package build_pkg_temp/${APP_NAME}-certs.pkg \ + "${PKG_NAME}" + +echo "✅ 生成安装包完成:${PKG_NAME}" + +# === 可选:打包成 DMG === +echo "📦 可选打包成 DMG..." +mkdir -p CrossDesk_dmg_temp +cp "${PKG_NAME}" CrossDesk_dmg_temp/ +ln -s /Applications CrossDesk_dmg_temp/Applications + +hdiutil create -volname "${VOL_NAME}" \ + -srcfolder CrossDesk_dmg_temp \ + -ov -format UDZO "${DMG_NAME}" + +rm -rf CrossDesk_dmg_temp build_pkg_temp scripts ${APP_BUNDLE} ${DMG_NAME} + +echo "🎉 所有打包完成:" +echo " ✔️ 应用:${APP_BUNDLE}" +echo " ✔️ 安装包:${PKG_NAME}" +echo " ✔️ 镜像包(可选):${DMG_NAME}" \ No newline at end of file diff --git a/scripts/macosx/pkg_x86_64.sh b/scripts/macosx/pkg_x86_64.sh new file mode 100644 index 0000000..d30fc23 --- /dev/null +++ b/scripts/macosx/pkg_x86_64.sh @@ -0,0 +1,152 @@ +#!/bin/bash +set -e # 遇错退出 + +# === 配置变量 === +APP_NAME="crossdesk" +APP_NAME_UPPER="CrossDesk" # 这个变量用来指定大写的应用名 +EXECUTABLE_PATH="build/macosx/x86_64/release/crossdesk" # 可执行文件路径 +APP_VERSION="0.0.1" +PLATFORM="macos" +ARCH="x86_64" +IDENTIFIER="cn.crossdesk.app" +ICON_PATH="icons/crossdesk.icns" # .icns 图标路径 +MACOS_MIN_VERSION="10.12" + +CERTS_SOURCE="certs" # 你的证书文件目录,里面放所有需要安装的文件 +CERT_NAME="crossdesk.cn_root.crt" + +APP_BUNDLE="${APP_NAME_UPPER}.app" # 使用大写的应用名称 +CONTENTS_DIR="${APP_BUNDLE}/Contents" +MACOS_DIR="${CONTENTS_DIR}/MacOS" +RESOURCES_DIR="${CONTENTS_DIR}/Resources" + +PKG_NAME="${APP_NAME}-${PLATFORM}-${ARCH}-v${APP_VERSION}.pkg" # 保持安装包名称小写 +DMG_NAME="${APP_NAME}-${PLATFORM}-${ARCH}-v${APP_VERSION}.dmg" +VOL_NAME="Install ${APP_NAME_UPPER}" + +# === 清理旧文件 === +echo "🧹 清理旧文件..." +rm -rf "${APP_BUNDLE}" "${PKG_NAME}" "${DMG_NAME}" build_pkg_temp CrossDesk_dmg_temp + +mkdir -p build_pkg_temp + +# === 创建 .app 结构 === +echo "📦 创建 ${APP_BUNDLE}..." +mkdir -p "${MACOS_DIR}" "${RESOURCES_DIR}" + +echo "🚚 拷贝可执行文件..." +cp "${EXECUTABLE_PATH}" "${MACOS_DIR}/${APP_NAME_UPPER}" # 拷贝时使用大写的应用名称 +chmod +x "${MACOS_DIR}/${APP_NAME_UPPER}" + +# === 图标 === +if [ -f "${ICON_PATH}" ]; then + cp "${ICON_PATH}" "${RESOURCES_DIR}/crossedesk.icns" + ICON_KEY="CFBundleIconFilecrossedesk.icns" + echo "🎨 图标添加完成" +else + ICON_KEY="" + echo "⚠️ 未找到图标文件,跳过图标设置" +fi + +# === 生成 Info.plist === +echo "📝 生成 Info.plist..." +cat > "${CONTENTS_DIR}/Info.plist" < + + + + CFBundleName + ${APP_NAME_UPPER} + CFBundleDisplayName + ${APP_NAME_UPPER} + CFBundleIdentifier + ${IDENTIFIER} + CFBundleVersion + ${APP_VERSION} + CFBundleShortVersionString + ${APP_VERSION} + CFBundleExecutable + ${APP_NAME_UPPER} + CFBundlePackageType + APPL + ${ICON_KEY} + LSMinimumSystemVersion + ${MACOS_MIN_VERSION} + NSHighResolutionCapable + + NSCameraUsageDescription + 应用需要访问摄像头 + NSMicrophoneUsageDescription + 应用需要访问麦克风 + NSAppleEventsUsageDescription + 应用需要发送 Apple 事件 + NSScreenCaptureUsageDescription + 应用需要录屏权限以捕获屏幕内容 + + +EOF + +echo "✅ .app 创建完成" + +# === 构建应用组件包 === +echo "📦 构建应用组件包..." +pkgbuild \ + --identifier "${IDENTIFIER}" \ + --version "${APP_VERSION}" \ + --install-location "/Applications" \ + --component "${APP_BUNDLE}" \ + build_pkg_temp/${APP_NAME}-component.pkg + +# === 构建 certs 组件包 === +# 先创建脚本目录和脚本文件 +mkdir -p scripts + +cat > scripts/postinstall <<'EOF' +#!/bin/bash +USER_HOME=$( /usr/bin/stat -f "%Su" /dev/console ) +HOME_DIR=$( /usr/bin/dscl . -read /Users/$USER_HOME NFSHomeDirectory | awk '{print $2}' ) + +DEST="$HOME_DIR/Library/Application Support/CrossDesk/certs" + +mkdir -p "$DEST" +cp -R "/Library/Application Support/CrossDesk/certs/"* "$DEST/" + +exit 0 +EOF + +chmod +x scripts/postinstall + +# 构建 certs 组件包,增加 --scripts 参数指定 postinstall +pkgbuild \ + --root "${CERTS_SOURCE}" \ + --identifier "${IDENTIFIER}.certs" \ + --version "${APP_VERSION}" \ + --install-location "/Library/Application Support/CrossDesk/certs" \ + --scripts scripts \ + build_pkg_temp/${APP_NAME}-certs.pkg + +# === 组合产品包 === +echo "🏗️ 组合最终安装包..." +productbuild \ + --package build_pkg_temp/${APP_NAME}-component.pkg \ + --package build_pkg_temp/${APP_NAME}-certs.pkg \ + "${PKG_NAME}" + +echo "✅ 生成安装包完成:${PKG_NAME}" + +# === 可选:打包成 DMG === +echo "📦 可选打包成 DMG..." +mkdir -p CrossDesk_dmg_temp +cp "${PKG_NAME}" CrossDesk_dmg_temp/ +ln -s /Applications CrossDesk_dmg_temp/Applications + +hdiutil create -volname "${VOL_NAME}" \ + -srcfolder CrossDesk_dmg_temp \ + -ov -format UDZO "${DMG_NAME}" + +rm -rf CrossDesk_dmg_temp build_pkg_temp scripts ${APP_BUNDLE} ${DMG_NAME} + +echo "🎉 所有打包完成:" +echo " ✔️ 应用:${APP_BUNDLE}" +echo " ✔️ 安装包:${PKG_NAME}" +echo " ✔️ 镜像包(可选):${DMG_NAME}" \ No newline at end of file diff --git a/scripts/windows/nsis_script.nsi b/scripts/windows/nsis_script.nsi new file mode 100644 index 0000000..3389454 --- /dev/null +++ b/scripts/windows/nsis_script.nsi @@ -0,0 +1,99 @@ +; ýűʹ HM VNISEdit ű༭򵼲 + +; װʼ峣 +!define PRODUCT_NAME "CrossDesk" +!define PRODUCT_VERSION "0.0.1" +!define PRODUCT_PUBLISHER "CrossDesk" +!define PRODUCT_WEB_SITE "https://www.crossdesk.cn/" +!define APP_NAME "CrossDesk" +!define UNINSTALL_REG_KEY "CrossDesk" + +;ﰲװͼ +Icon "icons\crossdesk.ico" +!define MUI_ICON "icons\crossdesk.ico" + +;ѹ +SetCompressor /FINAL lzma + +;ԱȨޣдHKLMҪ +RequestExecutionLevel admin + +; ------ MUI ִ涨 ------ +!include "MUI.nsh" +!define MUI_ABORTWARNING +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH +!insertmacro MUI_LANGUAGE "SimpChinese" +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS +; ------ MUI ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +OutFile "CrossDesk-${PRODUCT_VERSION}.exe" +InstallDir "$PROGRAMFILES\CrossDesk" +ShowInstDetails show + +Section "MainSection" + SetOutPath "$INSTDIR" + SetOverwrite ifnewer + + ;ļ + File /oname=crossdesk.exe "build\windows\x64\release\crossdesk\crossdesk.exe" + + ; ? ͼļװĿ¼ + File "icons\crossdesk.ico" + + ;джϢ + WriteUninstaller "$INSTDIR\uninstall.exe" + + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayName" "${PRODUCT_NAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "UninstallString" "$INSTDIR\uninstall.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayIcon" "$INSTDIR\crossdesk.ico" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoRepair" 1 +SectionEnd + +Section "Cert" + SetOutPath "$APPDATA\CrossDesk\certs" + File /r "certs\crossdesk.cn_root.crt" +SectionEnd + +Section -AdditionalIcons + ;ݷʽ + CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico" + + ;↑ʼ˵ݷʽ + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico" + + ;ҳݷʽ棩 + WriteIniStr "$DESKTOP\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" +SectionEnd + +Section "Uninstall" + ; ɾжس + Delete "$INSTDIR\crossdesk.exe" + Delete "$INSTDIR\uninstall.exe" + + ; ݹɾװĿ¼ + RMDir /r "$INSTDIR" + + ; ɾͿʼ˵ݷʽ + Delete "$DESKTOP\${PRODUCT_NAME}.lnk" + Delete "$DESKTOP\${PRODUCT_NAME}.url" + Delete "$SMPROGRAMS\${PRODUCT_NAME}.lnk" + + ; ɾעж + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" + + ; ݹɾû AppData е CrossDesk ļ + RMDir /r "$APPDATA\CrossDesk" + RMDir /r "$LOCALAPPDATA\CrossDesk" +SectionEnd + + +Section -Post +SectionEnd \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index 32191c3..cd280b8 100644 --- a/xmake.lua +++ b/xmake.lua @@ -30,11 +30,10 @@ if is_os("windows") then "Imm32", "iphlpapi") add_cxflags("/WX") elseif is_os("linux") then - add_requires("libpulse") add_links("pulse-simple", "pulse") add_requires("libyuv") add_syslinks("pthread", "dl") - add_links("SDL2", "cuda", "nvidia-encode", "nvcuvid", "asound", "X11", "Xtst", "Xrandr") + add_links("SDL2", "asound", "X11", "Xtst", "Xrandr") add_cxflags("-Wno-unused-variable") elseif is_os("macosx") then add_links("SDL2", "SDL2main") @@ -146,7 +145,7 @@ target("crossdesk") set_kind("binary") add_deps("rd_log", "common", "single_window") if is_os("windows") then - add_files("icon/app.rc") + add_files("icons/app.rc") elseif is_os("macosx") then -- add_rules("xcode.application") -- add_files("Info.plist")