summaryrefslogtreecommitdiff
blob: 5c297fdbf28149159f1f6f3f85b2fefb1370010d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE sections SYSTEM "/dtd/book.dtd">

<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/proj/it/base/embedded/handbook/cross-compiling-kernel.xml,v 1.3 2010/05/05 21:32:07 scen Exp $ -->

<sections>

<abstract>
Cross-compilare con successo un kernel per il proprio sistema!
</abstract>

<version>0.3</version>
<date>2010-04-13</date>

<section>
<title>Sorgenti</title>
<body>

<p>
Prima di tutto occorre installare i sorgenti del kernel. Si può utilizzare
portage per installare il pacchetto necessario, o scaricarli
dall'<uri link="http://kernel.org/">Archivio dei Kernel Linux</uri> o da dove
si preferisce. Il metodo per compilarli è sempre lo stesso.
</p>

<p>
Bisognerà installare il kernel nella sysroot così che se si effettuerà la
cross-compilazione dei pacchetti che includono moduli del kernel, il processo
sarà trasparente. Altrimenti si potranno compilare i sorgenti del kernel dove
si preferisce. Alcuni mantengono i sorgenti del kernel in
<path>/usr/src/</path>, ad esempio.
</p>

</body>
</section>
<section>
<title>Preparazione alla Cross-compilazione</title>
<body>

<p>
Due sono le variabili usate dal kernel per selezionare l'architettura di
destinazione. Normalmente questi valori sono ricavati dall'ambiente dove viene
compilato il kernel, in questo caso però l'ambiente non corrisponde
all'architettura di destinazione, per cui bisogna forzarle. Le variabili in
questione sono <c>ARCH</c> e <c>CROSS_COMPILE</c>. I valori predefiniti per
entrambe si trovano nel Makefile presente nella directory radice dei sorgenti e
possono essere forzati da linea di comando.
</p>

<p>
La variabile <c>ARCH</c> indica il nome l'architettura di destinazione, nel
formato specificato dal kernel. Mentre portage e altri programmi usano la
dicitura "x86", il kernel usa "i386". Per avere un'idea delle sigle delle
diverse architetture visualizzare il contenuto della subdirectory
<path>arch/</path>.
</p>

<p>
La variabile <c>CROSS_COMPILE</c> dovrebbe essere auto esplicativa. Essa va
valorizzata con il prefisso della propria toolchain (trattino finale "<c>-</c>"
incluso). Perciò se si invoca la propria toolchain come
<c>x86_64-pc-linux-gnu-gcc</c>, sarà sufficiente eliminare quel <c>gcc</c> in
coda ed il risultato è ciò che si dovrà usare: <c>x86_64-pc-linux-gnu-</c>.
</p>

<p>
C'è una variabile aggiuntiva, <c>INSTALL_MOD_PATH</c>, che definisce dove verrà
creata la directory <path>/lib</path> e dove verranno memorizzati tutti i
moduli. Sebbene non serva trasferire i sorgenti del kernel nel proprio
dispositivo di destinazione, se si compilerà un qualunque modulo ci sarà
bisogno di questa directory.
</p>

<p>
Ci sono due modalità per preparare il sistema. È possibile modificare il
Makefile presente nella directory radice o valorizzare le variabili rilevanti da
linea di comando. Entrambe sono corrette: è solo una questione di gusti, perciò
verranno illustrate entrambe. Sceglierne una delle due.
</p>

<pre caption="Modifica del Makefile nella directory radice">
<comment># Il Makefile di un kernel vanilla si presenta così</comment>
ARCH            ?= $(SUBARCH)
CROSS_COMPILE   ?=

<comment># Specificare i valori predefiniti di ARCH e CROSS_COMPILE</comment>
ARCH            ?= <i>arm</i>
CROSS_COMPILE   ?= <i>arm-unknown-linux-gnu-</i>
</pre>

<pre caption="Valorizzare le variabili da linea di comando">
# <i>make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnu- ....</i>
</pre>

<p>
È anche possibile usare un piccolo script per semplificarsi la vita se si deve
lavorare con diversi kernel contemporaneamente. Questo script verrà chiamato
<c>xkmake</c>.
</p>

<pre caption="xkmake">
#!/bin/sh
exec make ARCH="arm" CROSS_COMPILE="arm-unknown-linux-gnu-" INSTALL_MOD_PATH="${SYSROOT}" "$@"
</pre>

<p>
Così quando si vorrà compilare un kernel o fare qualunque altra cosa, sarà
sufficiente eseguire <c>xkmake</c> al posto di <c>make</c>.
</p>

</body>
</section>
<section>
<title>Configurazione e Compilazione</title>
<body>

<p>
A questo punto, la configurazione e la compilazione del kernel è la stessa di
ogni altro kernel, per cui non verrà approfondito l'argomento dato che sono
presenti già molti HOWTO e guide che trattano l'argomento in dettaglio.
</p>

<pre caption="Configurazione e Compilazione">
# <i>cd "${SYSROOT}/usr/src/linux"</i>
# <i>xkmake menuconfig</i>
# <i>xkmake</i>
</pre>

</body>
</section>
</sections>