What it costs to build AOSP 16 on a 2010 IBM x3650 M3

I needed to build /e/OS to work on the prototype of a new feature. I had the idea of restarting an old machine, and I honestly wondered whether it would still cope with a modern AOSP tree.

It did, after two repairs: I added 32 GB of RAM (48 GB in total) and replaced a failing disk in the RAID array. Here is the full /e/OS build for the Fairphone 6 (AOSP 16, LineageOS 23.0 base) on a rack server whose CPUs predate AVX: the time, memory, disk, bandwidth and power it takes, and what breaks along the way.

Result: 8 h 54 min of build time, 124 GB of build output, about 344 GB of disk in total, and roughly €0.55–0.70 of electricity.

The machine

The x3650 M3 (machine type 7945) shipped in 2010, one generation after the 2009 M2. It is a 2U, dual-socket Westmere-EP box with triple-channel DDR3 per socket.

CPU2 × Xeon E5620, 32 nm Westmere-EP, 4 cores / 8 threads each, 2.40 GHz (2.66 turbo), 12 MB L3 each, 80 W TDP each
Threads16
ISASSE4.2, AES-NI. No AVX (that arrived with Sandy Bridge in 2011)
Memory48 GB DDR3 ECC RDIMM over six channels; DDR3-1066 is this CPU’s ceiling
StorageServeRAID M5014 (LSI SAS2108). Sources and output on a 5.9 TB RAID 5 volume, OS on a separate volume
Host OSUbuntu 20.04, kernel 5.4, glibc 2.31, Python 3.8

AOSP’s host toolchain still runs on a pre-AVX x86-64 CPU: the prebuilt Clang, the JDK 21 used by the build, and Rust 1.83 all ran without complaint. The old userland is the real constraint (see below).

The bill

Source sync34 min for about 970 repositories (repo sync -c -j8 --no-tags)
Git objects81 GB
Checked-out tree93 GB
Device images3.75 GB vendor factory image + 2.4 GB official /e/OS OTA, used to extract proprietary blobs and firmware
Build graph174,567 actions
Soong / Kati analysisabout 10 min before the first compile step, with about 26 GB of RAM in use at the peak
During compile16 threads at 92–100%, load average around 18, 8–10 GB of RAM in use (Java-heavy phases)
Main compile7 h 52 min to reach 96% (168,409 actions), when a packaging step failed
Finishing runs10 min + 19 min + 33 min (three incremental restarts after fixes)
Total build time8 h 54 min
Build output (out/)124 GB
ccache20 GB
Disk, everythingabout 344 GB: git objects, tree, out/, ccache and the two device images
Deliverables2.44 GB OTA package, 2.71 GB fastboot image package
Previous run, AOSP 15Full build of the same device: 10 h 23 min, with only 20 GB of RAM. Incremental rebuilds: 27 min to 1 h 22 min
Measured on this machine
Powerabout 250–300 W at the wall under full load, so 2.2–2.7 kWh for the 8 h 54 min
Electricityroughly €0.55–0.70 per full build at €0.25/kWh
Uninterrupted buildabout 8 h 30 min, if none of the failures below had happened
Estimated (not metered)

The electricity is cheap. The real cost is time: a current 32-thread desktop does the same build in a fraction of it, and every failed run on this box costs minutes to hours before the error shows up.

 1 [|||||||||||  94.1%]   2 [|||||||||||  93.5%]   3 [|||||||||||  94.1%]   4 [|||||||||||  94.7%]
 5 [|||||||||||  94.8%]   6 [|||||||||||  92.9%]   7 [|||||||||||| 96.8%]   8 [|||||||||||  94.8%]
 9 [|||||||||||  93.5%]  10 [|||||||||||  95.4%]  11 [|||||||||||  93.5%]  12 [|||||||||||  92.1%]
13 [|||||||||||| 96.1%]  14 [|||||||||||  94.0%]  15 [||||||||||||100.0%]  16 [|||||||||||  92.7%]
Mem 8.56G/47.1G   Tasks 95, 471 thr; 16 running   Load 18.29 15.44 10.99
  CPU% COMMAND
  161. prebuilts/jdk/jdk21/linux-x86/bin/java -XX:OnError="cat hs_err_pid%p.log" …
  125. java -XX:CICompilerCount=6 -XX:+UseDynamicNumberOfGCThreads …
  99.9 prebuilts/rust/linux-x86/1.83.0/bin/rustc -C linker=out/host/linux-x86/bin/…
  37.9 prebuilts/jdk/jdk21/linux-x86/bin/javac -J-Xmx4096M …
  … about 40 more JVMs

