Gentoo Prefix Bootstrap Process for FreeBSD
1.
Bootstrapping on FreeBSD
Introduction
An off-the-shelf FreeBSD system is bare. Very bare.
Whoever thought that bootstrapping on Solaris was hard,
FreeBSD makes it even harder. The lack of tools like bash
and perl requires some pre-bootstrapping prior to the actual
bootstrapping process. Alternatively you can install a Bash
through the ports system. If you bootstrap on FreeBSD, make
sure the development tools are installed, which include
system headers and a compiler. This bootstrap guide was
tested on a FreeBSD 8.2 x86_64 system. Other architectures
should not differ too much. Feel free to try it out on
other configurations and post to the gentoo-alt
mailing list for additional help.
Bootstrapping
As prerequisite, you need a GCC compiler, the GNU binutils
linker and system headers, such that source code can be
compiled into working executables. Sufficient versions are
installed by installing the developer tools.
The first step is to choose a path to install into. We refer
to this path as "prefix path", stored in the variable
EPREFIX. A suggestion for your prefix path is
$HOME/gentoo.
Whatever you chose, make sure you set it in your environment:
Code Listing 1.1: Export EPREFIX variable |
$ export EPREFIX="$HOME/gentoo"
|
Note:
tcsh users can use setenv EPREFIX "$HOME/gentoo"
instead.
|
Next, add the following paths in your soon to be prefix to
your PATH environment.
$EPREFIX/bin,
$EPREFIX/usr/bin,
$EPREFIX/tmp/bin and
$EPREFIX/tmp/usr/bin.
Adding these paths makes sure that they will be available
later on in the process.
Code Listing 1.2: Add prefix paths to your PATH |
$ export PATH="$EPREFIX/usr/bin:$EPREFIX/bin:$EPREFIX/tmp/usr/bin:$EPREFIX/tmp/bin:$PATH"
|
Now the path is set, start with downloading the bootstrap
script from
http://overlays.gentoo.org/proj/alt/browser/trunk/prefix-overlay/scripts/bootstrap-bash.sh?format=txt
and
http://overlays.gentoo.org/proj/alt/browser/trunk/prefix-overlay/scripts/bootstrap-prefix.sh?format=txt.
From the directory where the bootstrap scripts were stored execute
the following commands:
Code Listing 1.3: Use the bootstrap script |
$ chmod 755 bootstrap-bash.sh bootstrap-prefix.sh
$ mkdir $EPREFIX/tmp
$ ./bootstrap-bash.sh $EPREFIX/tmp
$ ./bootstrap-prefix.sh $EPREFIX tree
$ ./bootstrap-prefix.sh $EPREFIX/tmp make
$ ./bootstrap-prefix.sh $EPREFIX/tmp wget
$ ./bootstrap-prefix.sh $EPREFIX/tmp sed
$ ./bootstrap-prefix.sh $EPREFIX/tmp python
$ ./bootstrap-prefix.sh $EPREFIX/tmp coreutils8
$ ./bootstrap-prefix.sh $EPREFIX/tmp findutils3
$ ./bootstrap-prefix.sh $EPREFIX/tmp tar22
$ ./bootstrap-prefix.sh $EPREFIX/tmp patch9
$ ./bootstrap-prefix.sh $EPREFIX/tmp gawk
$ ./bootstrap-prefix.sh $EPREFIX portage
|
Note:
Please note that python, sed, wget
etc. are installed in $EPREFIX/tmp!
patch9 and the like are not typing errors but build
different versions that will compile out of the box on
FreeBSD.
|
The script will setup the $EPREFIX
directory, download a portage tree snapshot, unpack it and
download and install portage. Afterwards it will try to setup
some sane defaults. We continue with a little hack necessary
for a successful bootstrap.
Let your shell take notice of all just installed programs.
Code Listing 1.4: rehash in sh |
$ hash -r
|
Note:
tcsh users can use the rehash command.
|
We continue adding some necessary tools which will deal with
many errors and warnings you might see during emerging.
Code Listing 1.5: emerge sed |
$ emerge --oneshot sed
|
Next, we emerge the bash shell Portage heavily relies
on. The same holds for wget, the download manager.
Since its dependencies cannot be compiled at this stage,
we ignore those for the moment.
Code Listing 1.6: emerge bash and wget |
$ emerge --oneshot --nodeps bash (avoid deps that ship scripts with shebang /bin/sh)
$ emerge --oneshot --nodeps xz-utils
$ emerge --oneshot --nodeps "<wget-1.13.4-r1" (until we fix #393277)
|
Note:
It is safe to ignore the "1 config files in XXX need updating"
message that appears till the end of the bootstrap process.
|
Now, we will emerge a compiler which will use the GNU
linker. This is a requirement for many packages that follow
in the bootstrap process, in particular Perl. The packages
to emerge include the baselayout package. Some, if
not many, scripts and tools within a Gentoo system assume
the availability of the baselayout package for all
communication using the Gentoo colour scheme.
Code Listing 1.7: emerge linker and compiler |
$ emerge --oneshot --nodeps baselayout-prefix
$ emerge --oneshot --nodeps m4
$ emerge --oneshot --nodeps flex
$ emerge --oneshot --nodeps bison
$ emerge --oneshot --nodeps binutils-config
$ emerge --oneshot --nodeps binutils
$ emerge --oneshot --nodeps gcc-config
$ emerge --oneshot --nodeps "=gcc-4.2*"
|
We continue getting more tools in our Prefix. We no longer
ignore dependencies all the time, so a lot of packages will be
emerged at this stage. Slowly our Prefix gets more robust as
we progress here.
Code Listing 1.8: emerge several tools |
$ emerge --oneshot perl
$ emerge --oneshot coreutils
$ emerge --oneshot findutils
$ emerge --oneshot tar
$ emerge --oneshot grep
$ emerge --oneshot patch
$ emerge --oneshot gawk
$ emerge --oneshot make
$ emerge --oneshot --nodeps file
$ emerge --oneshot --nodeps eselect
$ emerge --oneshot pax-utils
|
Now we have a good bunch of programs that Portage needs, we
can replace the bootstrapped Portage by a properly installed
one, using Portage itself. Also here a few dependencies are
first emerged, such as the language Portage is written in:
python. We need to temporarily tell Portage that the
bootstrapped Portage can be overwritten.
Code Listing 1.9: emerge portage |
$ env FEATURES="-collision-protect" emerge --oneshot portage
|
Now we have emerged everything we bootstrapped before, we
remove the temporary directory and its use as it is no longer
necessary.
Code Listing 1.10: Remove tmp directory |
$ rm -Rf $EPREFIX/tmp/*
$ hash -r
|
Before we do any further merges, we are going to update our
tree. Updating the tree is done using:
Code Listing 1.11: Updating the tree |
$ emerge --sync
|
Note:
If you're behind a firewall that blocks rsync traffic, you can
try to run ${EPREFIX}/usr/sbin/emerge-webrsync instead.
|
Next, we let Portage emerge all packages that complete a
system install that we eventually need to finalise this Prefix
installation.
Code Listing 1.12: emerge system |
$ USE=-git emerge -u system
|
Now is a good time to set the preferences for our soon to be
Prefix. This includes customisations such as general
USE-flags, CFLAGS and MAKEOPTS in
$EPREFIX/etc/make.conf. Be conservative with
CFLAGS! Note that the code below is an example, and is
meant for inspiration only.
Code Listing 1.13: Customising the Prefix installation - example |
$ echo 'USE="unicode nls"' >> $EPREFIX/etc/make.conf
$ echo 'CFLAGS="-O2 -pipe"' >> $EPREFIX/etc/make.conf
$ echo 'CXXFLAGS="${CFLAGS}"' >> $EPREFIX/etc/make.conf
|
Since we have everything in place for a self-catered rebuild,
we can start the final stage to install the Prefix system.
This final stage recompiles everything in the system, but now
all packages can be compiled with tools from the Prefix,
instead of those from the host system.
Code Listing 1.14: Doing the final system installation |
$ emerge -e system
|
After system has emerged successfully, your Prefix will
be set up properly, and you can emerge the whichever tools you
choose from the Prefix tree.
Using the Prefix
To use your bootstrapped prefix environment, you best start a
shell from the prefix, such that your path and other
environment variables are set correctly. To facilitate in
this, a small helper script can be created by the bootstrap
script.
Code Listing 1.15: Creating a start-script |
$ cd $EPREFIX/usr/portage/scripts
$ ./bootstrap-prefix.sh $EPREFIX startscript
|
After running this, a script startprefix will be
present in $EPREFIX. You can freely move the script to
e.g. your homedir for convenience. Running the script will
drop you into a prefix shell, where for example emerge
is directly at your disposal. Enjoy your prefix!
The contents of this document, unless otherwise expressly stated, are licensed under the CC-BY-SA-2.5 license. The Gentoo Name and Logo Usage Guidelines apply.
|