GERMINATE(1)
๐ GERMINATE(1) โ LOCAL manual page, and yes it's giving UNTITLED() energy, we move ๐
okay so bestie, welcome to germinate, the little program that could. This is germinate from section 1 of the local manual โ the page itself is literally titled UNTITLED() up top because sometimes manpages just wake up and choose chaos, but we know her name and her name is germinate. ๐
โจ NAME โจ
germinate โ expand dependencies in a list of seed packages ๐ฆ
โจ SYNOPSIS โจ
germinate [-v] [-S source] [-s dist] [-m mirror] [-d dist,...] [-a arch]
[-c component,...] [--vcs={auto|bzr|git}] [--no-rdepends]
[--no-installer]
look at that little command line. she's compact, she's precise, she's slay. ๐
โจ DESCRIPTION โจ
so like, germinate is a program that helps with the maintenance of large software distributions. That's the whole vibe. You hand her a list of seed packages plus a mirror of the distribution, and she hands you back outputs where the seed packages and their dependencies and their build-dependencies are expanded out in full. no cap, fully expanded. ๐ฅ
๐ฑ Seeds ๐ฑ
The contents of the Ubuntu distribution (and others, bestie, she's not exclusive) are managed by means of seeds. At their simplest, these are literally just lists of packages that are considered important to have in the main component of the distribution โ and the whole point is that you don't have to explicitly list all their dependencies and build-dependencies. iconic lazy-girl behaviour honestly. ๐
Seed lists are typically divided up by category: a base or minimal seed might list the core set of packages required to make the system run at all, while a desktop seed might list the set of packages installed as part of a default desktop installation. germinate takes these seeds, adds their dependency trees, and produces an output for each seed containing a dependency-expanded list of package names. Those outputs can be handed on to archive maintenance tools or CD-building tools. ๐ซถ
Some seeds may inherit from other seeds: they rely on those seeds being installed. For example, a desktop seed will typically inherit from a minimal seed. germinate understands these inheritance relationships. If a package in the desktop seed depends on โfooโ, but โfooโ is already part of the minimal seed or dependency list, then โfooโ will not be added to the desktop output. she's not gonna duplicate. she's not gonna embarrass you like that. ๐
Seeds are stored in text files downloaded from a given URL. Lines not beginning with โ * โ (wiki-style list markup) are ignored. that's the rule. markdown-heading-ass lines, get out. ๐
Seed entries may simply consist of a package name, or may include any of the following special syntax:
%โ Seed entries beginning with โ%โ expand to all binaries from the given source package. ๐...|...โ Seed entries may list alternatives to the seeded package to allow metapackages to list them, and users to use those alternatives without having to remove the metapackages. options! variety! main character energy.[...]โ Seed entries may be followed with โ [arch1 arch2 ...]โ to indicate that they should only be used on the given architectures, or with โ [!arch1 !arch2 ...]โ to indicate that they should not be used on the given architectures. architecture gatekeeping, but make it documented. โจ(...)โ Seed entries in parentheses indicate that the seed should be treated as a recommendation of metapackages generated from this seed, rather than as a dependency. soft launch, not a hard dep. ๐!โ Seed entries beginning with โ!โ cause the given package to be blocklisted from the given seed and any seeds from which it inherits; this may be followed by โ%โ as above to blocklist all binaries from the given source package. Note that this may result in uninstallable packages whose dependencies have been blocklisted, so use this feature sparingly. The purpose of a blocklist is to make it obvious when a package that is not supposed to be installed ends up ingerminate's output, so that package relationships can be fixed to stop that happening. It is not intended for the purpose of working around buggy package relationships, and attempts to do so will not work becauseapthas no way to know about blocklist entries in seeds. ๐จ bestie please read that part again. the blocklist is a snitch, not a fixer.
ngl the ! entry is the one that will humble you if you treat it like a hack. it's a loud alarm, it's a vibe check for your package relationships, it is not a workaround. periodt.
snap:nameโ Seed entries beginning with โsnap:โ are snap packages. These are different from deb packages in that they do not have (build-)dependencies, cannot be recommended, and do not end up in any resulting metapackages. (If you try to recommend a snap package, it will be ignored completely.) Snaps specified in seeds will be output in a.snapsfile named after the corresponding seed, as software processing the output ofgerminatewill typically need to treat snaps differently from debs.germinatewill not check remotely to see if a given snap is available, therefore seeds are expected to explicitly list all architectures a snap is to be seeded on. โsnap:โ entries can also be suffixed with"/classic"to indicate that the snaps need to be installed with classic confinement on end-user systems. ๐งkey: valueโ Some seeds also contain headers at the top of the file, in โkey: valueโ format. For the most part, these are not parsed bygerminateitself. The Ubuntutaskselpackage uses keys beginning with โTask-โ to define fields of similar names in its.descfiles.germinate-update-metapackage(1)uses some of these headers to reduce the need for fragile configuration; see its documentation for further details. ๐
A STRUCTURE file alongside the seeds lists their inheritance relationships. It may also include lines beginning with โincludeโ, causing other collections of seeds to be included as if they were part of the collection currently being germinated, or lines beginning with โfeatureโ, which set flags for the processing of seeds. Features may also be set on a per-seed basis using lines beginning with โ * Feature:โ in the seed file. ๐ฆ
The following flags are currently defined:
follow-build-dependsโ FollowBuild-Dependsfields. This flag is only recognised in individual seed files, not inSTRUCTURE. โจfollow-build-depends-allโ FollowBuild-Dependsfields forArchitecture: allpackages. This has no effect ifno-follow-build-dependsis set. ๐follow-recommendsโ TreatRecommendsfields as if they wereDepends. ๐no-follow-build-dependsโ Do not followBuild-Dependsfields. ๐no-follow-build-depends-allโ Do not followBuild-Dependsfields forArchitecture: allpackages, even thoughBuild-Dependsare followed for other packages. ๐no-follow-recommendsโ Do not treatRecommendsfields as if they wereDepends. This flag is only recognised in individual seed files, not inSTRUCTURE. ๐
๐จ Build-dependencies and โsupportedโ ๐จ
There is typically no need for a default desktop installation to contain all the compilers and development libraries needed to build itself from source; if nothing else, it would consume much more space. big agree, she does not need the entire toolchain in her handbag. Nevertheless, it is normally a requirement for the maintainers of a distribution to support all the packages necessary to build that distribution. that's the actual job, bestie.
germinate therefore does not add all the packages that result from following build-dependencies of seed packages and of their dependencies (the โbuild-dependency treeโ) to every output, unless they are also in the seed or in the dependency list. Instead, it adds them to the output for the last seed in the STRUCTURE file, conventionally called supported. ๐
Like any other seed, the supported seed may contain its own list of packages. It is common to provide support for many software packages which are not in the default installation, such as debugging libraries, optimised kernels, alternative language support, and the like. ๐
๐ฆ Outputs ๐ฆ
The output files are named after the seed to which they correspond. An additional output file is needed for supported, namely โsupported+build-dependsโ, which contains the supported list and the build-depends lists of the other seeds all joined together. An โallโ output is produced to represent the entire archive. ๐
Some other files are produced for occasional use by experts. See the README file for full details on these. iykyk. ๐ซถ
okay and like, this page keeps going โ we're only on part 1 of 2, so don't go anywhere, there's more ๐
โจ OPTIONS โจ
okay bestie, this is the part where the page gets long, but every single one of these matters so we're doing all of them, no skipping ๐
-v,--verboseโ be more verbose when processing seeds. basically: more words, more insight, more you-know-what's-happening โจ-S,--seed-source source,...โ fetch seeds from the sources you name โจ the default ishttps://ubuntu-archive-team.ubuntu.com/seeds/, orhttp://bazaar.launchpad.net/~ubuntu-core-dev/ubuntu-seeds/if the--vcs=bzroption is used, orgit://git.launchpad.net/~ubuntu-core-dev/ubuntu-seeds/+git/if the--vcs=gitoption is used. You may usefile://URLs here to fetch seeds from the local file system; for example, if your seeds are stored in/home/username/seeds/debian.unstable, then you would use the options-S file:///home/username/seeds/ -s debian.unstable. ๐-s,--seed-dist distโ fetch seeds for distribution dist. The default isubuntu.resolute.
When fetching seeds from git, the part after the rightmost โ.โ character, if any, is treated as the branch name to check out; this rather strange style is for backward compatibility. (iykyk โ it's giving "we do a little trolling" but the troll is legacy ๐ซ )
-m,--mirror mirrorโ get package lists from mirror. The default ishttp://archive.ubuntu.com/ubuntu/. May be supplied multiple times; the newest version of each package across all archives will win. (main character energy โ newest wins, periodt ๐)--source-mirror mirrorโ get source package lists from mirror. The default is to use package lists mirrors. May be supplied multiple times; the newest version of each source package across all archives will win. ๐-d,--dist dist,...โ operate on the specified distributions. The default isresolute. Listing multiple distributions may be useful, for example, when examining both a released distribution and its security updates. ๐ธ-a,--arch archโ operate on architecture arch. The default isamd64. ๐ฆ-c,--components component,...โ operate on the specified components. The default ismain.-C,--apt-config confโ use apt withAPT_CONFIGset to the supplied value to find the package and source indices to operate on. Overrides any values passed for--mirror,--source-mirror,--dist, -or--components. (yes, it really says "-or" ๐ญ)
โ ๏ธ heads up: that-Cone is the boss option. it overrides all four of the others, so if you pass both,-Cis eating, and your other flags are just standing there ๐
--vcs={auto|bzr|git}โ check out seeds from a version control system rather than fetching them directly from a URL. Requiresbzrorgit, as appropriate, to be installed. Forbzr, use the branch found at seed-source/seed-dist; forgit, remove the part after the rightmost โ.โ character of seed-dist and use it as the branch name to check out from seed-source/remainder-of-seed-dist. Forauto, guess the version control system to use from seed-source (trying both in ambiguous cases) and then proceed as above. ๐ฎ--bzrโ check out seeds from the bzr branch found at seed-source/seed-dist rather than fetching them directly from a URL. Requiresbzrto be installed. This option is deprecated and is retained for backward compatibility; use--vcs=bzrinstead.
๐ deprecated era! it still works, it's just very 2005. use --vcs=bzr like the girlies do.
--no-rdependsโ disable reverse-dependency calculations. These calculations cause a large number of small files to be written out in therdepends/directory, and may take some time. (skip it if you're in a hurry bestie โฉ)--no-installerโ do not consider debian-installer udeb packages. While generally not the desired outcome, sometimes you might wish to omit consideration of installer packages when processing your seeds, perhaps if sending the output directly to the package manager on an already-installed system. ๐--seed-packages parent/pkg,...โ treat each pkg as a seed by itself, inheriting from parent (i.e. assuming that all packages in the parent seed are already installed while calculating the additional dependencies of pkg). This allows the use ofgerminateto calculate the dependencies of individual extra packages. For example,--seed-packages desktop/epiphany-browserwill create anepiphany-browseroutput file listing the additional packages that need to be installed over and above thedesktopseed in order to installepiphany-browser. ๐--always-follow-build-dependsโ always followBuild-Dependsin all seeds, regardless of seed feature flags. โญ
๐ BUGS ๐
ngl, this section is the "confession" part of the page and we respect the honesty ๐
- The wiki-style markup in seeds was inherited from an early implementation, and is a wart. (their words! "a wart"! iconic self-drag ๐ )
germinatecan sometimes be confused by complicated situations involving the order in which it encounters dependencies on virtual packages. Explicit entries in seeds may be required to work around this. ๐ซ- Handling of installer packages (udebs) is complicated, poorly documented, and doesn't always work quite right: in particular, packages aren't demoted to the
supportedseed when they should be. ๐ญ
๐ AUTHORS ๐
The legends behind it all:
- Scott James Remnant
<scott@canonical.com> - Colin Watson
<cjwatson@canonical.com>
germinate is copyright ยฉ 2004, 2005, 2006, 2007, 2008 Canonical Ltd. See the GNU General Public License version 2 or later for copying conditions. A copy of the GNU General Public License is available in /usr/share/common-licenses/GPL. ๐
and that's the whole thing bestie, you're officially germinate-literate ๐งโจ this gem is from the Ubuntu corner of the world, dated May 27, 2005, and it lives on the page as GERMINATE(1) โ go forth and slay those seeds ๐๐ธ
๐ฆ where this page comes from
- ubuntu stonking: germinate 2.50.2+willsync2 ยท GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms