diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..5f909a77 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,133 @@ +name: Build + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always + +jobs: + frontend: + runs-on: ubuntu-22.04 + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: web/package-lock.json + + - name: Build frontend + working-directory: web + run: | + npm ci + npm run build + + - name: Upload frontend dist + uses: actions/upload-artifact@v4 + with: + name: web-dist + path: web/dist + if-no-files-found: error + retention-days: 7 + + deb: + runs-on: ubuntu-22.04 + needs: frontend + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + + - name: Download frontend dist + uses: actions/download-artifact@v4 + with: + name: web-dist + path: web/dist + + - uses: dtolnay/rust-toolchain@stable + + - name: Install cross + run: cargo install cross --locked + + - name: Build linux binary + run: bash build/build-images.sh x86_64 + + - name: Package deb + run: bash build/package-deb.sh amd64 + + - name: Upload deb + uses: actions/upload-artifact@v4 + with: + name: one-kvm-deb + path: target/debian/*.deb + if-no-files-found: error + retention-days: 7 + + windows: + runs-on: windows-2022 + needs: frontend + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + + - name: Download frontend dist + uses: actions/download-artifact@v4 + with: + name: web-dist + path: web/dist + + - uses: dtolnay/rust-toolchain@stable + + - name: Set up MSVC + uses: ilammy/msvc-dev-cmd@v1 + + - name: Prepare vcpkg and dependencies + shell: pwsh + run: | + $env:VCPKG_ROOT = "C:\vcpkg" + $env:VCPKG_DEFAULT_TRIPLET = "x64-windows-static" + $env:VCPKG_INSTALLED_DIR = Join-Path $env:VCPKG_ROOT "installed" + + if (-not (Test-Path $env:VCPKG_ROOT)) { + git clone https://github.com/microsoft/vcpkg $env:VCPKG_ROOT + } + + & "$env:VCPKG_ROOT\bootstrap-vcpkg.bat" -disableMetrics + & "$env:VCPKG_ROOT\vcpkg.exe" install --triplet $env:VCPKG_DEFAULT_TRIPLET + + $tripletRoot = Join-Path $env:VCPKG_INSTALLED_DIR $env:VCPKG_DEFAULT_TRIPLET + $env:TURBOJPEG_SOURCE = "explicit" + $env:TURBOJPEG_LIB_DIR = Join-Path $tripletRoot "lib" + $env:TURBOJPEG_INCLUDE_DIR = Join-Path $tripletRoot "include" + + "VCPKG_ROOT=$env:VCPKG_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append + "VCPKG_DEFAULT_TRIPLET=$env:VCPKG_DEFAULT_TRIPLET" | Out-File -FilePath $env:GITHUB_ENV -Append + "VCPKG_INSTALLED_DIR=$env:VCPKG_INSTALLED_DIR" | Out-File -FilePath $env:GITHUB_ENV -Append + "TURBOJPEG_SOURCE=$env:TURBOJPEG_SOURCE" | Out-File -FilePath $env:GITHUB_ENV -Append + "TURBOJPEG_LIB_DIR=$env:TURBOJPEG_LIB_DIR" | Out-File -FilePath $env:GITHUB_ENV -Append + "TURBOJPEG_INCLUDE_DIR=$env:TURBOJPEG_INCLUDE_DIR" | Out-File -FilePath $env:GITHUB_ENV -Append + + - name: Build Windows exe + shell: pwsh + run: .\build\windows\build.ps1 -Configuration release + + - name: Upload exe + uses: actions/upload-artifact@v4 + with: + name: one-kvm-windows-exe + path: target/x86_64-pc-windows-msvc/release/one-kvm.exe + if-no-files-found: error + retention-days: 7 diff --git a/build/windows/build.ps1 b/build/windows/build.ps1 new file mode 100644 index 00000000..a0dfb0d5 --- /dev/null +++ b/build/windows/build.ps1 @@ -0,0 +1,60 @@ +param( + [string]$Configuration = "debug", + [string]$Target = "x86_64-pc-windows-msvc", + [string]$Triplet = "x64-windows-static", + [string]$VcpkgRoot = $env:VCPKG_ROOT, + [switch]$NoDefaultFeatures, + [string[]]$Features = @(), + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$CargoArgs = @() +) + +$ErrorActionPreference = "Stop" + +$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") +Set-Location $repoRoot + +if ([string]::IsNullOrWhiteSpace($VcpkgRoot)) { + $VcpkgRoot = Join-Path (Split-Path $repoRoot -Parent) "vcpkg" +} + +$VcpkgRoot = [System.IO.Path]::GetFullPath($VcpkgRoot) +$vcpkgInstalledRoot = Join-Path $VcpkgRoot "installed" +$vcpkgTripletRoot = Join-Path $vcpkgInstalledRoot $Triplet +$turbojpegLibDir = Join-Path $vcpkgTripletRoot "lib" +$turbojpegIncludeDir = Join-Path $vcpkgTripletRoot "include" + +if (-not (Test-Path $VcpkgRoot)) { + throw "VCPKG_ROOT does not exist: $VcpkgRoot. Run build/windows/bootstrap-vcpkg.ps1 first." +} + +if (-not (Test-Path $turbojpegLibDir) -or -not (Test-Path $turbojpegIncludeDir)) { + throw "vcpkg triplet is not installed at $vcpkgTripletRoot. Run build/windows/bootstrap-vcpkg.ps1 first." +} + +$env:VCPKG_ROOT = $VcpkgRoot +$env:VCPKG_DEFAULT_TRIPLET = $Triplet +$env:TURBOJPEG_SOURCE = "explicit" +$env:TURBOJPEG_LIB_DIR = $turbojpegLibDir +$env:TURBOJPEG_INCLUDE_DIR = $turbojpegIncludeDir + +$cargoCommand = @("build", "--target", $Target) + +if ($Configuration -eq "release") { + $cargoCommand += "--release" +} elseif ($Configuration -ne "debug") { + throw "Unsupported configuration '$Configuration'. Use 'debug' or 'release'." +} + +if ($NoDefaultFeatures) { + $cargoCommand += "--no-default-features" +} + +if ($Features.Count -gt 0) { + $cargoCommand += "--features" + $cargoCommand += ($Features -join ",") +} + +$cargoCommand += $CargoArgs + +cargo @cargoCommand diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 00000000..ad71085c --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", + "name": "one-kvm", + "version-string": "0.2.0", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "amf", + "avcodec", + "avdevice", + "avfilter", + "avformat", + "gpl", + "nvcodec", + "opus", + "qsv", + "swresample", + "swscale", + "vpx", + "x264", + "x265" + ], + "platform": "windows" + }, + { + "name": "libjpeg-turbo", + "platform": "windows" + }, + { + "name": "libyuv", + "platform": "windows" + }, + { + "name": "opus", + "platform": "windows" + } + ] +}