From: Twaik Yont <9674930+twaik@users.noreply.github.com> Detect and cache GRADLE and ANDROID_HOME and verify the Android build environment by compiling a minimal Gradle project during configure. Ensures the toolchain is functional and able to compile Java sources. Fail early on invalid setups and log details to config.log. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- configure | 137 ++++++++++++++++++++++++++- configure.ac | 82 +++++++++++++++- dlls/wineandroid.drv/build.gradle.in | 6 +- 3 files changed, 220 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 981fb77c455..0c98a451379 100755 --- a/configure +++ b/configure @@ -761,6 +761,8 @@ CXX_PE_CFLAGS CAPSTONE_PE_LIBS CAPSTONE_PE_CFLAGS MINGW_PKG_CONFIG +GRADLE +ANDROID_HOME WINELOADER_DEPENDS ac_ct_OBJC OBJCFLAGS @@ -1853,6 +1855,7 @@ CXXFLAGS CCC OBJC OBJCFLAGS +ANDROID_HOME CAPSTONE_PE_CFLAGS CAPSTONE_PE_LIBS CXX_PE_CFLAGS @@ -2664,6 +2667,8 @@ Some influential environment variables: CXXFLAGS C++ compiler flags OBJC Objective C compiler command OBJCFLAGS Objective C compiler flags + ANDROID_HOME + Path to the Android SDK CAPSTONE_PE_CFLAGS C compiler flags for the PE capstone, overriding the bundled version @@ -13072,6 +13077,134 @@ fi aarch64) exec_prefix='${prefix}/arm64-v8a' ;; esac fi + + GRADLE_MIN_VERSION=9.4.0 + ANDROID_COMPILE_SDK=36 + + + # Extract the first word of "gradle", so it can be a program name with args. +set dummy gradle; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_GRADLE+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $GRADLE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GRADLE="$GRADLE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_GRADLE="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac ;; +esac +fi +GRADLE=$ac_cv_path_GRADLE +if test -n "$GRADLE"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GRADLE" >&5 +printf "%s\n" "$GRADLE" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + test -n "$GRADLE" || as_fn_error $? "gradle not found" "$LINENO" 5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gradle can build a minimal Android project" >&5 +printf %s "checking whether gradle can build a minimal Android project... " >&6; } + + rm -rf conftest + mkdir -p conftest/src || as_fn_error $? "cannot create conftest/src" "$LINENO" 5 + + cat > conftest/build.gradle <<EOF + if (GradleVersion.current() < GradleVersion.version("$GRADLE_MIN_VERSION")) { + throw new GradleException("Gradle $GRADLE_MIN_VERSION+ required") + } + + apply plugin: 'com.android.application' + + buildscript + { + repositories + { + google() + mavenCentral() + } + dependencies + { + classpath "com.android.tools.build:gradle:9.1.0" + } + } + + repositories + { + google() + mavenCentral() + } + + android + { + namespace "com.test" + compileSdk $ANDROID_COMPILE_SDK + + defaultConfig + { + applicationId "com.test" + minSdk 21 + targetSdk $ANDROID_COMPILE_SDK + versionCode 1 + versionName "1.0" + } + + sourceSets + { + main.java.srcDirs = [ "./src" ] + main.manifest.srcFile "./AndroidManifest.xml" + } + } + + configurations.configureEach + { + exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib" + } +EOF + + echo "package com.test; public class A extends android.app.Activity { }" > conftest/src/A.java + echo '<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application><activity android:name="com.test.A" /></application></manifest>' > conftest/AndroidManifest.xml + + echo "configure: testing minimal Android Gradle build" >>config.log + if (cd conftest && env ANDROID_HOME="$ANDROID_HOME" "$GRADLE" -q assembleDebug >>../config.log 2>&1); then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "failed to build a minimal Android project with gradle and ANDROID_HOME='$ANDROID_HOME'. See 'config.log' for more details." "$LINENO" 5 + fi + + rm -rf conftest + SED_CMD="$SED_CMD -e 's,@GRADLE_MIN_VERSION@,$GRADLE_MIN_VERSION,g' -e 's,@ANDROID_COMPILE_SDK@,$ANDROID_COMPILE_SDK,g'" ;; *) @@ -24696,7 +24829,7 @@ dlls/ntdll/unix/version.c: dummy programs/winetest/build.rc: dummy @build=\"STRINGTABLE { 1 \\\"\`GIT_DIR=${wine_srcdir}.git git rev-parse HEAD 2>/dev/null\`\\\" }\" && (echo \$\$build | cmp -s - \$@) || echo \$\$build >\$@ || (rm -f \$@ && exit 1) dlls/wineandroid.drv/wine-debug.apk: dlls/wineandroid.drv/build.gradle ${wine_srcdir}dlls/wineandroid.drv/AndroidManifest.xml ${wine_srcdir}dlls/wineandroid.drv/WineActivity.java ${wine_srcdir}dlls/wineandroid.drv/wine.svg - cd dlls/wineandroid.drv && gradle -q -Psrcdir=$srcdir assembleDebug + cd dlls/wineandroid.drv && env ANDROID_HOME=\"$ANDROID_HOME\" $GRADLE -q -Psrcdir=$srcdir assembleDebug mv dlls/wineandroid.drv/build/outputs/apk/debug/wine-debug.apk \$@" @@ -25589,6 +25722,8 @@ OBJC = $OBJC OBJCFLAGS = $OBJCFLAGS ac_ct_OBJC = $ac_ct_OBJC WINELOADER_DEPENDS = $WINELOADER_DEPENDS +ANDROID_HOME = $ANDROID_HOME +GRADLE = $GRADLE MINGW_PKG_CONFIG = $MINGW_PKG_CONFIG CAPSTONE_PE_CFLAGS = $CAPSTONE_PE_CFLAGS CAPSTONE_PE_LIBS = $CAPSTONE_PE_LIBS diff --git a/configure.ac b/configure.ac index 9a437851996..1a0bca19403 100644 --- a/configure.ac +++ b/configure.ac @@ -1064,6 +1064,86 @@ case $host_os in aarch64) exec_prefix='${prefix}/arm64-v8a' ;; esac fi + + GRADLE_MIN_VERSION=9.4.0 + ANDROID_COMPILE_SDK=36 + + AC_ARG_VAR([ANDROID_HOME], [Path to the Android SDK]) + AC_PATH_PROG([GRADLE], [gradle]) + + test -n "$GRADLE" || AC_MSG_ERROR([gradle not found]) + + AC_MSG_CHECKING([whether gradle can build a minimal Android project]) + + rm -rf conftest + mkdir -p conftest/src || AC_MSG_ERROR([cannot create conftest/src]) + + cat > conftest/build.gradle <<EOF + if (GradleVersion.current() < GradleVersion.version("$GRADLE_MIN_VERSION")) { + throw new GradleException("Gradle $GRADLE_MIN_VERSION+ required") + } + + apply plugin: 'com.android.application' + + buildscript + { + repositories + { + google() + mavenCentral() + } + dependencies + { + classpath "com.android.tools.build:gradle:9.1.0" + } + } + + repositories + { + google() + mavenCentral() + } + + android + { + namespace "com.test" + compileSdk $ANDROID_COMPILE_SDK + + defaultConfig + { + applicationId "com.test" + minSdk 21 + targetSdk $ANDROID_COMPILE_SDK + versionCode 1 + versionName "1.0" + } + + sourceSets + { + main.java.srcDirs = [[ "./src" ]] + main.manifest.srcFile "./AndroidManifest.xml" + } + } + + configurations.configureEach + { + exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib" + } +EOF + + echo "package com.test; public class A extends android.app.Activity { }" > conftest/src/A.java + echo '<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application><activity android:name="com.test.A" /></application></manifest>' > conftest/AndroidManifest.xml + + echo "configure: testing minimal Android Gradle build" >>config.log + if (cd conftest && env ANDROID_HOME="$ANDROID_HOME" "$GRADLE" -q assembleDebug >>../config.log 2>&1); then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([failed to build a minimal Android project with gradle and ANDROID_HOME='$ANDROID_HOME'. See 'config.log' for more details.]) + fi + + rm -rf conftest + SED_CMD="$SED_CMD -e 's,@GRADLE_MIN_VERSION@,$GRADLE_MIN_VERSION,g' -e 's,@ANDROID_COMPILE_SDK@,$ANDROID_COMPILE_SDK,g'" ;; *) @@ -3844,7 +3924,7 @@ WINE_APPEND_RULE( programs/winetest/build.rc: dummy @build=\"STRINGTABLE { 1 \\\"\`GIT_DIR=${wine_srcdir}.git git rev-parse HEAD 2>/dev/null\`\\\" }\" && (echo \$\$build | cmp -s - \$[@]) || echo \$\$build >\$[@] || (rm -f \$[@] && exit 1) dlls/wineandroid.drv/wine-debug.apk: dlls/wineandroid.drv/build.gradle ${wine_srcdir}dlls/wineandroid.drv/AndroidManifest.xml ${wine_srcdir}dlls/wineandroid.drv/WineActivity.java ${wine_srcdir}dlls/wineandroid.drv/wine.svg - cd dlls/wineandroid.drv && gradle -q -Psrcdir=$srcdir assembleDebug + cd dlls/wineandroid.drv && env ANDROID_HOME=\"$ANDROID_HOME\" $GRADLE -q -Psrcdir=$srcdir assembleDebug mv dlls/wineandroid.drv/build/outputs/apk/debug/wine-debug.apk \$[@]]) dnl Misc rules diff --git a/dlls/wineandroid.drv/build.gradle.in b/dlls/wineandroid.drv/build.gradle.in index 8d0e138c9a2..03cab2741b3 100644 --- a/dlls/wineandroid.drv/build.gradle.in +++ b/dlls/wineandroid.drv/build.gradle.in @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -if (GradleVersion.current() < GradleVersion.version("9.4.0")) { - throw new GradleException("Gradle 9.4.0+ required") +if (GradleVersion.current() < GradleVersion.version("@GRADLE_MIN_VERSION@")) { + throw new GradleException("Gradle @GRADLE_MIN_VERSION@+ required") } apply plugin: 'com.android.application' @@ -107,7 +107,7 @@ tasks.withType(JavaCompile) android { namespace "org.winehq.wine" - compileSdkVersion 36 + compileSdk @ANDROID_COMPILE_SDK@ defaultConfig { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10438