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