Docker build for a15 // akita broken?

Hi all,

I’m attempting to build e/os for akita (Pixel 8a.) Following How to Build the /e/OS ROM? with the following docker run:

docker run \
-v "./srv/e/src:/srv/src" \
-v "./srv/e/zips:/srv/zips" \
-v "./srv/e/logs:/srv/logs" \
-v "./srv/e/ccache:/srv/ccache" \
-e "BRANCH_NAME=a15" \
-e "DEVICE_LIST=akita" \
-e "REPO=https://gitlab.e.foundation/e/os/android.git" \
--network host \
registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

The repo sync fails out-of-the-box with the following unrelated device trees not available. I’m new to android development in general. Having done some digging into how soong works, it’s really not clear to me why these trees are being brought in.

I guess my questions are:

  1. Am I using the correct branch (a15) for an android 15 build for akita?
  2. Is there a document that goes into a little more detail about how these trees are being brought into the build in the first place?
  3. In the case that these are actually required, what steps would you suggest to ‘find’ these repos?

Thanks in advance (errors follow)

[100% 131/131] analyzing Android.bp files and generating ninja file at out/soong/build.lineage_akita.ninja
FAILED: out/soong/build.lineage_akita.ninja
cd "$(dirname "out/host/linux-x86/bin/soong_build")" && BUILDER="$PWD/$(basename "out/host/linux-x86/bin/soong_build")" && cd / && env -i  "$BUILDER"     --top "$TOP"     --soong_out "out/soong"     --out "out"     --soong_variables out/soong/soong.lineage_akita.variables -o out/soong/build.lineage_akita.ninja -l out/.module_paths/Android.bp.list --available_env out/soong/soong.environment.available --used_env out/soong/soong.environment.used.lineage_akita.build Android.bp
error: vendor/motorola/troika/Android.bp:5:1: module "soong_namespace": namespace device/motorola/exynos9610-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/d1x/Android.bp:5:1: module "soong_namespace": namespace device/samsung/exynos9820-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/capri/Android.bp:5:1: module "soong_namespace": namespace hardware/motorola does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/gta4xl-common/Android.bp:5:1: module "soong_namespace": namespace device/samsung/gta4xl-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/hawao/Android.bp:5:1: module "soong_namespace": namespace hardware/motorola does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/milanf/Android.bp:5:1: module "soong_namespace": namespace device/motorola/milanf does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/gta4l-common/Android.bp:5:1: module "soong_namespace": namespace device/samsung/gta4l-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/sm8250-common/Android.bp:5:1: module "soong_namespace": namespace device/motorola/sm8250-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/google/bluejay/Android.bp:5:1: module "soong_namespace": namespace device/google/bluejay does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/google/shiba/Android.bp:5:1: module "soong_namespace": namespace device/google/shusky does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/thyme/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/sweet/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/oneplus/waffle/Android.bp:5:1: module "soong_namespace": namespace hardware/oplus does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/davinci/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/nokia/DRG/Android.bp:5:1: module "soong_namespace": namespace device/nokia/sdm660-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/haydn/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/a72q/Android.bp:5:1: module "soong_namespace": namespace device/samsung/sm7125-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/vayu/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/earth/Android.bp:5:1: module "soong_namespace": namespace hardware/mediatek does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/msm8998-common/Android.bp:5:1: module "soong_namespace": namespace device/motorola/msm8998-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/oneplus/salami/Android.bp:5:1: module "soong_namespace": namespace hardware/oplus does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/d1/Android.bp:5:1: module "soong_namespace": namespace device/samsung/exynos9820-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/sm8450-common/Android.bp:5:1: module "soong_namespace": namespace device/xiaomi/sm8450-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/perseus/Android.bp:5:1: module "soong_namespace": namespace hardware/xiaomi does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/guam/Android.bp:5:1: module "soong_namespace": namespace hardware/motorola does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/samsung/sm7325-common/Android.bp:5:1: module "soong_namespace": namespace device/samsung/sm7325-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/river/Android.bp:5:1: module "soong_namespace": namespace device/motorola/river does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/xiaomi/zeus/Android.bp:5:1: module "soong_namespace": namespace device/xiaomi/sm8450-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/sony/sm8250-common/Android.bp:5:1: module "soong_namespace": namespace hardware/sony does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/sony/pdx215/Android.bp:5:1: module "soong_namespace": namespace hardware/sony does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/oneplus/sm8350-common/Android.bp:5:1: module "soong_namespace": namespace device/oneplus/sm8350-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
error: vendor/motorola/sm8475-common/Android.bp:5:1: module "soong_namespace": namespace device/motorola/sm8475-common does not exist; Some necessary modules may have been skipped by Soong. Check if PRODUCT_SOURCE_ROOT_DIRS is pruning necessary Android.bp files.
ninja: build stopped: subcommand failed.
17:34:18 soong bootstrap failed with: exit status 1

