Initial revision
[openwrt.git] / docs / buildroot-documentation.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head>
7   <title>Buildroot - Usage and documentation</title>
8   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9   <link rel="stylesheet" type="text/css" href="stylesheet.css" />
10 </head>
11
12 <body>
13   <div class="main">
14     <div class="titre">
15       <h1>Buildroot</h1>
16     </div>
17
18     <p>Usage and documentation by Thomas Petazzoni. Contributions from
19     Karsten Kruse, Ned Ludd, Martin Herren.</p>
20
21     <p><small>Last modification : $Id$</small></p>
22
23     <ul>
24       <li><a href="#about">About Buildroot</a></li>
25       <li><a href="#download">Obtaining Buildroot</a></li>
26       <li><a href="#using">Using Buildroot</a></li>
27       <li><a href="#custom_targetfs">Customizing the target filesystem</a></li>
28       <li><a href="#custom_busybox">Customizing the Busybox
29       configuration</a></li>
30       <li><a href="#custom_uclibc">Customizing the uClibc
31       configuration</a></li>
32       <li><a href="#buildroot_innards">How Buildroot works</a></li>
33       <li><a href="#using_toolchain">Using the uClibc toolchain</a></li>
34       <li><a href="#toolchain_standalone">Using the uClibc toolchain
35       outside of Buildroot</a></li>
36       <li><a href="#downloaded_packages">Location of downloaded packages</a></li>
37       <li><a href="#add_software">Extending Buildroot with more
38       Software</a></li>
39       <li><a href="#links">Ressources</a></li>
40     </ul>
41
42     <h2><a name="about" id="about"></a>About Buildroot</h2>
43
44     <p>Buildroot is a set of Makefiles and patches that allows to easily
45     generate both a cross-compilation toolchain and a root filesystem for your
46     target. The cross-compilation toolchain uses uClibc (<a href=
47     "http://www.uclibc.org/">http://www.uclibc.org/</a>), a tiny C standard
48     library.</p>
49
50     <p>Buildroot is useful mainly for people working with embedded systems.
51     Embedded systems often use processors that are not the regular x86
52     processors everyone is used to have on his PC. It can be PowerPC
53     processors, MIPS processors, ARM processors, etc.</p>
54
55     <p>A compilation toolchain is the set of tools that allows to
56     compile code for your system. It consists of a compiler (in our
57     case, <code>gcc</code>), binary utils like assembler and linker
58     (in our case, <code>binutils</code>) and a C standard library (for
59     example <a href="http://www.gnu.org/software/libc/libc.html">GNU
60     Libc</a>, <a href="http://www.uclibc.org">uClibc</a> or <a
61     href="http://www.fefe.de/dietlibc/">dietlibc</a>). The system
62     installed on your development station certainly already has a
63     compilation toolchain that you can use to compile application that
64     runs on your system. If you're using a PC, your compilation
65     toolchain runs on an x86 processor and generates code for a x86
66     processor. Under most Linux systems, the compilation toolchain
67     uses the GNU libc as C standard library.  This compilation
68     toolchain is called the "host compilation toolchain", and more
69     generally, the machine on which it is running, and on which you're
70     working is called the "host system". The compilation toolchain is
71     provided by your distribution, and Buildroot has nothing to do
72     with it.</p>
73
74     <p>As said above, the compilation toolchain that comes with your system
75     runs and generates code for the processor of your host system. As your
76     embedded system has a different processor, you need a cross-compilation
77     toolchain: it's a compilation toolchain that runs on your host system but
78     that generates code for your target system (and target processor). For
79     example, if your host system uses x86 and your target system uses ARM, the
80     regular compilation toolchain of your host runs on x86 and generates code
81     for x86, while the cross-compilation toolchain runs on x86 and generates
82     code for ARM.</p>
83
84     <p>Even if your embedded system uses a x86 processor, you might interested
85     in Buildroot, for two reasons:</p>
86
87     <ul>
88       <li>The compilation toolchain of your host certainly uses the GNU Libc
89       which is a complete but huge C standard library. Instead of using GNU
90       Libc on your target system, you can use uClibc which is a tiny C standard
91       library. If you want to use this C library, then you need a compilation
92       toolchain to generate binaries linked with it. Buildroot can do it for
93       you.</li>
94
95       <li>Buildroot automates the building of a root filesystem with all needed
96       tools like busybox. It makes it much easier than doing it by hand.</li>
97     </ul>
98
99     <p>You might wonder why such a tool is needed when you can compile
100     <code>gcc</code>, <code>binutils</code>, uClibc and all the tools by hand.
101     Of course, doing so is possible. But dealing with all configure options,
102     with all problems of every <code>gcc</code> or <code>binutils</code>
103     version it very time-consuming and uninteresting. Buildroot automates this
104     process through the use of Makefiles, and has a collection of patches for
105     each <code>gcc</code> and <code>binutils</code> version to make them work
106     on most architectures.</p>
107
108     <h2><a name="download" id="download"></a>Obtaining Buildroot</h2>
109
110     <p>Buildroot is available as daily CVS snapshots or directly using
111     CVS.</p>
112
113     <p>The latest snapshot is always available at <a
114     href="http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2">http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2</a>,
115     and previous snapshots are also available at <a
116     href="http://uclibc.org/downloads/snapshots/">http://uclibc.org/downloads/snapshots/</a>.</p>
117
118     <p>To download Buildroot using CVS, you can simply follow
119     the rules described on the "Accessing CVS"-page (<a href=
120     "http://www.uclibc.org/cvs_anon.html">http://www.uclibc.org/cvs_anon.html</a>)
121     of the uClibc website (<a href=
122     "http://www.uclibc.org">http://www.uclibc.org</a>), and download the
123     <code>buildroot</code> CVS module. For the impatient, here's a quick
124     recipe:</p>
125
126  <pre>
127  $ cvs -d:pserver:anonymous@uclibc.org:/var/cvs login
128  $ cvs -z3 -d:pserver:anonymous@uclibc.org:/var/cvs co buildroot
129 </pre>
130
131     <h2><a name="using" id="using"></a>Using Buildroot</h2>
132
133     <p>Buildroot has a nice configuration tool similar to the one you can find
134     in the Linux Kernel (<a href=
135     "http://www.kernel.org/">http://www.kernel.org/</a>) or in Busybox
136     (<a href="http://www.busybox.org/">http://www.busybox.org/</a>). Note that
137     you can run everything as a normal user. There is no need to be root to
138     configure and use Buildroot. The first step is to run the configuration
139     assistant:</p>
140
141 <pre>
142  $ make menuconfig
143 </pre>
144
145     <p>For each entry of the configuration tool, you can find associated help
146     that describes the purpose of the entry.</p>
147
148     <p>Once everything is configured, the configuration tool has generated a
149     <code>.config</code> file that contains the description of your
150     configuration. It will be used by the Makefiles to do what's needed.</p>
151
152     <p>Let's go:</p>
153
154 <pre>
155  $ make
156 </pre>
157
158     <p>This command will download, configure and compile all the selected
159     tools, and finally generate a target filesystem. The target filesystem will
160     be named <code>root_fs_ARCH.EXT</code> where <code>ARCH</code> is your
161     architecture and <code>EXT</code> depends on the type of target filesystem
162     selected in the <code>Target options</code> section of the configuration
163     tool.</p>
164
165     <h2><a name="custom_targetfs" id="custom_targetfs"></a>Customizing the
166     target filesystem</h2>
167
168     <p>There are two ways to customize the resulting target filesystem:</p>
169
170     <ul>
171       <li>Customize the target filesystem directly, and rebuild the image. The
172       target filesystem is available under <code>build_ARCH/root/</code> where
173       <code>ARCH</code> is the chosen target architecture. You can simply make
174       your changes here, and run make afterwards, which will rebuild the target
175       filesystem image. This method allows to do everything on the target
176       filesystem, but if you decide to completely rebuild your toolchain and
177       tools, these changes will be lost.</li>
178
179       <li>Customize the target filesystem skeleton, available under
180       <code>target/default/target_skeleton/</code>. You can customize
181       configuration files or other stuff here. However, the full file hierarchy
182       is not yet present, because it's created during the compilation process.
183       So you can't do everything on this target filesystem skeleton, but
184       changes to it remains even you completely rebuild the cross-compilation
185       toolchain and the tools.<br />
186       You can also customize the <code>target/default/device_table.txt</code>
187       file which is used by the tools that generate the target filesystem image
188       to properly set permissions and create device nodes. The
189       <code>target/default/skel.tar.gz</code> file contains the main
190       directories of a root filesystem and there is no obvious reason for which
191       it should be changed. These main directories are in an tarball inside of
192       inside the skeleton because it contains symlinks that would be broken
193       otherwise.</li>
194     </ul>
195
196     <h2><a name="custom_busybox" id="custom_busybox"></a>Customizing the
197     Busybox configuration</h2>
198
199     <p>Busybox is very configurable, and you may want to customize it. You can
200     follow these simple steps to do it. It's not an optimal way, but it's
201     simple and it works.</p>
202
203     <ol>
204       <li>Make a first compilation of buildroot with busybox without trying to
205       customize it.</li>
206
207       <li>Go into <code>build_ARCH/busybox/</code> and run <code>make
208       menuconfig</code>. The nice configuration tool appears and you can
209       customize everything.</li>
210
211       <li>Copy the <code>.config</code> file to
212       <code>package/busybox/busybox.config</code> so that your customized
213       configuration will remains even if you remove the cross-compilation
214       toolchain.</li>
215
216       <li>Run the compilation of buildroot again.</li>
217     </ol>
218
219     <p>Otherwise, you can simply change the
220     <code>package/busybox/busybox.config</code> file if you know the options
221     you want to change without using the configuration tool.</p>
222
223     <h2><a name="custom_uclibc" id="custom_uclibc"></a>Customizing the uClibc
224     configuration</h2>
225
226     <p>Just like <a href="#custom_busybox">BusyBox</a>, <a
227     href="http://www.uclibc.org">uClibc</a> offers a lot of
228     configuration options. They allow to select various
229     functionalities, depending on your needs and limitations.</p>
230
231     <p>The easiest way to modify the configuration of uClibc is to
232     follow these steps :</p>
233
234     <ol>
235
236       <li>Make a first compilation of buildroot without trying to
237       customize uClibc.</li>
238
239       <li>Go into the directory
240       <code>toolchain_build_ARCH/uClibc/</code> and run <code>make
241       menuconfig</code>. The nice configuration assistant, similar to
242       the one used in the Linux Kernel or in Buildroot appears. Make
243       your configuration as appropriate.</li>
244
245       <li>Copy the <code>.config</code> file to
246       <code>toolchain/uClibc/uClibc.config</code> or
247       <code>toolchain/uClibc/uClibc.config-locale</code>. The former
248       is used if you haven't selected locale support in Buildroot
249       configuration, and the latter is used if you have selected
250       locale support.</li>
251
252       <li>Run the compilation of Buildroot again</li>
253
254     </ol>
255
256     <p>Otherwise, you can simply change
257     <code>toolchain/uClibc/uClibc.config</code> or
258     <code>toolchain/uClibc/uClibc.config-locale</code> without running
259     the configuration assistant.</p>
260
261     <h2><a name="buildroot_innards" id="buildroot_innards"></a>How Buildroot
262     works</h2>
263
264     <p>As said above, Buildroot is basically a set of Makefiles that download,
265     configure and compiles software with the correct options. It also includes
266     some patches for various software, mainly the ones involved in the
267     cross-compilation tool chain (<code>gcc</code>, <code>binutils</code> and
268     uClibc).</p>
269
270     <p>There is basically one Makefile per software, and they are named with
271     the <code>.mk</code> extension. Makefiles are split into three
272     sections:</p>
273
274     <ul>
275       <li><b>package</b> (in the <code>package/</code> directory) contains the
276       Makefiles and associated files for all user-space tools that Buildroot
277       can compile and add to the target root filesystem. There is one
278       sub-directory per tool.</li>
279
280       <li><b>toolchain</b> (in the <code>toolchain/</code> directory) contains
281       the Makefiles and associated files for all software related to the
282       cross-compilation toolchain : <code>binutils</code>, <code>ccache</code>,
283       <code>gcc</code>, <code>gdb</code>, <code>kernel-headers</code> and
284       <code>uClibc</code>.</li>
285
286       <li><b>target</b> (in the <code>target</code> directory) contains the
287       Makefiles and associated files for software related to the generation of
288       the target root filesystem image. Four types of filesystems are supported
289       : ext2, jffs2, cramfs and squashfs. For each of them, there's a
290       sub-directory with the required files. There is also a
291       <code>default/</code> directory that contains the target filesystem
292       skeleton.</li>
293     </ul>
294
295     <p>Each directory contains at least 3 files :</p>
296
297     <ul>
298       <li><code>something.mk</code> is the Makefile that downloads, configures,
299       compiles and installs the software <code>something</code>.</li>
300
301       <li><code>Config.in</code> is a part of the configuration tool
302       description file. It describes the option related to the current
303       software.</li>
304
305       <li><code>Makefile.in</code> is a part of Makefile that sets various
306       variables according to the configuration given through the configuration
307       tool. For most tools it simply involves adding the name of the tool to
308       the <code>TARGETS</code> variable.</li>
309     </ul>
310
311     <p>The main Makefile do the job through the following steps (once the
312     configuration is done):</p>
313
314     <ol>
315       <li>Create the download directory (<code>dl/</code> by default). This is
316       where the tarballs will be downloaded. It is interesting to know that the
317       tarballs are in this directory because it may be useful to save them
318       somewhere to avoid further downloads.</li>
319
320       <li>Create the build directory (<code>build_ARCH/</code> by default,
321       where <code>ARCH</code> is your architecture). This is where all
322       user-space tools while be compiled.</li>
323
324       <li>Create the toolchain build directory
325       (<code>toolchain_build_ARCH/</code> by default, where <code>ARCH</code>
326       is your architecture). This is where the cross compilation toolchain will
327       be compiled.</li>
328
329       <li>Setup the staging directory (<code>build_ARCH/staging_dir/</code> by
330       default). This is where the cross-compilation toolchain will be
331       installed. If you want to use the same cross-compilation toolchain for
332       other purposes, such as compiling third-party applications, you can add
333       <code>build_ARCH/staging_dir/bin</code> to your PATH, and then use
334       <code>arch-linux-gcc</code> to compile your application. In order to
335       setup this staging directory, it first removes it, and then it creates
336       various subdirectories and symlinks inside it.</li>
337
338       <li>Create the target directory (<code>build_ARCH/root/</code> by
339       default) and the target filesystem skeleton. This directory will contain
340       the final root filesystem. To setup it up, it first deletes it, then it
341       uncompress the <code>target/default/skel.tar.gz</code> file to create the
342       main subdirectories and symlinks, copies the skeleton available in
343       <code>target/default/target_skeleton</code> and then removes useless
344       <code>CVS/</code> directories.</li>
345
346       <li>Make the <code>TARGETS</code> dependency. This is where all the job
347       is done : all <code>Makefile.in</code> files "subscribe" targets into
348       this global variable, so that the needed tools gets compiled.</li>
349     </ol>
350
351     <h2><a name="using_toolchain" id="using_toolchain"></a>Using the
352     uClibc toolchain</h2>
353
354     <p>You may want to compile your own programs or other software
355     that are not packaged in Buildroot. In order to do this, you can
356     use the toolchain that was generated by Buildroot.</p>
357
358     <p>The toolchain generated by Buildroot by default is located in
359     <code>build_ARCH/staging_dir/</code>. The simplest way to use it
360     is to add <code>build_ARCH/staging_dir/bin/</code> to your PATH
361     environnement variable, and then to use
362     <code>arch-linux-gcc</code>, <code>arch-linux-objdump</code>,
363     <code>arch-linux-ld</code>, etc.</p>
364
365     <p>For example, you may add the following to your
366     <code>.bashrc</code> (considering you're building for the MIPS
367     architecture and that Buildroot is located in
368     <code>~/buildroot/</code>) :</p>
369
370 <pre>
371 export PATH=$PATH:~/buildroot/build_mips/bin/
372 </pre>
373
374     <p>Then you can simply do :</p>
375
376 <pre>
377 mips-linux-gcc -o foo foo.c
378 </pre>
379
380     <p><b>Important</b> : do not try to move the toolchain to an other
381     directory, it won't work. There are some hard-coded paths in the
382     <i>gcc</i> configuration. If the default toolchain directory
383     doesn't suit your needs, please refer to the <a
384     href="#toolchain_standalone">Using the uClibc toolchain outside of
385     buildroot</a> section.</p>
386
387     <h2><a name="toolchain_standalone" id="toolchain_standalone"></a>Using the
388     uClibc toolchain outside of buildroot</h2>
389
390     <p>By default, the cross-compilation toolchain is generated inside
391     <code>build_ARCH/staging_dir/</code>. But sometimes, it may be useful to
392     install it somewhere else, so that it can be used to compile other programs
393     or by other users. Moving the <code>build_ARCH/staging_dir/</code>
394     directory elsewhere is <b>not possible</b>, because they are some hardcoded
395     paths in the toolchain configuration.</p>
396
397     <p>If you want to use the generated toolchain for other purposes,
398     you can configure Buildroot to generate it elsewhere using the
399     option of the configuration tool : <code>Build options ->
400     Toolchain and header file location</code>, which defaults to
401     <code>$(BUILD_DIR)/staging_dir/</code>.</p>
402
403     <h2><a name="downloaded_packages"
404     id="downloaded_packages"></a>Location of downloaded packages</h2>
405
406     <p>It might be useful to know that the various tarballs that are
407     downloaded by the <i>Makefiles</i> are all stored in the
408     <code>DL_DIR</code> which by default is the <code>dl</code>
409     directory. It's useful for example if you want to keep a complete
410     version of Buildroot which is know to be working with the
411     associated tarballs. This will allow you to regenerate the
412     toolchain and the target filesystem with exactly the same
413     versions.</p>
414
415     <h2><a name="add_software" id="add_software"></a>Extending Buildroot with
416     more software</h2>
417
418     <p>This section will only consider the case in which you want to
419     add user-space software.</p>
420
421     <h3>Package directory</h3>
422
423     <p>First of all, create a directory under the <code>package</code>
424     directory for your software, for example <code>foo</code>.</p>
425
426     <h3><code>Config.in</code> file</h3>
427
428     <p>Then, create a file named <code>Config.in</code>. This file
429     will contain the portion of options description related to our
430     <code>foo</code> software that will be used and displayed in the
431     configuration tool. It should basically contain :</p>
432
433 <pre>
434 config BR2_PACKAGE_FOO
435         bool "foo"
436         default n
437         help
438              This is a comment that explains what foo is.
439 </pre>
440
441     <p>Of course, you can add other options to configure particular
442     things in your software.</p>
443
444     <h3><code>Makefile.in</code> file</h3>
445
446     <p>Then, write a <code>Makefile.in</code> file. Basically, this is
447     a very short <i>Makefile</i> that adds the name of the software to
448     the list of <code>TARGETS</code> that Buildroot will generate. In
449     fact, the name of the software is the the identifier of the target
450     inside the real <i>Makefile</i> that will do everything (download,
451     compile, install), and that we study below. Back to
452     <code>Makefile.in</code>, here is an example :</p>
453
454 <pre>
455 ifeq ($(strip $(BR2_PACKAGE_FOO)),y)
456 TARGETS+=foo
457 endif
458 </pre>
459
460    <p>As you can see, this short <i>Makefile</i> simply adds the
461    target <code>foo</code> to the list of targets handled by Buildroot
462    if software <i>foo</i> was selected using the configuration tool.</p>
463
464    <h3>The real <i>Makefile</i></h3>
465
466    <p>Finally, here's the hardest part. Create a file named
467    <code>foo.mk</code>. It will contain the <i>Makefile</i> rules that
468    are in charge of downloading, configuring, compiling and installing
469    the software. Below is an example that we will comment
470    afterwards.</p>
471
472 <pre>
473      1  #############################################################
474      2  #
475      3  # foo
476      4  #
477      5  #############################################################
478      6  FOO_VERSION:=1.0
479      7  FOO_SOURCE:=less-$(FOO_VERSION).tar.gz
480      8  FOO_SITE:=http://www.foosoftware.org/downloads
481      9  FOO_DIR:=$(BUILD_DIR)/less-$(FOO_VERSION)
482     10  FOO_BINARY:=foo
483     11  FOO_TARGET_BINARY:=usr/bin/foo
484     12
485     13  $(DL_DIR)/$(FOO_SOURCE):
486     14          $(WGET) -P $(DL_DIR) $(FOO_SITE)/$(FOO_SOURCE)
487     15
488     16  $(FOO_DIR)/.source: $(DL_DIR)/$(FOO_SOURCE)
489     17          zcat $(DL_DIR)/$(FOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
490     18          touch $(FOO_DIR)/.source
491     19
492     20  $(FOO_DIR)/.configured: $(FOO_DIR)/.source
493     21          (cd $(FOO_DIR); \
494     22                  $(TARGET_CONFIGURE_OPTS) \
495     23                  CFLAGS="$(TARGET_CFLAGS)" \
496     24                  ./configure \
497     25                  --target=$(GNU_TARGET_NAME) \
498     26                  --host=$(GNU_TARGET_NAME) \
499     27                  --build=$(GNU_HOST_NAME) \
500     28                  --prefix=/usr \
501     29                  --sysconfdir=/etc \
502     30          );
503     31          touch $(FOO_DIR)/.configured;
504     32
505     33  $(FOO_DIR)/$(FOO_BINARY): $(FOO_DIR)/.configured
506     34          $(MAKE) CC=$(TARGET_CC) -C $(FOO_DIR)
507     35
508     36  $(TARGET_DIR)/$(FOO_TARGET_BINARY): $(FOO_DIR)/$(FOO_BINARY)
509     37          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) install
510     38          rm -Rf $(TARGET_DIR)/usr/man
511     39
512     40  foo: uclibc ncurses $(TARGET_DIR)/$(FOO_TARGET_BINARY)
513     41
514     42  foo-source: $(DL_DIR)/$(FOO_SOURCE)
515     43
516     44  foo-clean:
517     45          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) uninstall
518     46          -$(MAKE) -C $(FOO_DIR) clean
519     47
520     48  foo-dirclean:
521     49          rm -rf $(FOO_DIR)
522     50
523 </pre>
524
525     <p>First of all, this <i>Makefile</i> example works for a single
526     binary software. For other software such as libraries or more
527     complex stuff with multiple binaries, it should be adapted. Look at
528     the other <code>*.mk</code> files in the <code>package</code>
529     directory.</p>
530
531     <p>At lines 6-11, a couple of useful variables are defined :</p>
532
533     <ul>
534
535      <li><code>FOO_VERSION</code> : The version of <i>foo</i> that
536      should be downloaded.</li>
537
538      <li><code>FOO_SOURCE</code> : The name of the tarball of
539      <i>foo</i> on the download website of FTP site. As you can see
540      <code>FOO_VERSION</code> is used.</li>
541
542      <li><code>FOO_SITE</code> : The HTTP or FTP site from which
543      <i>foo</i> archive is downloaded. It must include the complete
544      path to the directory where <code>FOO_SOURCE</code> can be
545      found.</li>
546
547      <li><code>FOO_DIR</code> : The directory into which the software
548      will be configured and compiled. Basically, it's a subdirectory
549      of <code>BUILD_DIR</code> which is created upon decompression of
550      the tarball.</li>
551
552      <li><code>FOO_BINARY</code> : Software binary name. As said
553      previously, this is an example for a single binary software.</li>
554
555      <li><code>FOO_TARGET_BINARY</code> : The full path of the binary
556      inside the target filesystem.</li>
557
558     </ul>
559
560     <p>Lines 13-14 defines a target that downloads the tarball from
561     the remote site to the download directory
562     (<code>DL_DIR</code>).</p>
563
564     <p>Lines 16-18 defines a target and associated rules that
565     uncompress the downloaded tarball. As you can see, this target
566     depends on the tarball file, so that the previous target (line
567     13-14) is called before executing the rules of the current
568     target. Uncompressing is followed by <i>touching</i> a hidden file
569     to mark the software has having been uncompressed. This trick is
570     used everywhere in Buildroot <i>Makefile</i> to split steps
571     (download, uncompress, configure, compile, install) while still
572     having correct dependencies.</p>
573
574     <p>Lines 20-31 defines a target and associated rules that
575     configures the software. It depends on the previous target (the
576     hidden <code>.source</code> file) so that we are sure the software has
577     been uncompressed. In order to configure it, it basically runs the
578     well-known <code>./configure</code>script. As we may be doing
579     cross-compilation, <code>target</code>, <code>host</code> and
580     <code>build</code> arguments are given. The prefix is also set to
581     <code>/usr</code>, not because the software will be installed in
582     <code>/usr</code> on your host system, but in the target
583     filesystem. Finally it creates a <code>.configured</code> file to
584     mark the software as configured.</p>
585
586     <p>Lines 33-34 defines a target and a rule that compiles the
587     software. This target will create the binary file in the
588     compilation directory, and depends on the software being already
589     configured (hence the reference to the <code>.configured</code>
590     file). It basically runs <code>make</code> inside the source
591     directory.</p>
592
593     <p>Lines 36-38 defines a target and associated rules that install
594     the software inside the target filesystem. It depends on the
595     binary file in the source directory, to make sure the software has
596     been compiled. It uses the <code>install</code> target of the
597     software <code>Makefile</code> by passing a <code>prefix</code>
598     argument, so that the <code>Makefile</code> doesn't try to install
599     the software inside host <code>/usr</code> but inside target
600     <code>/usr</code>. After the installation, the
601     <code>/usr/man</code> directory inside the target filesystem is
602     removed to save space.</p>
603
604     <p>Line 40 defines the main target of the software, the one
605     referenced in the <code>Makefile.in</code> file. This targets
606     should first of all depends on the dependecies of the software (in
607     our example, <i>uclibc</i> and <i>ncurses</i>), and then to the
608     final binary. This last dependency will call all previous
609     dependencies in the right order. </p>
610
611     <p>Line 42 defines a simple target that only downloads the code
612     source. This is not used during normal operation of Buildroot, but
613     might be useful.</p>
614
615     <p>Lignes 44-46 define a simple target to clean the software build
616     by calling the <i>Makefiles</i> with the appropriate option.</p>
617
618     <p>Lines 48-49 define a simple target to completely remove the
619     directory in which the software was uncompressed, configured and
620     compiled.</p>
621
622     <h3>Conclusion</h3>
623
624     <p>As you can see, adding a software to buildroot is simply a
625     matter of writing a <i>Makefile</i> using an already existing
626     example and to modify it according to the compilation process of
627     the software.</p>
628
629     <p>If you package software that might be useful for other persons,
630     don't forget to send a patch to Buildroot developers !</p>
631
632      <h2><a name="links" id="links"></a>Ressources</h2>
633
634     <p>To learn more about Buildroot you can visit these
635     websites:</p>
636
637     <ul>
638       <li><a href="http://www.uclibc.org/">http://www.uclibc.org/</a></li>
639       <li><a href="http://www.busybox.net/">http://www.busybox.net/</a></li>
640     </ul>
641
642   </div>
643 </body>
644 </html>