mastodon.world is one of the many independent Mastodon servers you can use to participate in the fediverse.
Generic Mastodon server for anyone to use.

Server stats:

9.2K
active users

#pycargoebuild

0 posts0 participants0 posts today

Wolna sobota, nie?

No cóż, poza standardową robotą (paczki Pythona, stabilizacje, nowy snapshot LLVM, usuwanie nieaktywnych devów), większość dnia spędziłem nad #PyCargoEbuild.

Pierwszą część spędziłem debugując błędne twierdzenia o rzekomej niewydajności tarfile. Wyniknął z tego natomiast taki pozytyw, że okazało się, że `tarfile.open(..., "w|xz")` cichaczem ignoruje poziom kompresji — więc wysłałem łatkę to poprawiającą.

github.com/python/cpython/pull

Potem dokończyłem i włączyłem łatkę, dzięki której pycargoebuild umie automatycznie dodać flagi USE w oparciu o `features` w `Cargo.toml`. Nie wiem, jak bardzo to użyteczne, ale jak komuś się może przydać, to jest (opcja `--features`).

Dodałem też wsparcie dla prehistorycznej wersji formatu `Cargo.lock`, która nie zawiera w sobie żadnego numeru wersji, i ma obrzydliwy sposób przechowywania sum kontrolnych.

Miałem też poeksperymentować z deduplikacją plików pomiędzy implementacjami Pythona, ale zabrakło czasu.

bugs.gentoo.org/954762

Free Saturday, right?

So aside from the usual pending work (Python bumps, stabilizations, LLVM bumps, retirements), I've spent most of the day working on #PyCargoEbuild.

The first part was spent on debugging mistaken claims about supposed tarfile inefficiency. One positive thing that came out of that is that I've discovered that `tarfile.open(..., "w|xz")` silently ignores compression level — so I've made a PR to fix that.

github.com/python/cpython/pull

Then I've finished and merged the pull request adding support for automatically adding USE flags based on features in Cargo.toml. Not sure how useful it will turn out, but it's there (`--features` option) for anyone who needs it.

I've also added support for some prehistoric `Cargo.lock` format that doesn't use `version` key, but features an awful method of storing checksums in metadata.

I was supposed to experiment with deduplicating files across Python implementations but no time for that.

bugs.gentoo.org/954762

Wsparcie Rusta / Cargo w #Gentoo otrzymało wiele optymalizacji.

Brzmi to jak coś dobrego, prawda? To nie to — Cargo jest tak *beznadziejne*, że musimy ciągle dodawać jakieś obejścia, żeby dało się go w ogóle używać.

Na początek, od razu zrezygnowaliśmy z tworzenia odrębnych paczek dla zależności. Wszak mówimy o tworzeniu tysięcy paczek, których jedyną funkcją byłoby instalowanie źródeł, które następnie byłyby statycznie włączane do programów. Kupa roboty, kupa zmarnowanej przestrzeni, i żadnej korzyści. Tak więc każda paczka Rusta zawiera w sobie długą listę swoich zależności, i gigantyczny plik Manifest z kolejną kopią tych samych sum kontrolnych.

Uzależnieni jesteśmy też od mirrorowania zależności na serwerach lustrzanych Gentoo. Dlaczego? Bo crates.io jest beznadziejnie powolne. Portage normalnie pobiera pliki jeden po drugim, więc pobranie setek zależności trwa wieczność. Nawet w #PyCargoEbuild dodałem wsparcie pobierania zależności równolegle przez aria2, żeby to przyspieszyć.

Niedawno dodałem wypakowywanie zależności równolegle, bo nawet to zajmowało mnóstwo czasu. Ironią jest, że najdłużej wypakowują się pliki odpowiedzialne za wsparcie Windows.

PyCargoEbuild ma też funkcję przepakowania wszystkich zależności w jedno archiwum. Dlaczego? Bo niektóre programy mają ich tak wiele, że wypisanie wszystkich czyni ebuilda olbrzymim, a powiązany z nim Manifest kolosalnym. Oznaczałoby to, że *każdy* użytkownik Gentoo obarczony byłby rosnącym repozytorium, nawet gdyby nigdy nie miałby użyć tej paczki. Zamiast pobierać zależności pojedynczo, bierzemy gotowe archiwum, które przy okazji jest mniejsze niż suma wszystkich zależności, pobiera i wypakowuje się dużo szybciej (choć nie porównywałem tego z wypakowywaniem równoległym).

W ogóle, czy nie powinienem zaznaczyć, że Cargo to jeden z niewielu ekosystemów, których nie da się wykorzystać w dystrybucji, nie tworząc wcześniej dedykowanego oprogramowania, które będzie tworzyć za nas ebuildy i je później aktualizować?

Ale nie, #RustLang just super.

#RustLang / Cargo support in #Gentoo has received a lot of optimizations over time.

Does that sound like a good thing? I'm afraid it isn't: it's just saying how *bad* the ecosystem is, that we have to keep adding hacks to make it even remotely usable.