#### failed to build some targets (38 seconds) ####

>> [Sat Oct 11 17:34:18 UTC 2025] Starting signing target-files-package
find: '/srv/src/A15/out/target/product/akita/obj/PACKAGING/target_files_intermediates/': No such file or directory
>> [Sat Oct 11 17:34:18 UTC 2025] Unable to find lineage_-target_files-20251011.zip
>> [Sat Oct 11 17:34:18 UTC 2025] Finishing build for akita
>> [Sat Oct 11 17:34:18 UTC 2025] Cleaning source dir for device akita
>> [Sat Oct 11 17:34:20 UTC 2025] Switch back to Python3

can you remove the py2 switch as described at Enchilada build - #4 by tcecyk ?

Thanks for pointing this out. I’ve made that change, but it does not address the issue (unless I have to clean/rm the whole thing and re-sync?!)

I’ve also made some changes to the Dockerfile.community that get in front of some deprecated Dockerfile format changes:

$ git diff
diff --git a/Dockerfile.community b/Dockerfile.community
index d7b0d82..6259f68 100644
--- a/Dockerfile.community
+++ b/Dockerfile.community
@@ -1,136 +1,136 @@
 FROM ubuntu:24.04
-MAINTAINER Romain Hunault <romain.hunault@e.email>
+LABEL org.opencontainers.image.authors="Romain Hunault <romain.hunault@e.email>"
 
 # Environment variables
 #######################
 
-ENV MIRROR_DIR /srv/mirror
-ENV SRC_DIR /srv/src
-ENV TMP_DIR /srv/tmp
-ENV CCACHE_DIR /srv/ccache
-ENV ZIP_DIR /srv/zips
-ENV LMANIFEST_DIR /srv/local_manifests
-ENV KEYS_DIR /srv/keys
-ENV LOGS_DIR /srv/logs
-ENV USERSCRIPTS_DIR /srv/userscripts
+ENV MIRROR_DIR=/srv/mirror
+ENV SRC_DIR=/srv/src
+ENV TMP_DIR=/srv/tmp
+ENV CCACHE_DIR=/srv/ccache
+ENV ZIP_DIR=/srv/zips
+ENV LMANIFEST_DIR=/srv/local_manifests
+ENV KEYS_DIR=/srv/keys
+ENV LOGS_DIR=/srv/logs
+ENV USERSCRIPTS_DIR=/srv/userscripts
 
-ENV DEBIAN_FRONTEND noninteractive
-ENV USER root
+ENV DEBIAN_FRONTEND=noninteractive
+ENV USER=root
 
 # Configurable environment variables
 ####################################
 
 # By default we want to use CCACHE, you can disable this
 # WARNING: disabling this may slow down a lot your builds!
-ENV USE_CCACHE 1
+ENV USE_CCACHE=1
 
 # ccache maximum size. It should be a number followed by an optional suffix: k,
 # M, G, T (decimal), Ki, Mi, Gi or Ti (binary). The default suffix is G. Use 0
 # for no limit.
-ENV CCACHE_SIZE 50G
+ENV CCACHE_SIZE=50G
 
 # We need to specify the ccache binary since it is no longer packaged along with AOSP
-ENV CCACHE_EXEC /usr/bin/ccache
+ENV CCACHE_EXEC=/usr/bin/ccache
 
 # Environment for the /e/ branches name
 # See https://github.com/LineageOS/android_vendor_cm/branches for possible options