htop about 25 minutes into the compile phase. Dozens of JVMs (javac, plus the Java tools that generate API stubs and docs) and rustc keep all 16 threads busy.

What broke, in order

  • Rate limiting during sync. One AOSP repository (external/crosvm) failed with HTTP 429 from googlesource at -j8. Re-syncing that single project with -j1 fixed it.
  • A private dependency. The device tree inherits a launcher package whose repository is no longer public. An empty config.mk in its place removes it from the product cleanly.
  • glibc 2.34 required by a prebuilt. prebuilts/extract-tools/.../stripzip is linked against glibc 2.34; Ubuntu 20.04 has 2.31. It only normalises zip timestamps during blob extraction, so a no-op stub keeps the files byte-identical to the vendor’s. The other extract tools and the compiler toolchain still run on 2.31.
  • EROFS partitions. The official /e/OS OTA ships EROFS images, which Ubuntu 20.04 cannot read. Building fsck.erofs from the tree’s own external/erofs-utils, statically linked against the in-tree external/lz4, took a minute and allowed fsck.erofs --extract.
  • Pinned firmware from an older release. Sixteen Wi-Fi firmware files (vendor/firmware/qca6750/*) are pinned by SHA-1 to an older vendor release (FP6.QREL.15.176.0) that is no longer downloadable. The official /e/OS image contains exactly those hashes, so they were taken from there and verified one by one.
  • Bootloader firmware. 20 of the 24 radio images (xbl, abl, tz, hyp, …) in the vendor factory image differed from the ones the official /e/OS release ships. To avoid flashing anything older than what the phone already runs (anti-rollback), all 24 were taken from the official release. The generated Android.mk checks each radio file’s SHA-1, so those checksums had to be regenerated to match.
  • Missing HAL repository. The product requires android.hardware.nfc-service.sec, provided by hardware/samsung_slsi/nfc, which is not in the manifest. LineageOS lists it in the device’s dependencies; adding it to a local manifest (branch lineage-23.0) let Kati finish.
  • repo inside the build sandbox, at 96%. The rule that writes product/etc/build-manifest.xml runs repo manifest, which keeps a JSON cache of the user’s git config in ~/.repo_.gitconfig.json. When ~/.gitconfig does not exist, repo considers the cache stale on every call and rewrites it, and the build sandbox mounts $HOME read-only. Creating an empty ~/.gitconfig and running repo manifest once outside the build fixed it.
  • A presigned app in the image. Prebuilt APKs that keep their own signature and target API 30 or higher must be declared preprocessed: true, so the build checks them (zip-aligned, uncompressed dex for a privileged app) instead of rewriting them and breaking the v2 signature.

Most failures surfaced during Kati, 2 to 7 minutes into a run. The sandbox one appeared after 7 h 52 min. Thanks to the incremental build, fixing it cost 10 minutes rather than a second night.

Takeaways

  • A 16-thread Westmere box with 48 GB of RAM can still build AOSP 16. CPU age is not the blocker; memory and the host’s userland are.
  • Give Soong’s analysis phase about 30 GB of headroom, or enable swap before the first run.
  • Ubuntu 20.04 works as a host if you are ready to work around a few tools that expect glibc 2.34.
  • Take radio firmware from the release the phone is running, not from the newest vendor image.
  • Make sure ~/.gitconfig exists before a long run, even empty.
  • Use ccache from the start. The first build pays for every later one.

Build target: lineage_FP6-userdebug, /e/OS 4.3.1-a16, BUILD_ID BP2A.250805.005, AOSP 16. Built with breakfast FP6 userdebug && m bacon -j12, ccache enabled.

And you?

What does it cost you to build an AOSP-based OS: which machine, how many hours, how much disk? Which tricks and practices do you recommend to make it faster or less painful? Share your numbers and setups in the comments.


Gaël Duval
CEO at Murena, President at e Foundation

Written with the help of an AI assistant. The machine, the build and the ideas are mine.

Independence, or the end of the client state

English · Français (coming) · Deutsch (coming)

On 20 August 2025, Nicolas Guillou, a judge at the International Criminal Court in The Hague, was added to a United States sanctions list for his part in the arrest warrant against Israel’s prime minister. Within days his Visa and Mastercard cards stopped working. His Amazon, Airbnb, PayPal and Expedia accounts were closed, and so was his Booking account, a company run from Amsterdam and owned in Connecticut. Parcels were refused when the carrier was UPS. He could no longer book a hotel or a trip online. He described it as travelling thirty years back in time. His Slovenian colleague Beti Hohler, sanctioned for the same warrant, had her Apple ID and iCloud blocked, and a European bank she had been with for decades closed her account the day after.

None of this happened in America. It happened in the Netherlands, to European citizens, judges of a court that 125 states created by treaty, for doing their job. Thirteen of the Court’s judges, prosecutors and staff are now under the same sanctions, including, since August 2026, the Court’s own president. In February 2026, France’s president wrote to Washington asking for them to be lifted, for Judge Guillou and for Thierry Breton, a former European Commissioner targeted over the European Union’s own digital rules. Judge Guillou still cannot use his bank card, and no European institution has the power to give it back to him.

Continue reading “Independence, or the end of the client state”

Ein Erbe für alle, finanziert aus Erbschaften

English · Français · Deutsch

Maschinelle Übersetzung. Maßgeblich ist die englische Fassung.

Ich war 25, als ich im Sommer 1998 die erste Version von Mandrake Linux veröffentlichte. Die Idee selbst kostete nichts: ein PC, ein Internetanschluss, ein paar Monate Nachtarbeit. Alles, was danach kam, kostete Geld, das wir nicht hatten, und wir haben die folgenden zwei Jahre damit verbracht, es aufzutreiben. Ich hatte Glück. Ich kenne Leute meiner Generation, die bessere Ideen hatten als ich und sie nie ausprobieren konnten, aus dem banalsten Grund der Welt: In ihrem Umfeld hatte niemand etwas zu verleihen.

Dieser Beitrag ist eine radikale Antwort darauf. Ich behaupte nicht, dass sie morgen beschlossen werden könnte. Ich lege sie auf den Tisch, weil Europa der Debatte, die sie eröffnet, seit einem Jahrhundert ausweicht, und weil die Beträge dahinter weit größer sind, als man zugibt.

Continue reading “Ein Erbe für alle, finanziert aus Erbschaften”

Europa ist nicht kaputt. Noch will es kaum jemand.

English · Français · Deutsch

Maschinelle Übersetzung. Maßgeblich ist die englische Fassung.

Mit fünfzehn habe ich eine kleine Zeitschrift gemacht. Sie hieß Europe Journal, ich versuchte, jeden Monat eine Ausgabe herauszubringen, und sie war in zwei oder drei Sprachen geschrieben. Ich glaube nicht, dass sie je mehr als ein paar Dutzend Leser hatte. Schon damals war ich von etwas überzeugt, wovon ich heute noch fester überzeugt bin: dass die Länder dieses Kontinents für sich allein keine Zukunft haben. Kein langsamer Niedergang, sondern das Ende ihrer Existenz als eigenständige Akteure, oder bestenfalls eine bequeme Vasallenrolle gegenüber der jeweils größeren Macht, die gerade guter Laune ist.

Mehr als fünfunddreißig Jahre später bin ich frustriert und wütend darüber, wie wenig sich bewegt hat. Diese Reihe ist mein Versuch zu sagen, was sich ändern müsste.

Continue reading “Europa ist nicht kaputt. Noch will es kaum jemand.”

Un héritage pour tous, financé par l’héritage

English · Français · Deutsch

Traduction automatique. La version anglaise fait référence.

J’avais 25 ans quand j’ai sorti la première Mandrake Linux, à l’été 1998. L’idée elle-même n’a rien coûté : un PC, une connexion internet, quelques mois de nuits. Tout ce qui a suivi a coûté de l’argent que nous n’avions pas, et nous avons passé les deux années suivantes à le trouver. J’ai eu de la chance. Je connais des gens de ma génération qui avaient de meilleures idées que la mienne et qui n’ont jamais pu se lancer, pour la raison la plus banale du monde : personne autour d’eux n’avait de quoi prêter.

Cet article propose une réponse radicale à ça. Je ne prétends pas qu’elle pourrait passer demain. Je la mets sur la table parce que le débat qu’elle ouvre, l’Europe l’évite depuis un siècle, et parce que les montants en jeu sont bien plus élevés que ce que l’on admet.

Continue reading “Un héritage pour tous, financé par l’héritage”

L’Europe n’est pas en panne. Elle ne fait pas encore envie.

English · Français · Deutsch

Traduction automatique. La version anglaise fait référence.

Quand j’avais quinze ans, je publiais un petit journal. Il s’appelait Europe Journal, j’essayais de le sortir tous les mois, et il était écrit en deux ou trois langues. Je ne crois pas qu’il ait jamais eu plus de quelques dizaines de lecteurs. Je croyais déjà, à cet âge-là, ce que je crois plus fermement encore aujourd’hui : que les pays de ce continent n’ont aucun avenir chacun de son côté. Pas un lent déclin, mais la fin de leur existence comme acteurs indépendants, ou au mieux une vassalité confortable envers la puissance qui sera de bonne humeur cette décennie-là.

Plus de trente-cinq ans après, le peu de chemin parcouru me frustre et me met en colère. Cette série est ma tentative de dire ce qui devrait changer.

Continue reading “L’Europe n’est pas en panne. Elle ne fait pas encore envie.”

“GroovyGroovaBox”: my new, innovative, drumbox – running in a web browser

I’ve played music for decades, as a guitarist first, and I’ve been increasingly interested in rythm over time.

I remember a night we have been dancing at a Mandrakesoft event, in a club. There was this guy who had his very own way of dancing, breaking the rythm, making pauses with his body. I also remember at this time the song “Independent Women”, with some breaks in the rythm. It sounded super original. It was in 2000 or 2001 I think.

Since this this moment I have always expected that music would turn into something more innovative, especially regarding rythm.

Drumboxes have gotten more and more sophisticated with impressive alterations capabilities for sound, but not that much for the rythm. As a drummer you can create something different and new, and some do, at least to a certain extent.

But in the end nothing very radical happened and listening to newly released music always makes me extremely bored: nothing happens but these either old or silly patterns. 0 creativity, 0 surprise.

So, earlier this year, I aked Claude if there was any innovation in this field….

Continue reading ““GroovyGroovaBox”: my new, innovative, drumbox – running in a web browser”

Europe isn’t broken. Few want it, yet.

English · Français · Deutsch

When I was fifteen, I ran a small magazine. It was called Europe Journal, I tried to get an issue out every month, and it was written in two or three languages. I don’t think more than a few dozen people ever read it. I already believed, at that age, something I believe more firmly today: that the countries of this continent have no future on their own. Not a slow decline, but the end of their existence as independent actors, or at best a comfortable vassalage to whichever bigger power is in a good mood that decade.

More than thirty-five years later, I am frustrated, and I am angry, at how little has moved. This series is my attempt to say what should.

Continue reading “Europe isn’t broken. Few want it, yet.”

An inheritance for everyone, paid for by inheritance

English · Français · Deutsch

I was 25 when I released the first Mandrake Linux, in the summer of 1998. The idea itself cost nothing: a PC, an internet connection, a few months of nights. Everything that came after cost money we did not have, and we spent the following two years finding it. I was lucky. I know people of my generation who had better ideas than mine and never got to try them, for the most banal reason in the world: nobody around them had anything to lend.

This post is a radical answer to that. I am not pretending it could pass tomorrow. I am putting it on the table because the debate it opens is one Europe has avoided for a century, and because the numbers behind it are far bigger than anyone admits.

Continue reading “An inheritance for everyone, paid for by inheritance”

One month with my new Murena GS6 Pro: finally a Murena phone that checks all my boxes

Recently I decided to change my Murena smartphone because its battery was really dying: I had to recharge several times a day and it was becoming problematic when travelling for business. Unfortunately this model didn’t have a replaceable battery, so it was difficult to change.

Also I thought it was the good time because we had just released the Murena GS6 and GS6 Pro, which seemed to check all the things I wanted to have in a phone. A good opportunity to test it “in real life”, not as a CEO looking at a spec sheet, but as a daily user.

As a side note, it’s also been a great way to test our new /e/OS Backup feature with a real load of data: all my installed apps, settings, accounts… I switched phones in less than an hour, and everything was there. This feature alone changes the experience of replacing a phone.

So it’s now been close to one month that I’ve been using the GS6 Pro as my main device, and I must say that I’m very happy with this phone…

Continue reading “One month with my new Murena GS6 Pro: finally a Murena phone that checks all my boxes”