1.  Variabili

Ci sono alcune importanti variabili che verranno usate in questa sezione.

Variabile Significato
CBUILD Piattaforma su cui si sta compilando
CHOST Piattaforma per cui si sta compilando
ROOT La / virtuale sulla quale si sta installando
PORTAGE_CONFIGROOT La / dove portage può trovare i suoi file di configurazione (come il make.conf)

È possibile valorizzarle tutte a mano, ma questo ovviamente diventa presto una scocciatura. Un'idea migliore è invece quella di specificare queste variabili in uno script di shell così da evitare di digitarle ogni volta.

1.  Configurazione del Filesystem

Il cross-compilare un sistema richiede generalmente due alberature di directory. La prima, dove tutti i file di sviluppo sono normalmente installati. Questa è la vostra sysroot. L'altra alberatura è invece dove verranno installati i file che devono essere eseguiti. Una volta installati con emerge tutti i pacchetti nella sysroot (senza aver rimosso alcun file) sarà sufficiente installare tramite pacchetti binari o copiando a mano tutti i file desiderati nell'alberatura di esecuzione.

È convenzione usare l'alberatura presente sotto /usr/CTARGET/ come sysroot, dato che il cross-compilatore è già configurato per cercare in tale percorso le directory degli include e delle librerie. È anche possibile usare un'altra directory, aggiungendone poi il percorso alle CPPFLAGS/LDFLAGS tramite l'opzione -I/-L, ma questo opzione storicamente si è rivelato esser problematica: anche se dovesse funzionare, è sconsigliata e scoraggiata. D'ora in avanti si assumerà che si stia usando la sysroot come propria ROOT di sviluppo.

Il sistema che poi si vorrà eseguire avrà probabilmente bisogno di un po' di lavoro per esser alleggerito e snellito. Proprio per via dei file che si rimuoveranno dai pacchetti installati, questo ambiente non è adatto per la compilazione. Mentre si installa la sysroot si possono generare pacchetti binari dei vari applicativi, dai quali, con l'aggiunta della variabile INSTALL_MASK sono facilmente rimuovibili i file giudicati superflui. Si legga la man page del make.conf(5) per ottenere maggiori informazioni.

1.  Preparazione dell'Ambiente

Una volta scelto il percorso per la vostra sysroot, si dovrà configurare l'ambiente di portage come avviene durante la prima installazione. Ciò significa che si dovranno creare i file make.conf e make.profile per il sistema di destinazione. Si dovrà anche predisporre il file make.globals.

Codice 1.1: SYSROOT/etc/make.conf

ACCEPT_KEYWORDS="ppc"
ARCH="ppc"
CHOST="powerpc-softfloat-linux-uclibc"
CFLAGS="-Os -pipe"
CXXFLAGS="${CFLAGS}"
GENTOO_MIRRORS="http://open-systems.ufl.edu/mirrors/gentoo \
    http://prometheus.cs.wmich.edu/gentoo \
    http://mirror.datapipe.net/gentoo \
    http://ftp.ucsb.edu/pub/mirrors/linux/gentoo/"
INPUT_DEVICES="keyboard"
MAKEOPTS="-j2"
USE="-* minimal"

Il file make.globals contiene diverse impostazioni di default ed è indipendente dall'architettura. Pertanto si può semplicemente creare un link simbolico ad esso.

Codice 1.1: SYSROOT/etc/make.globals

# ln -s /etc/make.globals SYSROOT/etc/make.globals

Infine, per il make.profile, creare come al solito un link simbolico.

Codice 1.1: SYSROOT/etc/make.profile

# ln -s /usr/portage/profiles/uclibc/ppc SYSROOT/etc/make.profile

Nella sysroot alcuni test degli script di configure potrebbero fallire, con conseguente aggiunta di funzioni locali per ovviare ai presunti problemi riscontrarti. Per ovviare a questa situazione è sufficiente forzarne il risultato.

Codice 1.1: Force autoconf tests

export ac_cv_func_calloc_0_nonnull=yes
export ac_cv_func_malloc_0_nonnull=yes
export gl_cv_func_malloc_0_nonnull=yes
export ac_cv_func_realloc_0_nonnull=yes
export ac_cv_func_memcmp_working=yes
export ac_cv_func_strnlen_working=yes

1.  Un'utile strumento: xmerge

Xmerge è un semplice wrapper che valorizza le variabili d'ambiente per farle puntare ai percorsi corretti e lancia poi emerge. Questo script si aspetta che la variabile d'ambiente SYSROOT sia già impostata.

Codice 1.1: sample xmerge

#!/bin/sh
export CBUILD=$(portageq envvar CHOST)
export PORTAGE_CONFIGROOT=${SYSROOT}
if [ "$1" = "--root" ] ; then
        export ROOT=$2
        shift 2
else
        export ROOT=${SYSROOT}
fi
exec emerge "$@"

È possibile utilizzare xmerge sia per installare programmi nella root di sviluppo (sysroot) sia nella root del sistema che poi si vorrà eseguire. Per sfruttare la seconda modalità, è sufficiente aggiungere l'opzione --root .

1.  Un'utile strumento: pkg-config

Numerosi pacchetti ormai installano file pkg-config (*.pc) e li usano per ricavarne l'elenco delle librerie e degli include necessari. Per facilitare il processo di compilazione, è consigliabile installare un wrapper di pkg-config per l'architettura di destinazione, così da specificare a pkg-config in quali percorsi cercare.

Questo wrapper andrebbe installato in una directory presente nel proprio PATH, così da permettere agli script di configure di rilevarlo. Messo un CTARGET come prefisso del nome, lo script farà tutto il resto. Per intenderci, il nome canonico è CTARGET-pkg-config. Script di configure datati cercheranno solo pkg-config, in tali casi sarà necessario esportare la variabile PKG_CONFIG con il nome del wrapper.

Codice 1.1: cross-pkg-config wrapper

#!/bin/sh
CTARGET=${0%-pkg-config}
SYSROOT="/usr/${CTARGET}"
export PKG_CONFIG_LIBDIR="${SYSROOT}/usr/lib/pkgconfig"
unset PKG_CONFIG_ALLOW_SYSTEM_CFLAGS PKG_CONFIG_ALLOW_SYSTEM_LIBS
exec pkg-config "$@"

1.  Disintallazione

Se si desidera disinstallare ed eliminare quanto fatto, sarà sufficiente rimuovere l'alberatura presente nella sysroot, senza intaccare alcun pacchetto nativo installato. Si legga anche la sezione relativa alla disinstallazione nella guida relativa alla cross-compilazione.