From 3d1c45f15d20382bf165c89c53871a48ad3fce95 Mon Sep 17 00:00:00 2001 From: Jonathan Klabunde Tomer <125505367+jkt-signal@users.noreply.github.com> Date: Wed, 31 Jul 2024 10:07:54 -0700 Subject: [PATCH] build multiarch server jar from make targets by default --- java/Dockerfile | 3 ++- java/Makefile | 5 +++-- java/build.gradle | 9 +++++++-- java/build_jni.sh | 20 ++++++++++++++------ java/client/build.gradle | 1 - 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/java/Dockerfile b/java/Dockerfile index 53b2802d..12c75fa9 100644 --- a/java/Dockerfile +++ b/java/Dockerfile @@ -70,7 +70,7 @@ ADD --chown=libsignal --chmod=755 --checksum=sha256:${RUSTUP_SHA} \ RUN /tmp/rustup-init -y --profile minimal --default-toolchain "$(cat rust-toolchain)" \ && rm -rf /tmp/rustup-init -RUN rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android +RUN rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android aarch64-unknown-linux-gnu # Install the full set of tools now that the long setup steps are done. # Note that we temporarily hop back to root to do this. @@ -80,6 +80,7 @@ USER root RUN apt-get install -y \ clang \ cmake \ + crossbuild-essential-arm64 \ git \ gpg-agent \ libclang-dev \ diff --git a/java/Makefile b/java/Makefile index 6152e9a2..d5226dcc 100644 --- a/java/Makefile +++ b/java/Makefile @@ -11,6 +11,7 @@ default: java_build DOCKER_IMAGE := libsignal-builder DOCKER_TTY_FLAG := $$(test -t 0 && echo -it) +CROSS_COMPILE_SERVER ?= -PcrossCompileServer docker_image: cd .. && $(DOCKER) build --build-arg UID=$$(id -u) --build-arg GID=$$(id -g) -t $(DOCKER_IMAGE) -f java/Dockerfile . @@ -20,7 +21,7 @@ java_build: docker_image $(DOCKER) run $(DOCKER_TTY_FLAG) --init --rm --user $$(id -u):$$(id -g) \ --env LIBSIGNAL_TESTING_ENCLAVE_SECRET \ -v `cd .. && pwd`/:/home/libsignal/src $(DOCKER_EXTRA) $(DOCKER_IMAGE) \ - sh -c "cd src/java; ./gradlew build" + sh -c "cd src/java; ./gradlew build $(CROSS_COMPILE_SERVER)" publish_java: DOCKER_EXTRA = $(shell [ -L build ] && P=$$(readlink build) && echo -v $$P/:$$P ) publish_java: docker_image @@ -32,7 +33,7 @@ publish_java: docker_image -e ORG_GRADLE_PROJECT_signingPassword \ -e ORG_GRADLE_PROJECT_signingKey \ $(DOCKER_IMAGE) \ - sh -c "cd src/java; ./gradlew publish closeAndReleaseSonatypeStagingRepository" + sh -c "cd src/java; ./gradlew publish closeAndReleaseSonatypeStagingRepository $(CROSS_COMPILE_SERVER)" # We could run these through Docker, but they would have the same result anyway. diff --git a/java/build.gradle b/java/build.gradle index fe43ee27..c08179ed 100644 --- a/java/build.gradle +++ b/java/build.gradle @@ -60,7 +60,7 @@ task makeJniLibrariesServer(type:Exec) { description 'Build the JNI libraries' def debugLevelLogsFlag = hasProperty('debugLevelLogs') ? ['--debug-level-logs'] : [] - def target = hasProperty('crossCompileServer') ? 'server-all' : 'server' + def target = project.hasProperty('crossCompileServer') ? 'server-all' : 'server' commandLine 'bash', './build_jni.sh', *debugLevelLogsFlag, target } @@ -75,7 +75,12 @@ task cleanJni(type: Delete) { delete fileTree('./android/src/main/jniLibs') { include '**/*.so' } - delete fileTree('./shared/resources') { + delete fileTree('./client/src/main/resources') { + include '**/*.so' + include '**/*.dylib' + include '**/*.dll' + } + delete fileTree('./server/src/main/resources') { include '**/*.so' include '**/*.dylib' include '**/*.dll' diff --git a/java/build_jni.sh b/java/build_jni.sh index 843baf6e..b590822d 100755 --- a/java/build_jni.sh +++ b/java/build_jni.sh @@ -13,7 +13,8 @@ cd "${SCRIPT_DIR}"/.. # These paths are relative to the root directory ANDROID_LIB_DIR=java/android/src/main/jniLibs -DESKTOP_LIB_DIR=java/shared/resources +DESKTOP_LIB_DIR=java/client/src/main/resources +SERVER_LIB_DIR=java/server/src/main/resources export CARGO_PROFILE_RELEASE_DEBUG=1 # enable line tables export RUSTFLAGS="--cfg aes_armv8 --cfg polyval_armv8 ${RUSTFLAGS:-}" # Enable ARMv8 cryptography acceleration when available @@ -52,6 +53,7 @@ build_desktop_for_arch () { local CXX local CPATH + local lib_dir="${3}/" local cpuarch="${1%%-*}" case "$cpuarch" in x86_64) @@ -80,13 +82,19 @@ build_desktop_for_arch () { fi echo_then_run cargo build -p libsignal-jni -p libsignal-jni-testing --release ${FEATURES:+--features "${FEATURES[*]}"} --target "$1" if [[ -z "${CARGO_BUILD_TARGET:-}" ]]; then - copy_built_library "target/${1}/release" signal_jni "${DESKTOP_LIB_DIR}/" "signal_jni_${suffix}" - copy_built_library "target/${1}/release" signal_jni_testing "${DESKTOP_LIB_DIR}/" "signal_jni_testing_${suffix}" + copy_built_library "target/${1}/release" signal_jni "$lib_dir" "signal_jni_${suffix}" + copy_built_library "target/${1}/release" signal_jni_testing "$lib_dir" "signal_jni_testing_${suffix}" fi } while [ "${1:-}" != "" ]; do case "${1:-}" in + desktop ) + lib_dir=$DESKTOP_LIB_DIR + ;;& + server | server-all ) + lib_dir=$SERVER_LIB_DIR + ;;& desktop | server | server-all ) # On Linux, cdylibs don't include public symbols from their dependencies, # even if those symbols have been re-exported in the Rust source. @@ -96,10 +104,10 @@ while [ "${1:-}" != "" ]; do FEATURES+=("testing-fns") host_triple=$(rustc -vV | sed -n 's|host: ||p') if [[ "$1" == "server-all" ]]; then - build_desktop_for_arch x86_64-unknown-linux-gnu "$host_triple" - build_desktop_for_arch aarch64-unknown-linux-gnu "$host_triple" + build_desktop_for_arch x86_64-unknown-linux-gnu "$host_triple" $lib_dir + build_desktop_for_arch aarch64-unknown-linux-gnu "$host_triple" $lib_dir else - build_desktop_for_arch "$host_triple" "$host_triple" + build_desktop_for_arch "$host_triple" "$host_triple" $lib_dir fi exit ;; diff --git a/java/client/build.gradle b/java/client/build.gradle index 1499d1d6..787e0b50 100644 --- a/java/client/build.gradle +++ b/java/client/build.gradle @@ -66,7 +66,6 @@ tasks.named('jar') { } processResources { - // TODO: Build a different variant of the JNI library for server. dependsOn ':makeJniLibrariesDesktop' }