123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- [[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.
|