summaryrefslogtreecommitdiff
path: root/docs/manual/adding-packages-handwritten.txt
diff options
context:
space:
mode:
Diffstat (limited to 'docs/manual/adding-packages-handwritten.txt')
-rw-r--r--docs/manual/adding-packages-handwritten.txt167
1 files changed, 167 insertions, 0 deletions
diff --git a/docs/manual/adding-packages-handwritten.txt b/docs/manual/adding-packages-handwritten.txt
new file mode 100644
index 000000000..a9d247ca8
--- /dev/null
+++ b/docs/manual/adding-packages-handwritten.txt
@@ -0,0 +1,167 @@
+[[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.