From 370974f173e075c8849c1c2c33c551fc7d02d9a6 Mon Sep 17 00:00:00 2001 From: ZIXT233 Date: Mon, 9 May 2022 08:50:56 +0800 Subject: [PATCH] Add build support for Windows on ARM64 (based on llvm-mingw) --- app/meson.build | 18 +++++--- app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh | 36 ++++++++++++++++ app/prebuilt-deps/prepare-libusb-win-arm64.sh | 32 ++++++++++++++ app/prebuilt-deps/prepare-sdl-win-arm64.sh | 30 +++++++++++++ cross_win_arm64.txt | 25 +++++++++++ release.mk | 43 +++++++++++++++++++ 6 files changed, 179 insertions(+), 5 deletions(-) create mode 100755 app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh create mode 100755 app/prebuilt-deps/prepare-libusb-win-arm64.sh create mode 100755 app/prebuilt-deps/prepare-sdl-win-arm64.sh create mode 100644 cross_win_arm64.txt diff --git a/app/meson.build b/app/meson.build index f5d76c61..05678c96 100644 --- a/app/meson.build +++ b/app/meson.build @@ -145,13 +145,21 @@ else prebuilt_libusb_root = meson.get_cross_property('prebuilt_libusb_root') libusb_bin_dir = meson.current_source_dir() + '/prebuilt-deps/data/' + prebuilt_libusb libusb_include_dir = 'prebuilt-deps/data/' + prebuilt_libusb_root + '/include' - - libusb = declare_dependency( - dependencies: [ - cc.find_library('msys-usb-1.0', dirs: libusb_bin_dir), + if host_machine.cpu_family() == 'x86' + libusb = declare_dependency( + dependencies: [ + cc.find_library('msys-usb-1.0', dirs: libusb_bin_dir), ], include_directories: include_directories(libusb_include_dir) - ) + ) + elif host_machine.cpu_family() == 'aarch64' + libusb = declare_dependency( + dependencies: [ + cc.find_library('libusb-1.0', dirs: libusb_bin_dir), + ], + include_directories: include_directories(libusb_include_dir) + ) + endif dependencies = [ ffmpeg, diff --git a/app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh b/app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh new file mode 100755 index 00000000..521b0049 --- /dev/null +++ b/app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -e +DIR=$(dirname ${BASH_SOURCE[0]}) +cd "$DIR" +. common +mkdir -p "$PREBUILT_DATA_DIR" +cd "$PREBUILT_DATA_DIR" + +DEP_DIR=ffmpeg-aarch64-4.3.1 + +FILENAME=ffmpeg-4.3.1-windows-aarch64.7z +SHA256SUM=8dd5ed9692f36c2f012a64903b8b2baec6581973d0d4dad872d1a476bcf5018b + +if [[ -d "$DEP_DIR" ]] +then + echo "$DEP_DIR" found + exit 0 +fi + +get_file "https://github.com/ZIXT233/FFmpeg-windows-aarch64-mingw/releases/download/n4.3.1/$FILENAME" \ + "$FILENAME" "$SHA256SUM" + +mkdir "$DEP_DIR" +cd "$DEP_DIR" + +ZIP_PREFIX=ffmpeg-4.3.1-windows-aarch64 +7z x "../$FILENAME" \ + "$ZIP_PREFIX"/bin/avutil-56.dll \ + "$ZIP_PREFIX"/bin/avcodec-58.dll \ + "$ZIP_PREFIX"/bin/avformat-58.dll \ + "$ZIP_PREFIX"/bin/swresample-3.dll \ + "$ZIP_PREFIX"/bin/swscale-5.dll \ + "$ZIP_PREFIX"/include + +mv "$ZIP_PREFIX"/* . +rmdir "$ZIP_PREFIX" diff --git a/app/prebuilt-deps/prepare-libusb-win-arm64.sh b/app/prebuilt-deps/prepare-libusb-win-arm64.sh new file mode 100755 index 00000000..a9644a23 --- /dev/null +++ b/app/prebuilt-deps/prepare-libusb-win-arm64.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -e +DIR=$(dirname ${BASH_SOURCE[0]}) +cd "$DIR" +. common +mkdir -p "$PREBUILT_DATA_DIR" +cd "$PREBUILT_DATA_DIR" + +DEP_DIR=libusb-1.0.26 + +FILENAME=libusb-windows-aarch64-mingw.7z +SHA256SUM=4c83624edc89f95c3500fda3f982f038e7ce996979a8cca0e2e0133d3ef9ef64 + +if [[ -d "$DEP_DIR" ]] +then + echo "$DEP_DIR" found + exit 0 +fi + +get_file "https://github.com/ZIXT233/libusb-windows-aarch64-mingw/releases/download/v1.0.26/$FILENAME" "$FILENAME" "$SHA256SUM" + +mkdir "$DEP_DIR" +cd "$DEP_DIR" + +# include/ is the same in all folders of the archive +7z x "../$FILENAME" \ + libusb-windows-aarch64-mingw/bin/libusb-1.0.dll \ + libusb-windows-aarch64-mingw/include/ + +mv libusb-windows-aarch64-mingw/bin MinGW-aarch64 +mv libusb-windows-aarch64-mingw/include . +rm -rf libusb-windows-aarch64-mingw diff --git a/app/prebuilt-deps/prepare-sdl-win-arm64.sh b/app/prebuilt-deps/prepare-sdl-win-arm64.sh new file mode 100755 index 00000000..fc00ce1e --- /dev/null +++ b/app/prebuilt-deps/prepare-sdl-win-arm64.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -e +DIR=$(dirname ${BASH_SOURCE[0]}) +cd "$DIR" +. common +mkdir -p "$PREBUILT_DATA_DIR" +cd "$PREBUILT_DATA_DIR" + +DEP_DIR=SDL2-2.0.22 + +FILENAME=SDL-windows-aarch64-mingw.7z +SHA256SUM=96a1bd6a0246419ab1e1ae510ba79dfbbfc94c2681f039426a632ffbd4d4b603 + +if [[ -d "$DEP_DIR" ]] +then + echo "$DEP_DIR" found + exit 0 +fi + +get_file "https://github.com/ZIXT233/SDL-windows-aarch64-mingw/releases/download/release-2.0.22/$FILENAME" "$FILENAME" "$SHA256SUM" + +mkdir "$DEP_DIR" +cd "$DEP_DIR" + +7z x "../$FILENAME" \ + SDL-windows-aarch64-mingw/bin/SDL2.dll \ + SDL-windows-aarch64-mingw/include/ \ + SDL-windows-aarch64-mingw/lib/ + +mv SDL-windows-aarch64-mingw aarch64-w64-mingw32 diff --git a/cross_win_arm64.txt b/cross_win_arm64.txt new file mode 100644 index 00000000..47cc6a06 --- /dev/null +++ b/cross_win_arm64.txt @@ -0,0 +1,25 @@ +# apt install mingw-w64 mingw-w64-tools + +[binaries] +name = 'mingw' +c = 'aarch64-w64-mingw32-gcc' +cpp = 'aarch64-w64-mingw32-g++' +ar = 'aarch64-w64-mingw32-ar' +strip = 'aarch64-w64-mingw32-strip' +pkgconfig = 'aarch64-w64-mingw32-pkg-config' +windres = 'aarch64-w64-mingw32-windres' + +[host_machine] +system = 'windows' +cpu_family = 'aarch64' +cpu = 'aarch64' +endian = 'little' + +[properties] +ffmpeg_avcodec = 'avcodec-58' +ffmpeg_avformat = 'avformat-58' +ffmpeg_avutil = 'avutil-56' +prebuilt_ffmpeg = 'ffmpeg-aarch64-4.3.1' +prebuilt_sdl2 = 'SDL2-2.0.22/aarch64-w64-mingw32' +prebuilt_libusb_root = 'libusb-1.0.26' +prebuilt_libusb = 'libusb-1.0.26/MinGW-aarch64' diff --git a/release.mk b/release.mk index 94a9680e..0dd22f0a 100644 --- a/release.mk +++ b/release.mk @@ -23,14 +23,17 @@ TEST_BUILD_DIR := build-test SERVER_BUILD_DIR := build-server WIN32_BUILD_DIR := build-win32 WIN64_BUILD_DIR := build-win64 +WIN_ARM64_BUILD_DIR := build-win-arm64 DIST := dist WIN32_TARGET_DIR := scrcpy-win32 WIN64_TARGET_DIR := scrcpy-win64 +WIN_ARM64_TARGET_DIR := scrcpy-win-arm64 VERSION := $(shell git describe --tags --always) WIN32_TARGET := $(WIN32_TARGET_DIR)-$(VERSION).zip WIN64_TARGET := $(WIN64_TARGET_DIR)-$(VERSION).zip +WIN_ARM64_TARGET := $(WIN_ARM64_TARGET_DIR)-$(VERSION).zip RELEASE_DIR := release-$(VERSION) @@ -74,6 +77,12 @@ prepare-deps-win64: @app/prebuilt-deps/prepare-ffmpeg-win64.sh @app/prebuilt-deps/prepare-libusb.sh +prepare-deps-win-arm64: + @app/prebuilt-deps/prepare-adb.sh + @app/prebuilt-deps/prepare-sdl-win-arm64.sh + @app/prebuilt-deps/prepare-ffmpeg-win-arm64.sh + @app/prebuilt-deps/prepare-libusb-win-arm64.sh + build-win32: prepare-deps-win32 [ -d "$(WIN32_BUILD_DIR)" ] || ( mkdir "$(WIN32_BUILD_DIR)" && \ meson "$(WIN32_BUILD_DIR)" \ @@ -92,6 +101,17 @@ build-win64: prepare-deps-win64 -Dportable=true ) ninja -C "$(WIN64_BUILD_DIR)" + +build-win-arm64: prepare-deps-win-arm64 + [ -d "$(WIN_ARM64_BUILD_DIR)" ] || ( mkdir "$(WIN_ARM64_BUILD_DIR)" && \ + meson "$(WIN_ARM64_BUILD_DIR)" \ + --cross-file cross_win_arm64.txt \ + --buildtype release --strip -Db_lto=true \ + -Dcompile_server=false \ + -Dportable=true ) + sed -i 's/-Wl,--allow-shlib-undefined//g' "$(WIN_ARM64_BUILD_DIR)/build.ninja" + ninja -C "$(WIN_ARM64_BUILD_DIR)" + dist-win32: build-server build-win32 mkdir -p "$(DIST)/$(WIN32_TARGET_DIR)" cp "$(SERVER_BUILD_DIR)"/server/scrcpy-server "$(DIST)/$(WIN32_TARGET_DIR)/" @@ -130,6 +150,25 @@ dist-win64: build-server build-win64 cp app/prebuilt-deps/data/SDL2-2.0.22/x86_64-w64-mingw32/bin/SDL2.dll "$(DIST)/$(WIN64_TARGET_DIR)/" cp app/prebuilt-deps/data/libusb-1.0.26/MinGW-x64/msys-usb-1.0.dll "$(DIST)/$(WIN64_TARGET_DIR)/" +dist-win-arm64: build-server build-win-arm64 + mkdir -p "$(DIST)/$(WIN_ARM64_TARGET_DIR)" + cp "$(SERVER_BUILD_DIR)"/server/scrcpy-server "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp "$(WIN_ARM64_BUILD_DIR)"/app/scrcpy.exe "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/data/scrcpy-console.bat "$(DIST)/$(WIN_ARM64_TARGET_DIR)" + cp app/data/scrcpy-noconsole.vbs "$(DIST)/$(WIN_ARM64_TARGET_DIR)" + cp app/data/icon.png "$(DIST)/$(WIN_ARM64_TARGET_DIR)" + cp app/data/open_a_terminal_here.bat "$(DIST)/$(WIN_ARM64_TARGET_DIR)" + cp app/prebuilt-deps/data/ffmpeg-aarch64-4.3.1/bin/avutil-56.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/ffmpeg-aarch64-4.3.1/bin/avcodec-58.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/ffmpeg-aarch64-4.3.1/bin/avformat-58.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/ffmpeg-aarch64-4.3.1/bin/swresample-3.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/ffmpeg-aarch64-4.3.1/bin/swscale-5.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/platform-tools-33.0.1/adb.exe "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/platform-tools-33.0.1/AdbWinApi.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/platform-tools-33.0.1/AdbWinUsbApi.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/SDL2-2.0.22/aarch64-w64-mingw32/bin/SDL2.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + cp app/prebuilt-deps/data/libusb-1.0.26/MinGW-aarch64/libusb-1.0.dll "$(DIST)/$(WIN_ARM64_TARGET_DIR)/" + zip-win32: dist-win32 cd "$(DIST)/$(WIN32_TARGET_DIR)"; \ zip -r "../$(WIN32_TARGET)" . @@ -137,3 +176,7 @@ zip-win32: dist-win32 zip-win64: dist-win64 cd "$(DIST)/$(WIN64_TARGET_DIR)"; \ zip -r "../$(WIN64_TARGET)" . + +zip-win-arm64: dist-win-arm64 + cd "$(DIST)/$(WIN_ARM64_TARGET_DIR)"; \ + zip -r "../$(WIN_ARM64_TARGET)" .