For a start, we immediately gave up on packaging the dependencies separately. After all, we're talking about a humongous effort, creating thousands of Gentoo packages whose only purpose would be delivering sources that would be only linked statically into executables. Lot of effort, lot of space waste, no gain. Instead, every Rust package carries a huge list of crates it needs, and a humongous Manifest listing yet another set of copies of checksums for these crates.

We are strongly relying on mirroring crates on Gentoo mirror infrastructure. Why? Because crates.io is uselessly slow. On top of that, Portage normally does fetching in series, so grabbing hundreds of crates takes half an eternity. In fact, I've even made #PyCargoEbuild use aria2 to fetch new crates from crates.io in parallel to work around this.

I have recently added a hack to unpack crates in parallel, because even unpacking all of them is awfully slow. Ironically, the crates that seem to take most of the time to unpack are these responsible for Windows support.

PyCargoEbuild also has a function to repack all dependent crates into a single tarball that we redistribute. Why? Because some packages have so many dependencies that listing them all makes ebuilds and their Manifests humongous. For every package like that, *all* Gentoo users suffer a significant growth in repository size, even if they are never going to use the package in question. So instead of listing and fetching crates, we fetch a ready-made crate tarball. Which is also much smaller than all crates combined, and therefore faster to fetch and unpack (though I haven't compared this to parallel unpacking).

Oh, perhaps I should have mentioned first that Cargo is one of the few ecosystems that simply cannot be packaged without creating dedicated tools to prepare and update the ebuilds.

But yeah, Rust is awesome.

I've just pushed #PyCargoEBuild 0.12 to #Gentoo. The new version introduces a `--crate-tarball` feature to repack all crates into a single tarball that can be redistributed along with the ebuild.

Why would anyone want that? Let's look at the numbers.

Fractal with regular crates:

15 KiB ebuild
180 KiB Manifest
1 min 10 s to download all crates (and that's via Gentoo mirrors that are *much faster* than crates.io)
597 distfiles
76 MiB distdir
15 s to unpack

Fractal with crate tarball:

4 KiB ebuild
1.5 KiB Manifest
2 s to download all distfiles
4 distfiles (crate tarball doesn't include GIT_CRATES)
45 MiB distdir
6 s to unpack

pypi.org/project/pycargoebuild

PyPIpycargoebuildA generator for Rust/Cargo ebuilds written in Python

Właśnie opublikowałem #PyCargoEBuild 0.12 dla #Gentoo. Nowa wersja wprowadza opcję `--crate-tarball`, która przepakowuje wszystkie zależności w formacie crate w jedno archiwum, które można wykorzystać z ebuildem.

Po co to? Spójrzmy na liczby.

Fractal z normalnymi plikami crate:

15 KiB ebuild
180 KiB Manifest
1 min 10 s ściągania (przez serwery lustrzane Gentoo, które są *znacznie szybsze* niż crates.io)
597 pobranych plików
76 MiB pobranych plików
15 s wypakowywania

Fractal z przepakowanym archiwum:

4 KiB ebuild
1.5 KiB Manifest
2 s pobierania
4 pobranych plików (nie przepakowujemy GIT_CRATES)
45 MiB pobranych plików
6 s wypakowywania

pypi.org/project/pycargoebuild

PyPIpycargoebuildA generator for Rust/Cargo ebuilds written in Python

Wypuściłem jeszcze jedno wydanie #pycargoebuild, tym samym zamykając listę planowanych nowych funkcji.

Główny dodatek to wsparcie pliku konfiguracyjnego, dzięki któremu przede wszystkim możemy nadpisać licencje dla poszczególnych crate'ów i dopisać coś lokalnie do mapy licencji. Naprawiłem też brakujące upraszczanie LICENSE dla paczki.

pypi.org/project/pycargoebuild

PyPIpycargoebuildA generator for Rust/Cargo ebuilds written in Python

Wypuściłem #pycargoebuild w wersji 0.9 i dodałem do #Gentoo.

Nowością w tym wydaniu jest wsparcie dla dziedziczenia metadanych paczek z przestrzeni roboczej. Zwiększyłem też tolerancję dla brakujących lub niestandardowych licencji.

Podziękowania w kierunku CyberTailor za pomoc przy implementacji metadanych!

pypi.org/project/pycargoebuild

PyPIpycargoebuildA generator for Rust/Cargo ebuilds written in Python

Optymalizacje #cargo.eclass są już w #Gentoo, jak również wydanie #pycargoebuild 0.7, które z nich korzysta.

Zważ jednak, że w trybie `-i` lista CRATES zostanie zapisana przy użyciu separatora `@`, ale `$(cargo_crate_uris)` nie zostanie zastąpione przez `${CARGO_CRATE_URIS}` — trzeba to poprawić ręcznie.

pypi.org/project/pycargoebuild

PyPIpycargoebuildA generator for Rust/Cargo ebuilds written in Python