Refactor build system
The client was built with Meson, the server with Gradle, and were run by a Makefile. Add a Meson script for the server (which delegates to Gradle), and a parent script to build and install both the client and the server to the system, typically with: meson --buildtype release build cd build ninja sudo ninja install In addition, use a separate Makefile to build a "portable" version of the application (where the client expects the server to be in the current directory). Typically: make release-portable cd dist/scrcpy ./scrcpy This is especially useful for Windows builds, which are not "installed".
This commit is contained in:
parent
396df8a9d8
commit
ff94462d8a
9 changed files with 109 additions and 42 deletions
74
Makefile
74
Makefile
|
@ -1,9 +1,22 @@
|
||||||
.PHONY: default release clean build build-app build-server run dist dist-zip sums test
|
# This makefile provides recipes to build a "portable" version of scrcpy.
|
||||||
|
#
|
||||||
|
# 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.jar).
|
||||||
|
#
|
||||||
|
# In particular, this implies to change the location from where the client push
|
||||||
|
# the server to the device.
|
||||||
|
#
|
||||||
|
# "make release-portable" builds a zip containing the client and the server.
|
||||||
|
#
|
||||||
|
# This is a simple Makefile because Meson is not flexible enough to execute some
|
||||||
|
# arbitrary commands.
|
||||||
|
|
||||||
|
.PHONY: default clean release-portable dist-portable dist-portable-zip sums test check
|
||||||
|
|
||||||
GRADLE ?= ./gradlew
|
GRADLE ?= ./gradlew
|
||||||
|
|
||||||
APP_BUILD_DIR := app-build
|
PORTABLE_BUILD_DIR := build-portable
|
||||||
APP_BUILD_DEBUG_DIR := app-build-debug
|
|
||||||
DIST := dist
|
DIST := dist
|
||||||
TARGET_DIR := scrcpy
|
TARGET_DIR := scrcpy
|
||||||
|
|
||||||
|
@ -11,47 +24,28 @@ VERSION := $(shell git describe --tags --always)
|
||||||
TARGET := $(TARGET_DIR)-$(VERSION).zip
|
TARGET := $(TARGET_DIR)-$(VERSION).zip
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@echo 'You must specify a target. Try: make release'
|
@echo 'You must specify a target. Try: make release-portable'
|
||||||
|
|
||||||
release: clean dist-zip sums
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(GRADLE) clean
|
$(GRADLE) clean
|
||||||
rm -rf "$(APP_BUILD_DIR)" "$(APP_BUILD_DEBUG_DIR)" "$(DIST)"
|
rm -rf "$(PORTABLE_BUILD_DIR)" "$(DIST)"
|
||||||
|
|
||||||
build-app-debug:
|
build-portable:
|
||||||
[ -d "$(APP_BUILD_DEBUG_DIR)" ] || ( mkdir "$(APP_BUILD_DEBUG_DIR)" && \
|
[ -d "$(PORTABLE_BUILD_DIR)" ] || ( mkdir "$(PORTABLE_BUILD_DIR)" && \
|
||||||
meson app "$(APP_BUILD_DEBUG_DIR)" --buildtype debug )
|
meson "$(PORTABLE_BUILD_DIR)" \
|
||||||
ninja -C "$(APP_BUILD_DEBUG_DIR)"
|
--buildtype release --strip -Db_lto=true \
|
||||||
|
-Dapp:override_server_jar=scrcpy-server.jar )
|
||||||
|
ninja -C "$(PORTABLE_BUILD_DIR)"
|
||||||
|
|
||||||
build-server-debug:
|
release-portable: clean dist-portable-zip sums
|
||||||
$(GRADLE) assembleDebug
|
@echo "Release created in $(DIST)/."
|
||||||
|
|
||||||
build-debug: build-app-debug build-server-debug
|
dist-portable: build-portable
|
||||||
|
|
||||||
run-debug:
|
|
||||||
SCRCPY_SERVER_JAR=server/build/outputs/apk/debug/server-debug.apk $(APP_BUILD_DEBUG_DIR)/scrcpy $(ARGS)
|
|
||||||
|
|
||||||
build-app:
|
|
||||||
[ -d "$(APP_BUILD_DIR)" ] || ( mkdir "$(APP_BUILD_DIR)" && \
|
|
||||||
meson app "$(APP_BUILD_DIR)" --buildtype release -Db_lto )
|
|
||||||
ninja -C "$(APP_BUILD_DIR)"
|
|
||||||
|
|
||||||
build-server:
|
|
||||||
$(GRADLE) assembleRelease
|
|
||||||
|
|
||||||
build: build-app build-server
|
|
||||||
|
|
||||||
run:
|
|
||||||
SCRCPY_SERVER_JAR=server/build/outputs/apk/release/server-release-unsigned.apk $(APP_BUILD_DIR)/scrcpy $(ARGS)
|
|
||||||
|
|
||||||
dist: build
|
|
||||||
mkdir -p "$(DIST)/$(TARGET_DIR)"
|
mkdir -p "$(DIST)/$(TARGET_DIR)"
|
||||||
# no need to sign the APK, we dont "install" it, this is in fact a simple jar
|
cp "$(PORTABLE_BUILD_DIR)"/server/scrcpy-server.jar "$(DIST)/$(TARGET_DIR)/"
|
||||||
cp server/build/outputs/apk/release/server-release-unsigned.apk "$(DIST)/$(TARGET_DIR)/scrcpy-server.jar"
|
cp "$(PORTABLE_BUILD_DIR)"/app/scrcpy "$(DIST)/$(TARGET_DIR)/"
|
||||||
cp $(APP_BUILD_DIR)/scrcpy "$(DIST)/$(TARGET_DIR)/"
|
|
||||||
|
|
||||||
dist-zip: dist
|
dist-portable-zip: dist-portable
|
||||||
cd "$(DIST)"; \
|
cd "$(DIST)"; \
|
||||||
zip -r "$(TARGET)" "$(TARGET_DIR)"
|
zip -r "$(TARGET)" "$(TARGET_DIR)"
|
||||||
|
|
||||||
|
@ -59,6 +53,10 @@ sums:
|
||||||
cd "$(DIST)"; \
|
cd "$(DIST)"; \
|
||||||
sha256sum *.zip > SHA256SUM.txt
|
sha256sum *.zip > SHA256SUM.txt
|
||||||
|
|
||||||
test:
|
test: build-portable
|
||||||
$(GRADLE) test
|
$(GRADLE) test
|
||||||
ninja -C "$(APP_BUILD_DIR)" test
|
ninja -C "$(PORTABLE_BUILD_DIR)" test
|
||||||
|
|
||||||
|
check: build-portable
|
||||||
|
$(GRADLE) check
|
||||||
|
ninja -C "$(PORTABLE_BUILD_DIR)" test
|
||||||
|
|
|
@ -42,6 +42,22 @@ conf.set('BUILD_DEBUG', get_option('buildtype') == 'debug')
|
||||||
# (conf.set_quoted() is not available on old versions of meson)
|
# (conf.set_quoted() is not available on old versions of meson)
|
||||||
conf.set('SCRCPY_VERSION', '"0.1"')
|
conf.set('SCRCPY_VERSION', '"0.1"')
|
||||||
|
|
||||||
|
# the prefix used during configuration (meson --prefix=PREFIX)
|
||||||
|
conf.set('PREFIX', '"' + get_option('prefix') + '"')
|
||||||
|
|
||||||
|
# the path of the server, which will be appended to the prefix
|
||||||
|
# ignored if OVERRIDE_SERVER_JAR if defined
|
||||||
|
# must be consistent with the install_dir in server/meson.build
|
||||||
|
conf.set('PREFIXED_SERVER_JAR', '"/share/scrcpy/scrcpy-server.jar"')
|
||||||
|
|
||||||
|
# the path of the server to be used "as is"
|
||||||
|
# this is useful for building a "portable" version (with the server in the same
|
||||||
|
# directory as the client)
|
||||||
|
override_server_jar = get_option('override_server_jar')
|
||||||
|
if override_server_jar != ''
|
||||||
|
conf.set('OVERRIDE_SERVER_JAR', '"' + override_server_jar + '"')
|
||||||
|
endif
|
||||||
|
|
||||||
# the default client TCP port for the "adb reverse" tunnel
|
# the default client TCP port for the "adb reverse" tunnel
|
||||||
# overridden by option --port
|
# overridden by option --port
|
||||||
conf.set('DEFAULT_LOCAL_PORT', '27183')
|
conf.set('DEFAULT_LOCAL_PORT', '27183')
|
||||||
|
@ -61,7 +77,7 @@ conf.set('SKIP_FRAMES', true)
|
||||||
|
|
||||||
configure_file(configuration: conf, input: 'src/config.h.in', output: 'config.h')
|
configure_file(configuration: conf, input: 'src/config.h.in', output: 'config.h')
|
||||||
|
|
||||||
executable('scrcpy', src, dependencies: dependencies)
|
executable('scrcpy', src, dependencies: dependencies, install: true)
|
||||||
|
|
||||||
|
|
||||||
### TESTS
|
### TESTS
|
||||||
|
|
1
app/meson_options.txt
Normal file
1
app/meson_options.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
option('override_server_jar', type: 'string')
|
|
@ -1,5 +1,8 @@
|
||||||
#mesondefine BUILD_DEBUG
|
#mesondefine BUILD_DEBUG
|
||||||
#mesondefine SCRCPY_VERSION
|
#mesondefine SCRCPY_VERSION
|
||||||
|
#mesondefine PREFIX
|
||||||
|
#mesondefine PREFIXED_SERVER_JAR
|
||||||
|
#mesondefine OVERRIDE_SERVER_JAR
|
||||||
#mesondefine DEFAULT_LOCAL_PORT
|
#mesondefine DEFAULT_LOCAL_PORT
|
||||||
#mesondefine DEFAULT_MAX_SIZE
|
#mesondefine DEFAULT_MAX_SIZE
|
||||||
#mesondefine DEFAULT_BIT_RATE
|
#mesondefine DEFAULT_BIT_RATE
|
||||||
|
|
|
@ -4,17 +4,28 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "netutil.h"
|
#include "netutil.h"
|
||||||
|
|
||||||
#define SOCKET_NAME "scrcpy"
|
#define SOCKET_NAME "scrcpy"
|
||||||
|
|
||||||
static SDL_bool push_server(const char *serial) {
|
#ifdef OVERRIDE_SERVER_JAR
|
||||||
|
# define DEFAULT_SERVER_JAR OVERRIDE_SERVER_JAR
|
||||||
|
#else
|
||||||
|
# define DEFAULT_SERVER_JAR PREFIX PREFIXED_SERVER_JAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const char *get_server_path(void) {
|
||||||
const char *server_path = getenv("SCRCPY_SERVER_JAR");
|
const char *server_path = getenv("SCRCPY_SERVER_JAR");
|
||||||
if (!server_path) {
|
if (!server_path) {
|
||||||
server_path = "scrcpy-server.jar";
|
server_path = DEFAULT_SERVER_JAR;
|
||||||
}
|
}
|
||||||
process_t process = adb_push(serial, server_path, "/data/local/tmp/scrcpy-server.jar");
|
return server_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_bool push_server(const char *serial) {
|
||||||
|
process_t process = adb_push(serial, get_server_path(), "/data/local/tmp/scrcpy-server.jar");
|
||||||
return process_check_success(process, "adb push");
|
return process_check_success(process, "adb push");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
meson.build
Normal file
6
meson.build
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
project('scrcpy', 'c', subproject_dir: '.')
|
||||||
|
|
||||||
|
subproject('app')
|
||||||
|
subproject('server')
|
||||||
|
|
||||||
|
run_target('run', command: ['scripts/run-scrcpy.sh'])
|
2
scripts/run-scrcpy.sh
Executable file
2
scripts/run-scrcpy.sh
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
SCRCPY_SERVER_JAR="$MESON_BUILD_ROOT/server/scrcpy-server.jar" "$MESON_BUILD_ROOT/app/scrcpy"
|
11
server/meson.build
Normal file
11
server/meson.build
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
project('scrcpy-server', 'c') # not really c, but meson expects something
|
||||||
|
|
||||||
|
# does not track dependencies, so meson does not guarantees that server is up to date
|
||||||
|
# call "touch server" or "ninja -t clean server/scrcpy-server.jar" before to rebuild
|
||||||
|
custom_target('scrcpy-server',
|
||||||
|
build_always: false, # do not enable, otherwise "sudo ninja install" will execute gradle!
|
||||||
|
input: '.',
|
||||||
|
output: 'scrcpy-server.jar',
|
||||||
|
command: [find_program('./scripts/build-wrapper.sh'), '@INPUT@', '@OUTPUT@', get_option('buildtype')],
|
||||||
|
install: true,
|
||||||
|
install_dir: 'share/scrcpy')
|
19
server/scripts/build-wrapper.sh
Executable file
19
server/scripts/build-wrapper.sh
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Wrapper script to invoke gradle from meson
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_ROOT="$1"
|
||||||
|
OUTPUT="$2"
|
||||||
|
BUILDTYPE="$3"
|
||||||
|
|
||||||
|
# gradlew is in the parent of the server directory
|
||||||
|
GRADLE=${GRADLE:-$PROJECT_ROOT/../gradlew}
|
||||||
|
|
||||||
|
if [[ "$BUILDTYPE" == debug ]]
|
||||||
|
then
|
||||||
|
"$GRADLE" -p "$PROJECT_ROOT" assembleDebug
|
||||||
|
cp "$PROJECT_ROOT/build/outputs/apk/debug/server-debug.apk" "$OUTPUT"
|
||||||
|
else
|
||||||
|
"$GRADLE" -p "$PROJECT_ROOT" assembleRelease
|
||||||
|
cp "$PROJECT_ROOT/build/outputs/apk/release/server-release-unsigned.apk" "$OUTPUT"
|
||||||
|
fi
|
Loading…
Reference in a new issue