diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e67c1c21..30984ae3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,11 +6,15 @@ on: name: description: 'Version name (default is ref name)' +env: + # $VERSION is used by release scripts + VERSION: ${{ github.event.inputs.name || github.ref_name }} + jobs: build-scrcpy-server: runs-on: ubuntu-latest env: - GRADLE: gradle # use native gradle instead of ./gradlew in release.mk + GRADLE: gradle # use native gradle instead of ./gradlew in scripts steps: - name: Checkout code uses: actions/checkout@v4 @@ -22,16 +26,16 @@ jobs: java-version: '17' - name: Test scrcpy-server - run: make -f release.mk test-server + run: release/test_server.sh - name: Build scrcpy-server - run: make -f release.mk build-server + run: release/build_server.sh - name: Upload scrcpy-server artifact uses: actions/upload-artifact@v4 with: name: scrcpy-server - path: build-server/server/scrcpy-server + path: release/work/build-server/server/scrcpy-server test-client: runs-on: ubuntu-latest @@ -46,13 +50,8 @@ jobs: libsdl2-dev libavcodec-dev libavdevice-dev libavformat-dev \ libavutil-dev libswresample-dev libusb-1.0-0 libusb-1.0-0-dev - - name: Build - run: | - meson setup d -Db_sanitize=address,undefined - - name: Test - run: | - meson test -Cd + run: release/test_client.sh build-win32: runs-on: ubuntu-latest @@ -71,14 +70,14 @@ jobs: - name: Workaround for old meson version run by Github Actions run: sed -i 's/^pkg-config/pkgconfig/' cross_win32.txt - - name: Build scrcpy win32 - run: make -f release.mk build-win32 + - name: Build win32 + run: release/build_windows.sh 32 - name: Upload build-win32 artifact uses: actions/upload-artifact@v4 with: name: build-win32-intermediate - path: build-win32/dist/ + path: release/work/build-win32/dist/ build-win64: runs-on: ubuntu-latest @@ -97,14 +96,14 @@ jobs: - name: Workaround for old meson version run by Github Actions run: sed -i 's/^pkg-config/pkgconfig/' cross_win64.txt - - name: Build scrcpy win64 - run: make -f release.mk build-win64 + - name: Build win64 + run: release/build_windows.sh 64 - name: Upload build-win64 artifact uses: actions/upload-artifact@v4 with: name: build-win64-intermediate - path: build-win64/dist/ + path: release/work/build-win64/dist/ package: needs: @@ -112,9 +111,6 @@ jobs: - build-win32 - build-win64 runs-on: ubuntu-latest - env: - # $VERSION is used by release.mk - VERSION: ${{ github.event.inputs.name || github.ref_name }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -123,25 +119,34 @@ jobs: uses: actions/download-artifact@v4 with: name: scrcpy-server - path: build-server/server/ + path: release/work/build-server/server/ - name: Download build-win32 uses: actions/download-artifact@v4 with: name: build-win32-intermediate - path: build-win32/dist/ + path: release/work/build-win32/dist/ - name: Download build-win64 uses: actions/download-artifact@v4 with: name: build-win64-intermediate - path: build-win64/dist/ + path: release/work/build-win64/dist/ - - name: Package - run: make -f release.mk package + - name: Package server + run: release/package_server.sh + + - name: Package win32 + run: release/package_client.sh win32 + + - name: Package win64 + run: release/package_client.sh win64 + + - name: Generate checksums + run: release/generate_checksums.sh - name: Upload release artifact uses: actions/upload-artifact@v4 with: name: scrcpy-release-${{ env.VERSION }} - path: release-${{ env.VERSION }} + path: release/output diff --git a/release.mk b/release.mk deleted file mode 100644 index 61145002..00000000 --- a/release.mk +++ /dev/null @@ -1,141 +0,0 @@ -# This makefile provides recipes to build a "portable" version of scrcpy for -# Windows. -# -# Here, "portable" means that the client and server binaries are expected to be -# anywhere, but in the same directory, instead of well-defined separate -# locations (e.g. /usr/bin/scrcpy and /usr/share/scrcpy/scrcpy-server). -# -# In particular, this implies to change the location from where the client push -# the server to the device. - -.PHONY: default clean \ - test test-client test-server \ - build-server \ - prepare-deps-win32 prepare-deps-win64 \ - build-win32 build-win64 \ - zip-win32 zip-win64 \ - package release - -GRADLE ?= ./gradlew - -TEST_BUILD_DIR := build-test -SERVER_BUILD_DIR := build-server -WIN32_BUILD_DIR := build-win32 -WIN64_BUILD_DIR := build-win64 - -VERSION ?= $(shell git describe --tags --exclude='*install-release' --always) - -ZIP := zip -WIN32_TARGET_DIR := scrcpy-win32-$(VERSION) -WIN64_TARGET_DIR := scrcpy-win64-$(VERSION) -WIN32_TARGET := $(WIN32_TARGET_DIR).zip -WIN64_TARGET := $(WIN64_TARGET_DIR).zip - -RELEASE_DIR := release-$(VERSION) - -release: clean test build-server build-win32 build-win64 package - -clean: - $(GRADLE) clean - rm -rf "$(ZIP)" "$(TEST_BUILD_DIR)" "$(SERVER_BUILD_DIR)" \ - "$(WIN32_BUILD_DIR)" "$(WIN64_BUILD_DIR)" - -test-client: - [ -d "$(TEST_BUILD_DIR)" ] || ( mkdir "$(TEST_BUILD_DIR)" && \ - meson setup "$(TEST_BUILD_DIR)" -Db_sanitize=address ) - ninja -C "$(TEST_BUILD_DIR)" - -test-server: - $(GRADLE) -p server check - -test: test-client test-server - -build-server: - $(GRADLE) -p server assembleRelease - mkdir -p "$(SERVER_BUILD_DIR)/server" - cp server/build/outputs/apk/release/server-release-unsigned.apk \ - "$(SERVER_BUILD_DIR)/server/scrcpy-server" - -prepare-deps-win32: - @app/deps/adb.sh win32 - @app/deps/sdl.sh win32 - @app/deps/ffmpeg.sh win32 - @app/deps/libusb.sh win32 - -prepare-deps-win64: - @app/deps/adb.sh win64 - @app/deps/sdl.sh win64 - @app/deps/ffmpeg.sh win64 - @app/deps/libusb.sh win64 - -build-win32: prepare-deps-win32 - rm -rf "$(WIN32_BUILD_DIR)" - mkdir -p "$(WIN32_BUILD_DIR)/local" - meson setup "$(WIN32_BUILD_DIR)" \ - --pkg-config-path="app/deps/work/install/win32/lib/pkgconfig" \ - -Dc_args="-I$(PWD)/app/deps/work/install/win32/include" \ - -Dc_link_args="-L$(PWD)/app/deps/work/install/win32/lib" \ - --cross-file=cross_win32.txt \ - --buildtype=release --strip -Db_lto=true \ - -Dcompile_server=false \ - -Dportable=true - ninja -C "$(WIN32_BUILD_DIR)" - # Group intermediate outputs into a 'dist' directory - mkdir -p "$(WIN32_BUILD_DIR)/dist" - cp "$(WIN32_BUILD_DIR)"/app/scrcpy.exe "$(WIN32_BUILD_DIR)/dist/" - cp app/data/scrcpy-console.bat "$(WIN32_BUILD_DIR)/dist/" - cp app/data/scrcpy-noconsole.vbs "$(WIN32_BUILD_DIR)/dist/" - cp app/data/icon.png "$(WIN32_BUILD_DIR)/dist/" - cp app/data/open_a_terminal_here.bat "$(WIN32_BUILD_DIR)/dist/" - cp app/deps/work/install/win32/bin/*.dll "$(WIN32_BUILD_DIR)/dist/" - cp app/deps/work/install/win32/bin/adb.exe "$(WIN32_BUILD_DIR)/dist/" - -build-win64: prepare-deps-win64 - rm -rf "$(WIN64_BUILD_DIR)" - mkdir -p "$(WIN64_BUILD_DIR)/local" - meson setup "$(WIN64_BUILD_DIR)" \ - --pkg-config-path="app/deps/work/install/win64/lib/pkgconfig" \ - -Dc_args="-I$(PWD)/app/deps/work/install/win64/include" \ - -Dc_link_args="-L$(PWD)/app/deps/work/install/win64/lib" \ - --cross-file=cross_win64.txt \ - --buildtype=release --strip -Db_lto=true \ - -Dcompile_server=false \ - -Dportable=true - ninja -C "$(WIN64_BUILD_DIR)" - # Group intermediate outputs into a 'dist' directory - mkdir -p "$(WIN64_BUILD_DIR)/dist" - cp "$(WIN64_BUILD_DIR)"/app/scrcpy.exe "$(WIN64_BUILD_DIR)/dist/" - cp app/data/scrcpy-console.bat "$(WIN64_BUILD_DIR)/dist/" - cp app/data/scrcpy-noconsole.vbs "$(WIN64_BUILD_DIR)/dist/" - cp app/data/icon.png "$(WIN64_BUILD_DIR)/dist/" - cp app/data/open_a_terminal_here.bat "$(WIN64_BUILD_DIR)/dist/" - cp app/deps/work/install/win64/bin/*.dll "$(WIN64_BUILD_DIR)/dist/" - cp app/deps/work/install/win64/bin/adb.exe "$(WIN64_BUILD_DIR)/dist/" - -zip-win32: - mkdir -p "$(ZIP)/$(WIN32_TARGET_DIR)" - cp -r "$(WIN32_BUILD_DIR)/dist/." "$(ZIP)/$(WIN32_TARGET_DIR)/" - cp "$(SERVER_BUILD_DIR)"/server/scrcpy-server "$(ZIP)/$(WIN32_TARGET_DIR)/" - cd "$(ZIP)"; \ - zip -r "$(WIN32_TARGET)" "$(WIN32_TARGET_DIR)" - rm -rf "$(ZIP)/$(WIN32_TARGET_DIR)" - -zip-win64: - mkdir -p "$(ZIP)/$(WIN64_TARGET_DIR)" - cp -r "$(WIN64_BUILD_DIR)/dist/." "$(ZIP)/$(WIN64_TARGET_DIR)/" - cp "$(SERVER_BUILD_DIR)"/server/scrcpy-server "$(ZIP)/$(WIN64_TARGET_DIR)/" - cd "$(ZIP)"; \ - zip -r "$(WIN64_TARGET)" "$(WIN64_TARGET_DIR)" - rm -rf "$(ZIP)/$(WIN64_TARGET_DIR)" - -package: zip-win32 zip-win64 - mkdir -p "$(RELEASE_DIR)" - cp "$(SERVER_BUILD_DIR)/server/scrcpy-server" \ - "$(RELEASE_DIR)/scrcpy-server-$(VERSION)" - cp "$(ZIP)/$(WIN32_TARGET)" "$(RELEASE_DIR)" - cp "$(ZIP)/$(WIN64_TARGET)" "$(RELEASE_DIR)" - cd "$(RELEASE_DIR)" && \ - sha256sum "scrcpy-server-$(VERSION)" \ - "scrcpy-win32-$(VERSION).zip" \ - "scrcpy-win64-$(VERSION).zip" > SHA256SUMS.txt - @echo "Release generated in $(RELEASE_DIR)/" diff --git a/release.sh b/release.sh deleted file mode 100755 index 51ce2e38..00000000 --- a/release.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -make -f release.mk diff --git a/release/.gitignore b/release/.gitignore new file mode 100644 index 00000000..ed363cdf --- /dev/null +++ b/release/.gitignore @@ -0,0 +1,2 @@ +/work +/output diff --git a/release/build_common b/release/build_common new file mode 100644 index 00000000..199a80b6 --- /dev/null +++ b/release/build_common @@ -0,0 +1,5 @@ +# This file must be sourced from the release scripts directory +WORK_DIR="$PWD/work" +OUTPUT_DIR="$PWD/output" + +VERSION="${VERSION:-$(git describe --tags --always)}" diff --git a/release/build_server.sh b/release/build_server.sh new file mode 100755 index 00000000..f52672de --- /dev/null +++ b/release/build_server.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common +cd .. # root project dir + +GRADLE="${GRADLE:-./gradlew}" +SERVER_BUILD_DIR="$WORK_DIR/build-server" + +rm -rf "$SERVER_BUILD_DIR" +"$GRADLE" -p server assembleRelease +mkdir -p "$SERVER_BUILD_DIR/server" +cp server/build/outputs/apk/release/server-release-unsigned.apk \ + "$SERVER_BUILD_DIR/server/scrcpy-server" diff --git a/release/build_windows.sh b/release/build_windows.sh new file mode 100755 index 00000000..74bd32fc --- /dev/null +++ b/release/build_windows.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -ex + +case "$1" in + 32) + WINXX=win32 + ;; + 64) + WINXX=win64 + ;; + *) + echo "ERROR: $0 must be called with one argument: 32 or 64" >&2 + exit 1 + ;; +esac + +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common +cd .. # root project dir + +WINXX_BUILD_DIR="$WORK_DIR/build-$WINXX" + +app/deps/adb.sh $WINXX +app/deps/sdl.sh $WINXX +app/deps/ffmpeg.sh $WINXX +app/deps/libusb.sh $WINXX + +DEPS_INSTALL_DIR="$PWD/app/deps/work/install/$WINXX" + +rm -rf "$WINXX_BUILD_DIR" +meson setup "$WINXX_BUILD_DIR" \ + --pkg-config-path="$DEPS_INSTALL_DIR/lib/pkgconfig" \ + -Dc_args="-I$DEPS_INSTALL_DIR/include" \ + -Dc_link_args="-L$DEPS_INSTALL_DIR/lib" \ + --cross-file=cross_$WINXX.txt \ + --buildtype=release \ + --strip \ + -Db_lto=true \ + -Dcompile_server=false \ + -Dportable=true +ninja -C "$WINXX_BUILD_DIR" + +# Group intermediate outputs into a 'dist' directory +mkdir -p "$WINXX_BUILD_DIR/dist" +cp "$WINXX_BUILD_DIR"/app/scrcpy.exe "$WINXX_BUILD_DIR/dist/" +cp app/data/scrcpy-console.bat "$WINXX_BUILD_DIR/dist/" +cp app/data/scrcpy-noconsole.vbs "$WINXX_BUILD_DIR/dist/" +cp app/data/icon.png "$WINXX_BUILD_DIR/dist/" +cp app/data/open_a_terminal_here.bat "$WINXX_BUILD_DIR/dist/" +cp "$DEPS_INSTALL_DIR"/bin/*.dll "$WINXX_BUILD_DIR/dist/" +cp "$DEPS_INSTALL_DIR"/bin/adb.exe "$WINXX_BUILD_DIR/dist/" diff --git a/release/generate_checksums.sh b/release/generate_checksums.sh new file mode 100755 index 00000000..a57f1523 --- /dev/null +++ b/release/generate_checksums.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common + +cd "$OUTPUT_DIR" +sha256sum "scrcpy-server-$VERSION" \ + "scrcpy-win32-$VERSION.zip" \ + "scrcpy-win64-$VERSION.zip" \ + | tee SHA256SUMS.txt +echo "Release checksums generated in $PWD/SHA256SUMS.txt" diff --git a/release/package_client.sh b/release/package_client.sh new file mode 100755 index 00000000..f69b2332 --- /dev/null +++ b/release/package_client.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common +cd .. # root project dir + +if [[ $# != 1 ]] +then + # : for example win64 + echo "Syntax: $0 " >&2 + exit 1 + +fi + +BUILD_DIR="$WORK_DIR/build-$1" +ARCHIVE_DIR="$BUILD_DIR/release-archive" +TARGET="scrcpy-$1-$VERSION" + +rm -rf "$ARCHIVE_DIR/$TARGET" +mkdir -p "$ARCHIVE_DIR/$TARGET" + +cp -r "$BUILD_DIR/dist/." "$ARCHIVE_DIR/$TARGET/" +cp "$WORK_DIR/build-server/server/scrcpy-server" "$ARCHIVE_DIR/$TARGET/" + +mkdir -p "$OUTPUT_DIR" + +cd "$ARCHIVE_DIR" +rm -f "$OUTPUT_DIR/$TARGET.zip" +zip -r "$OUTPUT_DIR/$TARGET.zip" "$TARGET" +rm -rf "$TARGET" +cd - +echo "Generated '$OUTPUT_DIR/$TARGET.zip'" diff --git a/release/package_server.sh b/release/package_server.sh new file mode 100755 index 00000000..a856cebb --- /dev/null +++ b/release/package_server.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +OUTPUT_DIR="$PWD/output" +. build_common +cd .. # root project dir + +mkdir -p "$OUTPUT_DIR" +cp "$WORK_DIR/build-server/server/scrcpy-server" "$OUTPUT_DIR/scrcpy-server-$VERSION" +echo "Generated '$OUTPUT_DIR/scrcpy-server-$VERSION'" diff --git a/release/release.sh b/release/release.sh new file mode 100755 index 00000000..0760089f --- /dev/null +++ b/release/release.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# To customize the version name: +# VERSION=myversion ./release.sh +set -e + +cd "$(dirname ${BASH_SOURCE[0]})" +rm -rf output + +./test_server.sh +./test_client.sh + +./build_server.sh +./build_windows.sh 32 +./build_windows.sh 64 + +./package_server.sh +./package_client.sh win32 +./package_client.sh win64 + +./generate_checksums.sh + +echo "Release generated in $PWD/output" diff --git a/release/test_client.sh b/release/test_client.sh new file mode 100755 index 00000000..6059541d --- /dev/null +++ b/release/test_client.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common +cd .. # root project dir + +TEST_BUILD_DIR="$WORK_DIR/build-test" + +rm -rf "$TEST_BUILD_DIR" +meson setup "$TEST_BUILD_DIR" -Dcompile_server=false \ + -Db_sanitize=address,undefined +ninja -C "$TEST_BUILD_DIR" test diff --git a/release/test_server.sh b/release/test_server.sh new file mode 100755 index 00000000..940e8c1a --- /dev/null +++ b/release/test_server.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -ex +cd "$(dirname ${BASH_SOURCE[0]})" +. build_common +cd .. # root project dir + +GRADLE="${GRADLE:-./gradlew}" + +"$GRADLE" -p server check