123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- // -*- mode:doc; -*-
- Package directory
- ~~~~~~~~~~~~~~~~~
- First of all, create a directory under the +package+ directory for
- your software, for example +libfoo+.
- Some packages have been grouped by topic in a sub-directory:
- +multimedia+, +x11r7+, +efl+ and +matchbox+. If your package fits in
- one of these categories, then create your package directory in these.
- New subdirectories are discouraged, however.
- +Config.in+ file
- ~~~~~~~~~~~~~~~~
- Then, create a file named +Config.in+. This file will contain the
- option descriptions related to our +libfoo+ software that will be used
- and displayed in the configuration tool. It should basically contain:
- ---------------------------
- config BR2_PACKAGE_LIBFOO
- bool "libfoo"
- help
- This is a comment that explains what libfoo is.
- http://foosoftware.org/libfoo/
- ---------------------------
- The +bool+ line, +help+ line and other meta-informations about the
- configuration option must be indented with one tab. The help text
- itself should be indented with one tab and two spaces, and it must
- mention the upstream URL of the project.
- You can add other sub-options into a +if
- BR2_PACKAGE_LIBFOO...endif+ statement to configure particular things
- in your software. You can look at examples in other packages. The
- syntax of the +Config.in+ file is the same as the one for the kernel
- Kconfig file. The documentation for this syntax is available at
- http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt[]
- Finally you have to add your new +libfoo/Config.in+ to
- +package/Config.in+ (or in a category subdirectory if you decided to
- put your package in one of the existing categories). The files
- included there are 'sorted alphabetically' per category and are 'NOT'
- supposed to contain anything but the 'bare' name of the package.
- --------------------------
- source "package/libfoo/Config.in"
- --------------------------
- [[depends-on-vs-select]]
- Choosing +depends on+ or +select+
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The +Config.in+ file of your package must also ensure that
- dependencies are enabled. Typically, Buildroot uses the following
- rules:
- * Use a +select+ type of dependency for dependencies on
- libraries. These dependencies are generally not obvious and it
- therefore make sense to have the kconfig system ensure that the
- dependencies are selected. For example, the _libgtk2_ package uses
- +select BR2_PACKAGE_LIBGLIB2+ to make sure this library is also
- enabled.
- The +select+ keyword express the dependency with a backward
- semantic.
- * Use a +depends on+ type of dependency when the user really needs to
- be aware of the dependency. Typically, Buildroot uses this type of
- dependency for dependencies on toolchain options (target
- architecture, MMU support, C library, C++ support, large file
- support, thread support, RPC support, IPV6 support, WCHAR support),
- or for dependencies on "big" things, such as the X.org system. For
- dependencies on toolchain options, there should be a +comment+ that
- is displayed when the option is not
- enabled, so that the user knows why the package is not available.
- The +depends on+ keyword express the dependency with a forward
- semantic.
- .Note
- The current problem with the _kconfig_ language is that these two
- dependency semantics are not internally linked. Therefore, it may be
- possible to select a package, whom one of its dependencies/requirement
- is not met.
- An example illustrates both the usage of +select+ and +depends on+.
- --------------------------
- config BR2_PACKAGE_ACL
- bool "acl"
- select BR2_PACKAGE_ATTR
- depends on BR2_LARGEFILE
- help
- POSIX Access Control Lists, which are used to define more
- fine-grained discretionary access rights for files and
- directories.
- This package also provides libacl.
- http://savannah.nongnu.org/projects/acl
- comment "acl requires a toolchain with LARGEFILE support"
- depends on !BR2_LARGEFILE
- --------------------------
- Note that these two dependency types are only transitive with the
- dependencies of the same kind.
- This means, in the following example:
- --------------------------
- config BR2_PACKAGE_A
- bool "Package A"
- config BR2_PACKAGE_B
- bool "Package B"
- depends on BR2_PACKAGE_A
- config BR2_PACKAGE_C
- bool "Package C"
- depends on BR2_PACKAGE_B
- config BR2_PACKAGE_D
- bool "Package D"
- select BR2_PACKAGE_B
- config BR2_PACKAGE_E
- bool "Package E"
- select BR2_PACKAGE_D
- --------------------------
- * Selecting +Package C+ will be visible if +Package B+ has been
- selected, which in turn is only visible if +Package A+ has been
- selected.
- * Selecting +Package E+ will select +Package D+, which will select
- +Package B+, it will not check for the dependencies of +Package B+,
- so it will not select +Package A+.
- * Since +Package B+ is selected but +Package A+ is not, this violates
- the dependency of +Package B+ on +Package A+. Therefore, in such a
- situation, the transitive dependency has to be added explicitly:
- --------------------------
- config BR2_PACKAGE_D
- bool "Package D"
- select BR2_PACKAGE_B
- depends on BR2_PACKAGE_A
- config BR2_PACKAGE_E
- bool "Package E"
- select BR2_PACKAGE_D
- depends on BR2_PACKAGE_A
- --------------------------
- Overall, for package library dependencies, +select+ should be
- preferred.
- Note that such dependencies will ensure that the dependency option
- is also enabled, but not necessarily built before your package. To do
- so, the dependency also needs to be expressed in the +.mk+ file of the
- package.
- Further formatting details: see xref:writing-rules-config-in[the
- coding style].
- The +.mk+ file
- ~~~~~~~~~~~~~~
- Finally, here's the hardest part. Create a file named +libfoo.mk+. It
- describes how the package should be downloaded, configured, built,
- installed, etc.
- Depending on the package type, the +.mk+ file must be written in a
- different way, using different infrastructures:
- * *Makefiles for generic packages* (not using autotools or CMake):
- These are based on an infrastructure similar to the one used for
- autotools-based packages, but require a little more work from the
- developer. They specify what should be done for the configuration,
- compilation, installation and cleanup of the package. This
- infrastructure must be used for all packages that do not use the
- autotools as their build system. In the future, other specialized
- infrastructures might be written for other build systems. We cover
- them through in a xref:generic-package-tutorial[tutorial] and a
- xref:generic-package-reference[reference].
- * *Makefiles for autotools-based software* (autoconf, automake, etc.):
- We provide a dedicated infrastructure for such packages, since
- autotools is a very common build system. This infrastructure 'must'
- be used for new packages that rely on the autotools as their build
- system. We cover them through a xref:autotools-package-tutorial[tutorial]
- and xref:autotools-package-reference[reference].
- * *Makefiles for cmake-based software*: We provide a dedicated
- infrastructure for such packages, as CMake is a more and more
- commonly used build system and has a standardized behaviour. This
- infrastructure 'must' be used for new packages that rely on
- CMake. We cover them through a xref:cmake-package-tutorial[tutorial]
- and xref:cmake-package-reference[reference].
- Further formating details: see xref:writing-rules-mk[the writing
- rules].
|