Gentoo Logo

Gentoo Prefix Bootstrap Process for Mac OS X

1.  Bootstrapping on OS X

Introduction

Apple Mac OS X was initially supported in the main Gentoo portage tree with the ppc-macos keyword. The approach taken then, however, resulted in too many problems, which was the drive behind creating Prefixed Portage.

Bootstrapping on OS X is relatively simple, as the system itself provides most of the tools get up to speed quickly. Gentoo Prefix is tested and supported on Mac OS X Tiger, Leopard, Snow Leopard, and Lion on PPC (as applicable) and x86 architectures.

Bootstrapping

As prerequisite, you have to have the latest Xcode installed. Xcode provides the compiler collection. Bootstrapping is not (yet) supported without it. If you don't have the latest Xcode installed and run into trouble, try updating first.

The first step is to choose a path to install into. We refer to this path as "Prefix path", stored in the variable EPREFIX. Some suggestions for your Prefix path are $HOME/Gentoo or $HOME/Library/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"
        

If you want to end up with a 64-bits native Prefix installation, then set your CHOST variable accordingly to x86_64-apple-darwin9 for Leopard, or x86_64-apple-darwin10 for Snow Leopard. If you want to end up with a 32-bits native Prefix installation on Lion, set your CHOST to i686-apple-darwin11. You only need to do this if you want a 64-bits (or 32-bits) native Prefix!

Now the path is set, start with downloading the bootstrap script from http://overlays.gentoo.org/proj/alt/browser/trunk/prefix-overlay/scripts/bootstrap-prefix.sh?format=txt. From the directory where the bootstrap script was stored execute the following commands:

Code Listing 1.3: Use the bootstrap script

$ chmod 755 bootstrap-prefix.sh
$ ./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 coreutils6
$ ./bootstrap-prefix.sh $EPREFIX/tmp findutils
$ ./bootstrap-prefix.sh $EPREFIX/tmp tar15
$ ./bootstrap-prefix.sh $EPREFIX/tmp patch9
$ ./bootstrap-prefix.sh $EPREFIX/tmp grep
$ ./bootstrap-prefix.sh $EPREFIX/tmp gawk
$ ./bootstrap-prefix.sh $EPREFIX/tmp bash
$ ./bootstrap-prefix.sh $EPREFIX portage
        

Note: Please note that wget, sed, python, etc. are installed in $EPREFIX/tmp!

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. Because we installed some new applications, we will instruct bash to reconsider all paths we have:

Code Listing 1.4: rehash in bash

$ 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. Pax-utils allow Portage to examine the binaries it installs for correctness.

Code Listing 1.6: emerge bash, pax-utils and wget

$ emerge --oneshot --nodeps bash (avoid deps which install scripts with shebang /bin/sh)
$ emerge --oneshot pax-utils
$ 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 and linker, setup to make use of the Gentoo Prefix environment. 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 prerequisites for compiler and linker

$ emerge --oneshot --nodeps sys-apps/baselayout-prefix
$ emerge --oneshot --nodeps sys-devel/m4
$ emerge --oneshot --nodeps sys-devel/flex
$ emerge --oneshot --nodeps sys-devel/bison
$ emerge --oneshot --nodeps sys-devel/binutils-config
        

Due to different versions of Xcode, the following step requires some close watch to the output of gcc --version. If the first line reports a version 4.2.1, the latest binutils-apple needs to be emerged, otherwise, version should report 4.0.1 and =binutils-apple-3.2 must be emerged.

Code Listing 1.8: emerge linker

$ emerge --oneshot --nodeps "=sys-devel/binutils-apple-3.2" (for gcc 4.0.1)
$ emerge --oneshot --nodeps sys-devel/binutils-apple    (for gcc 4.2.1)
        

Now continue with the compiler.

Code Listing 1.9: emerge compiler

$ emerge --oneshot --nodeps sys-devel/gcc-config
$ emerge --oneshot --nodeps sys-devel/gcc-apple
        

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.10: emerge several tools

$ emerge --oneshot sys-apps/coreutils
$ emerge --oneshot sys-apps/findutils
$ emerge --oneshot app-arch/tar
$ emerge --oneshot sys-apps/grep
$ emerge --oneshot sys-devel/patch
$ emerge --oneshot sys-apps/gawk
$ emerge --oneshot sys-devel/make
$ emerge --oneshot --nodeps sys-apps/file
$ emerge --oneshot --nodeps app-admin/eselect
        

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.11: emerge portage

$ env FEATURES="-collision-protect" emerge --oneshot sys-apps/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.12: 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.13: Updating the tree

$ emerge --sync
        

Next, we let Portage emerge all packages that complete a system install that we eventually need to finalise this Prefix installation.

Code Listing 1.14: emerge system

$ env 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.15: Customising the Prefix installation - example

$ echo 'USE="unicode nls"' >> $EPREFIX/etc/make.conf
$ echo 'CFLAGS="-O2 -pipe <my-cpu-flags>"' >> $EPREFIX/etc/make.conf
$ echo 'CXXFLAGS="${CFLAGS}"' >> $EPREFIX/etc/make.conf
        

Note: You have to replace <my-cpu-flags> with something that matches your CPU. Intel-based Mac users (e.g. MacBook, CoreDuo) should at least have -march=prescott here to avoid compilation errors due to SSE instructions not being enabled. Core2Duo users can use -march=nocona. PPC users can use their CPU's alias to enable CPU specific tuning, e.g. -mcpu=G5 -mtune=G5.

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.16: 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.17: 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!



Print

Page updated December 1, 2011

Summary: How to bootstrap Gentoo Prefix on your Mac OS X system

Fabian Groffen
Author

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.