is your architecture). This is where the cross compilation toolchain will
be compiled.</li>
- <li>Setup the staging directory (<code>build_ARCH/staging_dir/</code> by
+ <li>Setup the staging directory (<code>staging_dir_ARCH/</code> by
default). This is where the cross-compilation toolchain will be
installed. If you want to use the same cross-compilation toolchain for
other purposes, such as compiling third-party applications, you can add
- <code>build_ARCH/staging_dir/bin</code> to your PATH, and then use
+ <code>staging_dir_ARCH/bin</code> to your PATH, and then use
<code>arch-linux-gcc</code> to compile your application. In order to
setup this staging directory, it first removes it, and then it creates
various subdirectories and symlinks inside it.</li>
use the toolchain that was generated by the Buildroot.</p>
<p>The toolchain generated by the Buildroot by default is located in
- <code>build_ARCH/staging_dir/</code>. The simplest way to use it
- is to add <code>build_ARCH/staging_dir/bin/</code> to your PATH
+ <code>staging_dir_ARCH</code>. The simplest way to use it
+ is to add <code>staging_dir_ARCH/bin/</code> to your PATH
environment variable, and then to use
<code>arch-linux-gcc</code>, <code>arch-linux-objdump</code>,
<code>arch-linux-ld</code>, etc.</p>
<code>~/buildroot/</code>) :</p>
<pre>
-export PATH=$PATH:~/buildroot/build_mipsel/staging_dir/bin/
+export PATH=$PATH:~/buildroot/staging_dir_mipsel/bin/
</pre>
<p>Then you can simply do :</p>
uClibc toolchain outside of buildroot</h2>
<p>By default, the cross-compilation toolchain is generated inside
- <code>build_ARCH/staging_dir/</code>. But sometimes, it may be useful to
+ <code>staging_dir_ARCH/</code>. But sometimes, it may be useful to
install it somewhere else, so that it can be used to compile other programs
- or by other users. Moving the <code>build_ARCH/staging_dir/</code>
+ or by other users. Moving the <code>staging_dir_ARCH/</code>
directory elsewhere is <b>not possible</b>, because they are some hardcoded
paths in the toolchain configuration.</p>
you can configure Buildroot to generate it elsewhere using the
option of the configuration tool : <code>Build options ->
Toolchain and header file location</code>, which defaults to
- <code>$(BUILD_DIR)/staging_dir/</code>.</p>
+ <code>staging_dir_ARCH/</code>.</p>
<h2><a name="downloaded_packages"
id="downloaded_packages"></a>Location of downloaded packages</h2>
afterwards.</p>
<pre>
- 1 #############################################################
- 2 # foo
- 3 #############################################################
- 4 PKG_NAME:=foo
- 5 PKG_VERSION:=1.0
- 6 PKG_RELEASE:=1
- 7 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
- 8 PKG_SITE:=http://www.foosoftware.org/downloads
- 9 PKG_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
- 10 PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
- 11 PKG_IPK_DIR:=$(PKG_DIR)/ipkg
- 12
- 13 $(DL_DIR)/$(PKG_SOURCE):
- 14 $(WGET) -P $(DL_DIR) $(PKG_SITE)/$(PKG_SOURCE)
- 15
- 16 $(PKG_DIR)/.source: $(DL_DIR)/$(PKG_SOURCE)
- 17 zcat $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
- 18 touch $(PKG_DIR)/.source
- 19
- 20 $(PKG_DIR)/.configured: $(PKG_DIR)/.source
- 21 (cd $(PKG_DIR); \
- 22 $(TARGET_CONFIGURE_OPTS) \
- 23 CFLAGS="$(TARGET_CFLAGS)" \
- 24 ./configure \
- 25 --target=$(GNU_TARGET_NAME) \
- 26 --host=$(GNU_TARGET_NAME) \
- 27 --build=$(GNU_HOST_NAME) \
- 28 --prefix=/usr \
- 29 --sysconfdir=/etc \
- 30 );
- 31 touch $(PKG_DIR)/.configured;
- 32
- 33 $(PKG_DIR)/foo $(PKG_DIR)/.configured
- 34 $(MAKE) CC=$(TARGET_CC) -C $(PKG_DIR)
- 35
- 36 $(PKG_IPK): $(PKG_DIR)/$(PKG_BINARY)
- 37 $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
- 38 $(MAKE) prefix=$(PKG_IPK_DIR)/usr -C $(PKG_DIR) install
- 39 rm -Rf $(PKG_IPK_DIR)/usr/man
- 40 $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
- 41
- 42 $(IPKG_STATE_DIR)/info/$(PKG_NAME).list: $(PKG_IPK)
- 43 $(IPKG) install $(PKG_IPK)
- 44
- 45 prepare: $(PKG_DIR)/.source
- 46 compile: $(PKG_IPK)
- 47 install: $(IPKG_STATE_DIR)/info/$(PKG_NAME).list
- 48 clean:
- 49 rm -rf $(PKG_DIR)
- 50 rm -f $(PKG_IPK)
+ 1 # $Id$
+ 2
+ 3 PKG_NAME:=foo
+ 4 PKG_VERSION:=1.0
+ 5 PKG_RELEASE:=1
+ 6 PKG_MD5SUM:=4584f226523776a3cdd2fb6f8212ba8d
+ 7
+ 8 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+ 9 PKG_SOURCE_URL:=http://www.foosoftware.org/downloads
+ 10 PKG_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+ 11 PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+ 12 PKG_IPK_DIR:=$(PKG_DIR)/ipkg
+ 13
+ 14 $(DL_DIR)/$(PKG_SOURCE):
+ 15 $(SCRIPT_DIR)/download.pl $(DL_DIR) $(PKG_SOURCE) $(PKG_MD5SUM) $(PKG_SOURCE_URL)
+ 16
+ 17 $(PKG_DIR)/.source: $(DL_DIR)/$(PKG_SOURCE)
+ 18 zcat $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+ 19 touch $(PKG_DIR)/.source
+ 20
+ 21 $(PKG_DIR)/.configured: $(PKG_DIR)/.source
+ 22 (cd $(PKG_DIR); \
+ 23 $(TARGET_CONFIGURE_OPTS) \
+ 24 CFLAGS="$(TARGET_CFLAGS)" \
+ 25 ./configure \
+ 26 --target=$(GNU_TARGET_NAME) \
+ 27 --host=$(GNU_TARGET_NAME) \
+ 28 --build=$(GNU_HOST_NAME) \
+ 29 --prefix=/usr \
+ 30 --sysconfdir=/etc \
+ 31 );
+ 32 touch $(PKG_DIR)/.configured;
+ 33
+ 34 $(PKG_DIR)/foo $(PKG_DIR)/.configured
+ 35 $(MAKE) CC=$(TARGET_CC) -C $(PKG_DIR)
+ 36
+ 37 $(PKG_IPK): $(PKG_DIR)/$(PKG_BINARY)
+ 38 $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+ 39 $(MAKE) prefix=$(PKG_IPK_DIR)/usr -C $(PKG_DIR) install
+ 40 rm -Rf $(PKG_IPK_DIR)/usr/man
+ 41 $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+ 42
+ 43 $(IPKG_STATE_DIR)/info/$(PKG_NAME).list: $(PKG_IPK)
+ 44 $(IPKG) install $(PKG_IPK)
+ 45
+ 46 prepare: $(PKG_DIR)/.source
+ 47 compile: $(PKG_IPK)
+ 48 install: $(IPKG_STATE_DIR)/info/$(PKG_NAME).list
+ 49 clean:
+ 50 rm -rf $(PKG_DIR)
+ 51 rm -f $(PKG_IPK)
</pre>
<p>First of all, this <i>Makefile</i> example works for a single
the other <code>Makefile</code> files in the <code>package</code>
directory.</p>
- <p>At lines 4-11, a couple of useful variables are defined :</p>
+ <p>At lines 3-12, a couple of useful variables are defined :</p>
<ul>
<li><code>PKG_NAME</code> : The package name, e.g. <i>foo</i>.</li>
<li><code>PKG_RELEASE</code> : The release number that will be
appended to the version number of your <i>ipkg</i> package.
+ <li><code>PKG_MD5SUM</code> : The md5sum of the software archive.
+
<li><code>PKG_SOURCE</code> : The name of the tarball of
your package on the download website of FTP site. As you can see
<code>PKG_NAME</code> and <code>PKG_VERSION</code> are used.</li>
- <li><code>PKG_SITE</code> : The HTTP or FTP site from which
- the archive is downloaded. It must include the complete
+ <li><code>PKG_SOURCE_URL</code> : Space separated list of the HTTP
+ or FTP sites from which the archive is downloaded. It must include the complete
path to the directory where <code>FOO_SOURCE</code> can be
found.</li>
</ul>
- <p>Lines 13-14 defines a target that downloads the tarball from
+ <p>Lines 14-15 defines a target that downloads the tarball from
the remote site to the download directory
(<code>DL_DIR</code>).</p>
- <p>Lines 16-18 defines a target and associated rules that
+ <p>Lines 17-19 defines a target and associated rules that
uncompress the downloaded tarball. As you can see, this target
depends on the tarball file, so that the previous target (line
- 13-14) is called before executing the rules of the current
+ 14-15) is called before executing the rules of the current
target. Uncompressing is followed by <i>touching</i> a hidden file
to mark the software has having been uncompressed. This trick is
used everywhere in Buildroot <i>Makefile</i> to split steps
(download, uncompress, configure, compile, install) while still
having correct dependencies.</p>
- <p>Lines 20-31 defines a target and associated rules that
+ <p>Lines 21-32 defines a target and associated rules that
configures the software. It depends on the previous target (the
hidden <code>.source</code> file) so that we are sure the software has
been uncompressed. In order to configure it, it basically runs the
filesystem. Finally it creates a <code>.configured</code> file to
mark the software as configured.</p>
- <p>Lines 33-34 defines a target and a rule that compiles the
+ <p>Lines 34-35 defines a target and a rule that compiles the
software. This target will create the binary file in the
compilation directory, and depends on the software being already
configured (hence the reference to the <code>.configured</code>
file). It basically runs <code>make</code> inside the source
directory.</p>
- <p>Lines 36-40 defines a target and associated rules that create
+ <p>Lines 37-41 defines a target and associated rules that create
the <i>ipkg</i> package which can optionally be embedded into
the resulting firmware image. It depends on the binary file in
the source directory, to make sure the software has been compiled.
removed to save space.
Finally <code>IPKG_BUILD</code> is called to create the package.</p>
- <p>Line 42 and 43 define the installation target of your package,
+ <p>Line 43 and 44 define the installation target of your package,
which will embed the software into the target filesystem.</p>
- <p>Lines 45-50 define the main targets that the Makefile in the
+ <p>Lines 46-51 define the main targets that the Makefile in the
<code>package</code> dir calls.
<ul>
<li><code>prepare</code> : Download and unpack the source</li>