-ENV BRANCH_NAME 'v1-q'
+ENV BRANCH_NAME='v1-q'
 
 # Environment for the device list (separate by comma if more than one)
 # eg. DEVICE_LIST=hammerhead,bullhead,angler
-ENV DEVICE_LIST ''
+ENV DEVICE_LIST=''
 
 # Release type string
-ENV RELEASE_TYPE 'UNOFFICIAL'
+ENV RELEASE_TYPE='UNOFFICIAL'
 
 # Repo use for build
-ENV REPO 'https://gitlab.e.foundation/e/os/android.git'
+ENV REPO='https://gitlab.e.foundation/e/os/android.git'
 
 # Repo use for build
-ENV MIRROR 'https://github.com/LineageOS/mirror'
+ENV MIRROR='https://github.com/LineageOS/mirror'
 
 # OTA URL that will be used inside CMUpdater
 # Use this in combination with LineageOTA to make sure your device can auto-update itself from this buildbot
-ENV OTA_URL ''
+ENV OTA_URL=''
 
 # User identity
-ENV USER_NAME 'LineageOS Buildbot'
-ENV USER_MAIL 'lineageos-buildbot@docker.host'
+ENV USER_NAME='LineageOS Buildbot'
+ENV USER_MAIL='lineageos-buildbot@docker.host'
 
 # Include proprietary files, downloaded automatically from github.com/TheMuppets/ and gitlab.com/the-muppets/
 # Only some branches are supported
-ENV INCLUDE_PROPRIETARY true
+ENV INCLUDE_PROPRIETARY=true
 
 # Mount an overlay filesystem over the source dir to do each build on a clean source
-ENV BUILD_OVERLAY false
+ENV BUILD_OVERLAY=false
 
 # Clone the full LineageOS mirror (> 200 GB)
-ENV LOCAL_MIRROR false
+ENV LOCAL_MIRROR=false
 
 # If you want to preserve old ZIPs set this to 'false'
-ENV CLEAN_OUTDIR false
+ENV CLEAN_OUTDIR=false
 
 # Change this cron rule to what fits best for you
 # Use 'now' to start the build immediately
 # For example, '0 10 * * *' means 'Every day at 10:00 UTC'
-ENV CRONTAB_TIME 'now'
+ENV CRONTAB_TIME='now'
 
 # Clean artifacts output after each build
-ENV CLEAN_AFTER_BUILD true
+ENV CLEAN_AFTER_BUILD=true
 
 # Provide root capabilities builtin inside the ROM (see http://lineageos.org/Update-and-Build-Prep/)
-ENV WITH_SU false
+ENV WITH_SU=false
 
 # Provide a default JACK configuration in order to avoid out-of-memory issues
-ENV ANDROID_JACK_VM_ARGS "-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4G"
+ENV ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4G"
 
 # Custom packages to be installed
-ENV CUSTOM_PACKAGES ''
+ENV CUSTOM_PACKAGES=''
 
 # Sign the builds with the keys in $KEYS_DIR
-ENV SIGN_BUILDS false
+ENV SIGN_BUILDS=false
 
 # When SIGN_BUILDS = true but no keys have been provided, generate a new set with this subject
-ENV KEYS_SUBJECT '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
+ENV KEYS_SUBJECT='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 
 # Move the resulting zips to $ZIP_DIR/$codename instead of $ZIP_DIR/
-ENV ZIP_SUBDIR true
+ENV ZIP_SUBDIR=true
 
 # Write the verbose logs to $LOGS_DIR/$codename instead of $LOGS_DIR/
-ENV LOGS_SUBDIR true
+ENV LOGS_SUBDIR=true
 
 # Delete old zips in $ZIP_DIR, keep only the N latest one (0 to disable)
-ENV DELETE_OLD_ZIPS 0
+ENV DELETE_OLD_ZIPS=0
 
 # Delete old logs in $LOGS_DIR, keep only the N latest one (0 to disable)
-ENV DELETE_OLD_LOGS 0
+ENV DELETE_OLD_LOGS=0
 
 # Assume device does not use vendor_boot as recovery by default
-ENV VBOOT_IS_RECOVERY false
+ENV VBOOT_IS_RECOVERY=false
 
 # Assume device does not need additional files for recovery to boot.
