168 lines
7.1 KiB
Plaintext
168 lines
7.1 KiB
Plaintext
|
[[handwritten-tutorial]]
|
||
|
|
||
|
Manual Makefile
|
||
|
---------------
|
||
|
|
||
|
*NOTE: new manual makefiles should not be created, and existing manual
|
||
|
makefiles should be converted either to the generic, autotools or
|
||
|
cmake infrastructure. This section is only kept to document the
|
||
|
existing manual makefiles and to help understand how they work.*
|
||
|
|
||
|
------------------------
|
||
|
01: #############################################################
|
||
|
02: #
|
||
|
03: # libfoo
|
||
|
04: #
|
||
|
05: #############################################################
|
||
|
06: LIBFOO_VERSION:=1.0
|
||
|
07: LIBFOO_SOURCE:=libfoo-$(LIBFOO_VERSION).tar.gz
|
||
|
08: LIBFOO_SITE:=http://www.foosoftware.org/downloads
|
||
|
09: LIBFOO_DIR:=$(BUILD_DIR)/foo-$(FOO_VERSION)
|
||
|
10: LIBFOO_BINARY:=foo
|
||
|
11: LIBFOO_TARGET_BINARY:=usr/bin/foo
|
||
|
12:
|
||
|
13: $(DL_DIR)/$(LIBFOO_SOURCE):
|
||
|
14: $(call DOWNLOAD,$(LIBFOO_SITE),$(LIBFOO_SOURCE))
|
||
|
15:
|
||
|
16: $(LIBFOO_DIR)/.source: $(DL_DIR)/$(LIBFOO_SOURCE)
|
||
|
17: $(ZCAT) $(DL_DIR)/$(LIBFOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||
|
18: touch $@
|
||
|
19:
|
||
|
20: $(LIBFOO_DIR)/.configured: $(LIBFOO_DIR)/.source
|
||
|
21: (cd $(LIBFOO_DIR); rm -rf config.cache; \
|
||
|
22: $(TARGET_CONFIGURE_OPTS) \
|
||
|
23: $(TARGET_CONFIGURE_ARGS) \
|
||
|
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 $@
|
||
|
32:
|
||
|
33: $(LIBFOO_DIR)/$(LIBFOO_BINARY): $(LIBFOO_DIR)/.configured
|
||
|
34: $(MAKE) CC=$(TARGET_CC) -C $(LIBFOO_DIR)
|
||
|
35:
|
||
|
36: $(TARGET_DIR)/$(LIBFOO_TARGET_BINARY): $(LIBFOO_DIR)/$(LIBFOO_BINARY)
|
||
|
37: $(MAKE) DESTDIR=$(TARGET_DIR) -C $(LIBFOO_DIR) install-strip
|
||
|
38: rm -Rf $(TARGET_DIR)/usr/man
|
||
|
39:
|
||
|
40: libfoo: uclibc ncurses $(TARGET_DIR)/$(LIBFOO_TARGET_BINARY)
|
||
|
41:
|
||
|
42: libfoo-source: $(DL_DIR)/$(LIBFOO_SOURCE)
|
||
|
43:
|
||
|
44: libfoo-clean:
|
||
|
45: $(MAKE) prefix=$(TARGET_DIR)/usr -C $(LIBFOO_DIR) uninstall
|
||
|
46: -$(MAKE) -C $(LIBFOO_DIR) clean
|
||
|
47:
|
||
|
48: libfoo-dirclean:
|
||
|
49: rm -rf $(LIBFOO_DIR)
|
||
|
50:
|
||
|
51: #############################################################
|
||
|
52: #
|
||
|
53: # Toplevel Makefile options
|
||
|
54: #
|
||
|
55: #############################################################
|
||
|
56: ifeq ($(BR2_PACKAGE_LIBFOO),y)
|
||
|
57: TARGETS+=libfoo
|
||
|
58: endif
|
||
|
------------------------
|
||
|
|
||
|
First of all, this Makefile example works for a package which
|
||
|
comprises a single binary executable. For other software, such as
|
||
|
libraries or more complex stuff with multiple binaries, it must be
|
||
|
qqadapted. For examples look at the other +*.mk+ files in the
|
||
|
+package+ directory.
|
||
|
|
||
|
At lines 6-11, a couple of useful variables are defined:
|
||
|
|
||
|
* +LIBFOO_VERSION+: The version of 'libfoo' that should be downloaded.
|
||
|
|
||
|
* +LIBFOO_SOURCE+: The name of the tarball of 'libfoo' on the download
|
||
|
website or FTP site. As you can see +LIBFOO_VERSION+ is used.
|
||
|
|
||
|
* +LIBFOO_SITE+: The HTTP or FTP site from which 'libfoo' archive is
|
||
|
downloaded. It must include the complete path to the directory where
|
||
|
+LIBFOO_SOURCE+ can be found.
|
||
|
|
||
|
* +LIBFOO_DIR+: The directory into which the software will be
|
||
|
configured and compiled. Basically, it's a subdirectory of
|
||
|
+BUILD_DIR+ which is created upon decompression of the tarball.
|
||
|
|
||
|
* +LIBFOO_BINARY+: Software binary name. As said previously, this is
|
||
|
an example for a package with a single binary.
|
||
|
|
||
|
* +LIBFOO_TARGET_BINARY+: The full path of the binary inside the
|
||
|
target filesystem. Lines 13-14 define a target that downloads the
|
||
|
tarball from the remote site to the download directory (+DL_DIR+).
|
||
|
|
||
|
Lines 16-18 define 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 (lines 13-14) is called before
|
||
|
executing the rules of the current target. Uncompressing is followed
|
||
|
by 'touching' a hidden file to mark the software as having been
|
||
|
uncompressed. This trick is used everywhere in a Buildroot Makefile to
|
||
|
split steps (download, uncompress, configure, compile, install) while
|
||
|
still having correct dependencies.
|
||
|
|
||
|
Lines 20-31 define a target and associated rules that configure the
|
||
|
software. It depends on the previous target (the hidden +.source+
|
||
|
file) so that we are sure the software has been uncompressed. In order
|
||
|
to configure the package, it basically runs the well-known
|
||
|
+./configure+ script. As we may be doing cross-compilation, +target+,
|
||
|
+host+ and +build+ arguments are given. The prefix is also set to
|
||
|
+/usr+, not because the software will be installed in +/usr+ on your
|
||
|
host system, but because the software will be installed in + /usr+ on
|
||
|
the target filesystem. Finally it creates a +.configured+ file to mark
|
||
|
the software as configured.
|
||
|
|
||
|
Lines 33-34 define a target and a rule that compile 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 +.configured+ file). It basically runs +make+ inside the
|
||
|
source directory.
|
||
|
|
||
|
Lines 36-38 define a target and associated rules that install the
|
||
|
software inside the target filesystem. They depend on the binary file
|
||
|
in the source directory to make sure the software has been
|
||
|
compiled. They use the +install-strip+ target of the software
|
||
|
+Makefile+ by passing a +DESTDIR+ argument so that the +Makefile+
|
||
|
doesn't try to install the software in the host +/usr+ but rather in
|
||
|
the target +/usr+. After the installation, the +/usr/man + directory
|
||
|
inside the target filesystem is removed to save space.
|
||
|
|
||
|
Line 40 defines the main target of the software — the one that
|
||
|
will eventually be used by the top level +Makefile+ to download,
|
||
|
compile, and then install this package. This target should first of
|
||
|
all depend on all needed dependencies of the software (in our example,
|
||
|
'uclibc' and 'ncurses') and also depend on the final binary. This last
|
||
|
dependency will call all previous dependencies in the correct order.
|
||
|
|
||
|
Line 42 defines a simple target that only downloads the code
|
||
|
source. This is not used during normal operation of Buildroot, but is
|
||
|
needed if you intend to download all required sources at once for
|
||
|
later offline build. Note that if you add a new package, providing a
|
||
|
+libfoo-source+ target is 'mandatory' to support users that wish to do
|
||
|
offline-builds. Furthermore, it eases checking if all package-sources
|
||
|
are downloadable.
|
||
|
|
||
|
Lines 44-46 define a simple target to clean the software build by
|
||
|
calling the Makefile with the appropriate options. The +-clean+
|
||
|
target should run +make clean+ on $(BUILD_DIR)/package-version and
|
||
|
MUST uninstall all files of the package from $(STAGING_DIR) and from
|
||
|
$(TARGET_DIR).
|
||
|
|
||
|
Lines 48-49 define a simple target to completely remove the directory
|
||
|
in which the software was uncompressed, configured and compiled. The
|
||
|
+-dirclean+ target MUST completely rm $(BUILD_DIR)/ package-version.
|
||
|
|
||
|
Lines 51-58 add the target +libfoo+ to the list of targets to be
|
||
|
compiled by Buildroot, by first checking if the configuration option
|
||
|
for this package has been enabled using the configuration tool. If so,
|
||
|
it then "subscribes" this package to be compiled by adding
|
||
|
the package to the TARGETS global variable. The name added to the
|
||
|
TARGETS global variable is the name of this package's target, as
|
||
|
defined on line 40, which is used by Buildroot to download, compile,
|
||
|
and then install this package.
|