From 871d87f3d54a855114f7051108106a3f5a658b7b Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 10 Apr 2026 06:15:48 +0800 Subject: [PATCH 1/6] Ensure gradle uses custom cross-build dir. --- Android/testbed/app/build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index b58edc04a929d9..edbf4e877b7119 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -8,7 +8,9 @@ plugins { val ANDROID_DIR = file("../..") val PYTHON_DIR = ANDROID_DIR.parentFile!! -val PYTHON_CROSS_DIR = file("$PYTHON_DIR/cross-build") +val PYTHON_CROSS_DIR = file( + "$PYTHON_DIR/" + (System.getenv("CROSS_BUILD_DIR") ?: "cross-build") +) val inSourceTree = ( ANDROID_DIR.name == "Android" && file("$PYTHON_DIR/pyconfig.h.in").exists() ) From 7afb6989f2f7cc1a5d6fc63b38ccf898d92b83dc Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 10 Apr 2026 06:23:55 +0800 Subject: [PATCH 2/6] Pass CROSS_BUILD_DIR to gradle environment. --- Android/android.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Android/android.py b/Android/android.py index adcc7c708d95f7..6b41894bba0843 100755 --- a/Android/android.py +++ b/Android/android.py @@ -401,6 +401,7 @@ def build_testbed(context): run( [gradlew, "--console", "plain", "packageDebug", "packageDebugAndroidTest"], cwd=TESTBED_DIR, + env={} ) @@ -645,6 +646,10 @@ async def gradle_task(context): task_prefix = "connected" env["ANDROID_SERIAL"] = context.connected + # Ensure that CROSS_BUILD_DIR is in the Gradle environment, regardless + # of whether it was set by environment variable or `--cross-build-dir`. + env["CROSS_BUILD_DIR"] = CROSS_BUILD_DIR + if context.ci_mode: context.args[0:0] = [ # See _add_ci_python_opts in libregrtest/main.py. From db873ac1c261ece7b43820db20afdb6065019a95 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 10 Apr 2026 06:29:39 +0800 Subject: [PATCH 3/6] Ensure testbed builds also get the cross-build environment. --- Android/android.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Android/android.py b/Android/android.py index 6b41894bba0843..fa475f17099039 100755 --- a/Android/android.py +++ b/Android/android.py @@ -398,10 +398,15 @@ def setup_testbed(): def build_testbed(context): setup_sdk() setup_testbed() + + # Ensure that CROSS_BUILD_DIR is in the Gradle environment, regardless + # of whether it was set by environment variable or `--cross-build-dir`. + env = os.environ.copy() + env["CROSS_BUILD_DIR"] = CROSS_BUILD_DIR run( [gradlew, "--console", "plain", "packageDebug", "packageDebugAndroidTest"], cwd=TESTBED_DIR, - env={} + env=env, ) From 68ba1d733b252f8a50d42566ddc72e7e0dd3db48 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 10 Apr 2026 09:36:44 +0800 Subject: [PATCH 4/6] Allow for cross-build to be absolute. --- Android/android.py | 3 ++- Android/testbed/app/build.gradle.kts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Android/android.py b/Android/android.py index fa475f17099039..f9f6de73803ff1 100755 --- a/Android/android.py +++ b/Android/android.py @@ -906,7 +906,7 @@ def add_parser(*args, **kwargs): help="Delete build directories for the selected target" ) - add_parser("build-testbed", help="Build the testbed app") + build_testbed = add_parser("build-testbed", help="Build the testbed app") test = add_parser("test", help="Run the testbed app") package = add_parser("package", help="Make a release package") ci = add_parser("ci", help="Run build, package and test") @@ -922,6 +922,7 @@ def add_parser(*args, **kwargs): make_host, build, package, + build_testbed, test, ci, ]: diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index edbf4e877b7119..2a0544907cf508 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -8,8 +8,9 @@ plugins { val ANDROID_DIR = file("../..") val PYTHON_DIR = ANDROID_DIR.parentFile!! +val CROSS_BUILD_DIR = System.getenv("CROSS_BUILD_DIR") ?: "cross-build" val PYTHON_CROSS_DIR = file( - "$PYTHON_DIR/" + (System.getenv("CROSS_BUILD_DIR") ?: "cross-build") + if ((File(CROSS_BUILD_DIR)).isAbsolute) CROSS_BUILD_DIR else "$PYTHON_DIR/$CROSS_BUILD_DIR" ) val inSourceTree = ( ANDROID_DIR.name == "Android" && file("$PYTHON_DIR/pyconfig.h.in").exists() From f3d4fe88d18a36cbd3ecf320c5e448b00910c745 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 11 Apr 2026 15:13:49 +0800 Subject: [PATCH 5/6] Simplify interpretation of CROSS_BUILD_DIR Co-authored-by: Malcolm Smith --- Android/testbed/app/build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index 2a0544907cf508..c652d63d9cb2b7 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -8,9 +8,7 @@ plugins { val ANDROID_DIR = file("../..") val PYTHON_DIR = ANDROID_DIR.parentFile!! -val CROSS_BUILD_DIR = System.getenv("CROSS_BUILD_DIR") ?: "cross-build" -val PYTHON_CROSS_DIR = file( - if ((File(CROSS_BUILD_DIR)).isAbsolute) CROSS_BUILD_DIR else "$PYTHON_DIR/$CROSS_BUILD_DIR" +val PYTHON_CROSS_DIR = file(System.getenv("CROSS_BUILD_DIR") ?: "$PYTHON_DIR/cross-build") ) val inSourceTree = ( ANDROID_DIR.name == "Android" && file("$PYTHON_DIR/pyconfig.h.in").exists() From 030c9bd9f27ca210adafb1ec87463fc3b25753c0 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 11 Apr 2026 15:40:10 +0800 Subject: [PATCH 6/6] Remove build-testbed command, ensure cross-build-dir is on all commands. --- Android/android.py | 59 ++++++---------------------- Android/testbed/app/build.gradle.kts | 1 - 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/Android/android.py b/Android/android.py index f9f6de73803ff1..9d452ea87fced9 100755 --- a/Android/android.py +++ b/Android/android.py @@ -393,23 +393,6 @@ def setup_testbed(): os.chmod(out_path, 0o755) -# run_testbed will build the app automatically, but it's useful to have this as -# a separate command to allow running the app outside of this script. -def build_testbed(context): - setup_sdk() - setup_testbed() - - # Ensure that CROSS_BUILD_DIR is in the Gradle environment, regardless - # of whether it was set by environment variable or `--cross-build-dir`. - env = os.environ.copy() - env["CROSS_BUILD_DIR"] = CROSS_BUILD_DIR - run( - [gradlew, "--console", "plain", "packageDebug", "packageDebugAndroidTest"], - cwd=TESTBED_DIR, - env=env, - ) - - # Work around a bug involving sys.exit and TaskGroups # (https://github.com/python/cpython/issues/101515). def exit(*args): @@ -882,6 +865,18 @@ def parse_args(): def add_parser(*args, **kwargs): parser = subcommands.add_parser(*args, **kwargs) + parser.add_argument( + "--cross-build-dir", + action="store", + default=os.environ.get("CROSS_BUILD_DIR"), + dest="cross_build_dir", + type=Path, + help=( + "Path to the cross-build directory " + f"(default: {CROSS_BUILD_DIR}). Can also be set " + "with the CROSS_BUILD_DIR environment variable." + ), + ) parser.add_argument( "-v", "--verbose", action="count", default=0, help="Show verbose output. Use twice to be even more verbose.") @@ -894,7 +889,7 @@ def add_parser(*args, **kwargs): ) configure_build = add_parser( "configure-build", help="Run `configure` for the build Python") - make_build = add_parser( + add_parser( "make-build", help="Run `make` for the build Python") configure_host = add_parser( "configure-host", help="Run `configure` for Android") @@ -906,39 +901,12 @@ def add_parser(*args, **kwargs): help="Delete build directories for the selected target" ) - build_testbed = add_parser("build-testbed", help="Build the testbed app") test = add_parser("test", help="Run the testbed app") package = add_parser("package", help="Make a release package") ci = add_parser("ci", help="Run build, package and test") env = add_parser("env", help="Print environment variables") # Common arguments - # --cross-build-dir argument - for cmd in [ - clean, - configure_build, - make_build, - configure_host, - make_host, - build, - package, - build_testbed, - test, - ci, - ]: - cmd.add_argument( - "--cross-build-dir", - action="store", - default=os.environ.get("CROSS_BUILD_DIR"), - dest="cross_build_dir", - type=Path, - help=( - "Path to the cross-build directory " - f"(default: {CROSS_BUILD_DIR}). Can also be set " - "with the CROSS_BUILD_DIR environment variable." - ), - ) - # --cache-dir option for cmd in [configure_host, build, ci]: cmd.add_argument( @@ -1043,7 +1011,6 @@ def main(): "make-host": make_host_python, "build": build_targets, "clean": clean_targets, - "build-testbed": build_testbed, "test": run_testbed, "package": package, "ci": ci, diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index c652d63d9cb2b7..bd8334b64bb0a8 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -9,7 +9,6 @@ plugins { val ANDROID_DIR = file("../..") val PYTHON_DIR = ANDROID_DIR.parentFile!! val PYTHON_CROSS_DIR = file(System.getenv("CROSS_BUILD_DIR") ?: "$PYTHON_DIR/cross-build") -) val inSourceTree = ( ANDROID_DIR.name == "Android" && file("$PYTHON_DIR/pyconfig.h.in").exists() )