-ENV RECOVERY_NEEDS_SUPPORT_IMG false
+ENV RECOVERY_NEEDS_SUPPORT_IMG=false
 
 # Assume device does not use vendor_boot for recovery to boot by default.
-ENV RECOVERY_NEEDS_VENDOR_BOOT_IMG false
+ENV RECOVERY_NEEDS_VENDOR_BOOT_IMG=false
 
 # Assume device does not use boot.img for recovery to boot by default.
-ENV RECOVERY_NEEDS_BOOT_IMG false
+ENV RECOVERY_NEEDS_BOOT_IMG=false
 
 # Assume device does not use DTBO for recovery to boot by default.
-ENV RECOVERY_NEEDS_DTBO_IMG false
+ENV RECOVERY_NEEDS_DTBO_IMG=false
 
 # Assume device does not use VBMETA for recovery to boot by default.
-ENV RECOVERY_NEEDS_VBMETA_IMG false
+ENV RECOVERY_NEEDS_VBMETA_IMG=false
 
 # Assume device does not use super_image for recovery to boot by default.
-ENV RECOVERY_NEEDS_SUPER_IMG false
+ENV RECOVERY_NEEDS_SUPER_IMG=false
 
 # Assume device does not use vendor_kernel_boot for recovery to boot by default.
-ENV RECOVERY_NEEDS_VENDOR_KERNEL_BOOT_IMG false
+ENV RECOVERY_NEEDS_VENDOR_KERNEL_BOOT_IMG=false
 
 # Force an eng build even when device name doesn't contain -eng
-ENV ENG_BUILD false
+ENV ENG_BUILD=false
 
 
 # You can optionally specify a USERSCRIPTS_DIR volume containing these scripts:
@@ -210,4 +210,4 @@ RUN ln -sf /proc/1/fd/1 /var/log/docker.log
 
 # Set the entry point to init.sh
 ################################
-ENTRYPOINT /root/init.sh
+ENTRYPOINT ["/root/init.sh"]
diff --git a/build-community.sh b/build-community.sh
index 7bea9c5..b4b9b51 100755
--- a/build-community.sh
+++ b/build-community.sh
@@ -335,8 +335,6 @@ for branch in ${BRANCH_NAME//,/ }; do
         echo ">> [$(date)] Starting build for $codename, $branch branch" | tee -a "$DEBUG_LOG"
         build_successful=false
         echo ">> [$(date)] ANDROID_JACK_VM_ARGS=${ANDROID_JACK_VM_ARGS}"
-        echo ">> [$(date)] Switch to Python2"
-        ln -fs /usr/bin/python2 /usr/bin/python
 
         if [[ "${BRANCH_NAME}" = *"rc"* ]] || [[ "${BRANCH_NAME}" = *"alpha"* ]] || [[ "${BRANCH_NAME}" == *"beta"* ]]; then
           PRODUCT_PRERELEASE=$(echo ${BRANCH_NAME} | sed -E 's/v[0-9]*\.[0-9]*(\.[0-9]*)?-(beta|alpha|rc).*/\2/')
@@ -489,8 +487,6 @@ for branch in ${BRANCH_NAME//,/ }; do
           fi
         fi
 
-        echo ">> [$(date)] Switch back to Python3"
-        ln -fs /usr/bin/python3 /usr/bin/python
       fi
     done
   fi

sorry that was a shot in the dark - soong is unrelated to python env version. It’s just an obvious issue in the community docker image

Android.bp … module “soong_namespace”: namespace … does not exist;

as to your initial 3 questions in one answer → you’d need to follow the build manifest that sets upstream repos and branch names in (also nested-) xml. With “a15” you just choose the branch of the REPO url, but therein the manifest decides on other branch names.

At some point the device name you supply is converted into a roomservice.xml that has the device-specific repos, and I guess this one doesn’t get built? Lineage has python (where py version can be relevant) that will create that roomservice.xml on the fly.

Reading anything about the Anroid lunch / brunch / breakfast commands at official Android docs or at Lineage will make you give more insight how the turtles are stacked.

(I havent built aosp in 2 years and past beginnings not with the docker method, so I’m not that reliable)