123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- // -*- mode:doc; -*-
- // vim: set syntax=asciidoc:
- === 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:
- +x11r7+, +qt5+ and +gstreamer+. If your package fits in
- one of these categories, then create your package directory in these.
- New subdirectories are discouraged, however.
- === Config files
- For the package to be displayed in the configuration tool, you need to
- create a Config file in your package directory. There are two types:
- +Config.in+ and +Config.in.host+.
- ==== +Config.in+ file
- For packages used on the target, 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. The help text
- should be wrapped.
- http://foosoftware.org/libfoo/
- ---------------------------
- The +bool+ line, +help+ line and other metadata information about the
- configuration option must be indented with one tab. The help text
- itself should be indented with one tab and two spaces, lines should
- be wrapped to fit 72 columns, where tab counts for 8, so 62 characters
- in the text itself. The help text must mention the upstream URL of the
- project after an empty line.
- As a convention specific to Buildroot, the ordering of the attributes
- is as follows:
- 1. The type of option: +bool+, +string+... with the prompt
- 2. If needed, the +default+ value(s)
- 3. Any dependency of the +depends on+ form
- 4. Any dependency of the +select+ form
- 5. The help keyword and help text.
- 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"
- --------------------------
- ==== +Config.in.host+ file
- Some packages also need to be built for the host system. There are two
- options here:
- * The host package is only required to satisfy build-time
- dependencies of one or more target packages. In this case, add
- +host-foo+ to the target package's +BAR_DEPENDENCIES+ variable. No
- +Config.in.host+ file should be created.
- * The host package should be explicitly selectable by the user from
- the configuration menu. In this case, create a +Config.in.host+ file
- for that host package:
- +
- ---------------------------
- config BR2_PACKAGE_HOST_FOO
- bool "host foo"
- help
- This is a comment that explains what foo for the host is.
- http://foosoftware.org/foo/
- ---------------------------
- +
- The same coding style and options as for the +Config.in+ file are valid.
- +
- Finally you have to add your new +libfoo/Config.in.host+ to
- +package/Config.in.host+. The files included there are 'sorted alphabetically'
- and are 'NOT' supposed to contain anything but the 'bare' name of the package.
- +
- --------------------------
- source "package/foo/Config.in.host"
- --------------------------
- +
- The host package will then be available from the +Host utilities+ menu.
- [[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 expresses 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 target architecture, MMU support and
- toolchain options (see xref:dependencies-target-toolchain-options[]),
- or for dependencies on "big" things, such as the X.org system.
- The +depends on+ keyword expresses 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_RRDTOOL
- bool "rrdtool"
- depends on BR2_USE_WCHAR
- select BR2_PACKAGE_FREETYPE
- select BR2_PACKAGE_LIBART
- select BR2_PACKAGE_LIBPNG
- select BR2_PACKAGE_ZLIB
- help
- RRDtool is the OpenSource industry standard, high performance
- data logging and graphing system for time series data.
- http://oss.oetiker.ch/rrdtool/
- comment "rrdtool needs a toolchain w/ wchar"
- depends on !BR2_USE_WCHAR
- --------------------------
- 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].
- [[dependencies-target-toolchain-options]]
- ==== Dependencies on target and toolchain options
- Many packages depend on certain options of the toolchain: the choice of
- C library, C++ support, thread support, RPC support, wchar support,
- or dynamic library support. Some packages can only be built on certain
- target architectures, or if an MMU is available in the processor.
- These dependencies have to be expressed with the appropriate 'depends
- on' statements in the Config.in file. Additionally, for dependencies on
- toolchain options, a +comment+ should be displayed when the option is
- not enabled, so that the user knows why the package is not available.
- Dependencies on target architecture or MMU support should not be
- made visible in a comment: since it is unlikely that the user can
- freely choose another target, it makes little sense to show these
- dependencies explicitly.
- The +comment+ should only be visible if the +config+ option itself would
- be visible when the toolchain option dependencies are met. This means
- that all other dependencies of the package (including dependencies on
- target architecture and MMU support) have to be repeated on the
- +comment+ definition. To keep it clear, the +depends on+ statement for
- these non-toolchain option should be kept separate from the +depends on+
- statement for the toolchain options.
- If there is a dependency on a config option in that same file (typically
- the main package) it is preferable to have a global +if ... endif+
- construct rather than repeating the +depends on+ statement on the
- comment and other config options.
- The general format of a dependency +comment+ for package foo is:
- --------------------------
- foo needs a toolchain w/ featA, featB, featC
- --------------------------
- for example:
- --------------------------
- mpd needs a toolchain w/ C++, threads, wchar
- --------------------------
- or
- --------------------------
- crda needs a toolchain w/ threads
- --------------------------
- Note that this text is kept brief on purpose, so that it will fit on a
- 80-character terminal.
- The rest of this section enumerates the different target and toolchain
- options, the corresponding config symbols to depend on, and the text to
- use in the comment.
- * Target architecture
- ** Dependency symbol: +BR2_powerpc+, +BR2_mips+, ... (see +arch/Config.in+)
- ** Comment string: no comment to be added
- * MMU support
- ** Dependency symbol: +BR2_USE_MMU+
- ** Comment string: no comment to be added
- * Gcc +__sync_*+ built-ins used for atomic operations. They are
- available in variants operating on 1 byte, 2 bytes, 4 bytes and 8
- bytes. Since different architectures support atomic operations on
- different sizes, one dependency symbol is available for each size:
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_SYNC_1+ for 1 byte,
- +BR2_TOOLCHAIN_HAS_SYNC_2+ for 2 bytes,
- +BR2_TOOLCHAIN_HAS_SYNC_4+ for 4 bytes, +BR2_TOOLCHAIN_HAS_SYNC_8+
- for 8 bytes.
- ** Comment string: no comment to be added
- * Gcc +__atomic_*+ built-ins used for atomic operations.
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_ATOMIC+.
- ** Comment string: no comment to be added
- * Kernel headers
- ** Dependency symbol: +BR2_TOOLCHAIN_HEADERS_AT_LEAST_X_Y+, (replace
- +X_Y+ with the proper version, see +toolchain/Config.in+)
- ** Comment string: +headers >= X.Y+ and/or `headers <= X.Y` (replace
- +X.Y+ with the proper version)
- * GCC version
- ** Dependency symbol: +BR2_TOOLCHAIN_GCC_AT_LEAST_X_Y+, (replace
- +X_Y+ with the proper version, see +toolchain/Config.in+)
- ** Comment string: +gcc >= X.Y+ and/or `gcc <= X.Y` (replace
- +X.Y+ with the proper version)
- * Host GCC version
- ** Dependency symbol: +BR2_HOST_GCC_AT_LEAST_X_Y+, (replace
- +X_Y+ with the proper version, see +Config.in+)
- ** Comment string: no comment to be added
- ** Note that it is usually not the package itself that has a minimum
- host GCC version, but rather a host-package on which it depends.
- * C library
- ** Dependency symbol: +BR2_TOOLCHAIN_USES_GLIBC+,
- +BR2_TOOLCHAIN_USES_MUSL+, +BR2_TOOLCHAIN_USES_UCLIBC+
- ** Comment string: for the C library, a slightly different comment text
- is used: +foo needs a glibc toolchain+, or `foo needs a glibc
- toolchain w/ C++`
- * C++ support
- ** Dependency symbol: +BR2_INSTALL_LIBSTDCPP+
- ** Comment string: `C++`
- * Fortran support
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_FORTRAN+
- ** Comment string: `fortran`
- * thread support
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_THREADS+
- ** Comment string: +threads+ (unless +BR2_TOOLCHAIN_HAS_THREADS_NPTL+
- is also needed, in which case, specifying only +NPTL+ is sufficient)
- * NPTL thread support
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_THREADS_NPTL+
- ** Comment string: +NPTL+
- * RPC support
- ** Dependency symbol: +BR2_TOOLCHAIN_HAS_NATIVE_RPC+
- ** Comment string: +RPC+
- * wchar support
- ** Dependency symbol: +BR2_USE_WCHAR+
- ** Comment string: +wchar+
- * dynamic library
- ** Dependency symbol: +!BR2_STATIC_LIBS+
- ** Comment string: +dynamic library+
- ==== Dependencies on a Linux kernel built by buildroot
- Some packages need a Linux kernel to be built by buildroot. These are
- typically kernel modules or firmware. A comment should be added in the
- Config.in file to express this dependency, similar to dependencies on
- toolchain options. The general format is:
- --------------------------
- foo needs a Linux kernel to be built
- --------------------------
- If there is a dependency on both toolchain options and the Linux
- kernel, use this format:
- --------------------------
- foo needs a toolchain w/ featA, featB, featC and a Linux kernel to be built
- --------------------------
- ==== Dependencies on udev /dev management
- If a package needs udev /dev management, it should depend on symbol
- +BR2_PACKAGE_HAS_UDEV+, and the following comment should be added:
- --------------------------
- foo needs udev /dev management
- --------------------------
- If there is a dependency on both toolchain options and udev /dev
- management, use this format:
- --------------------------
- foo needs udev /dev management and a toolchain w/ featA, featB, featC
- --------------------------
- ==== Dependencies on features provided by virtual packages
- Some features can be provided by more than one package, such as the
- openGL libraries.
- See xref:virtual-package-tutorial[] for more on the virtual packages.
- === The +.mk+ file
- [[adding-packages-mk]]
- 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 and installation 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].
- * *Makefiles for Python modules*: We have a dedicated infrastructure
- for Python modules that use either the +distutils+ or the
- +setuptools+ mechanism. We cover them through a
- xref:python-package-tutorial[tutorial] and a
- xref:python-package-reference[reference].
- * *Makefiles for Lua modules*: We have a dedicated infrastructure for
- Lua modules available through the LuaRocks web site. We cover them
- through a xref:luarocks-package-tutorial[tutorial] and a
- xref:luarocks-package-reference[reference].
- Further formatting details: see xref:writing-rules-mk[the writing
- rules].
- [[adding-packages-hash]]
- === The +.hash+ file
- When possible, you must add a third file, named +libfoo.hash+, that
- contains the hashes of the downloaded files for the +libfoo+
- package. The only reason for not adding a +.hash+ file is when hash
- checking is not possible due to how the package is downloaded.
- The hashes stored in that file are used to validate the integrity of the
- downloaded files and of the license files.
- The format of this file is one line for each file for which to check the
- hash, each line being space-separated, with these three fields:
- * the type of hash, one of:
- ** +md5+, +sha1+, +sha224+, +sha256+, +sha384+, +sha512+, +none+
- * the hash of the file:
- ** for +none+, one or more non-space chars, usually just the string +xxx+
- ** for +md5+, 32 hexadecimal characters
- ** for +sha1+, 40 hexadecimal characters
- ** for +sha224+, 56 hexadecimal characters
- ** for +sha256+, 64 hexadecimal characters
- ** for +sha384+, 96 hexadecimal characters
- ** for +sha512+, 128 hexadecimal characters
- * the name of the file:
- ** for a source archive: the basename of the file, without any directory
- component,
- ** for a license file: the path as it appears in +FOO_LICENSE_FILES+.
- Lines starting with a +#+ sign are considered comments, and ignored. Empty
- lines are ignored.
- There can be more than one hash for a single file, each on its own line. In
- this case, all hashes must match.
- .Note
- Ideally, the hashes stored in this file should match the hashes published by
- upstream, e.g. on their website, in the e-mail announcement... If upstream
- provides more than one type of hash (e.g. +sha1+ and +sha512+), then it is
- best to add all those hashes in the +.hash+ file. If upstream does not
- provide any hash, or only provides an +md5+ hash, then compute at least one
- strong hash yourself (preferably +sha256+, but not +md5+), and mention
- this in a comment line above the hashes.
- .Note
- The hashes for license files are used to detect a license change when a
- package version is bumped. The hashes are checked during the make legal-info
- target run. For a package with multiple versions (like Qt5),
- create the hash file in a subdirectory +<packageversion>+ of that package
- (see also xref:patch-apply-order[]).
- .Note
- The number of spaces does not matter, so one can use spaces (or tabs) to
- properly align the different fields.
- The +none+ hash type is reserved to those archives downloaded from a
- repository, like a 'git clone', a 'subversion checkout'...
- The example below defines a +sha1+ and a +sha256+ published by upstream for
- the main +libfoo-1.2.3.tar.bz2+ tarball, an +md5+ from upstream and a
- locally-computed +sha256+ hashes for a binary blob, a +sha256+ for a
- downloaded patch, and an archive with no hash:
- ----
- # Hashes from: http://www.foosoftware.org/download/libfoo-1.2.3.tar.bz2.{sha1,sha256}:
- sha1 486fb55c3efa71148fe07895fd713ea3a5ae343a libfoo-1.2.3.tar.bz2
- sha256 efc8103cc3bcb06bda6a781532d12701eb081ad83e8f90004b39ab81b65d4369 libfoo-1.2.3.tar.bz2
- # md5 from: http://www.foosoftware.org/download/libfoo-1.2.3.tar.bz2.md5, sha256 locally computed:
- md5 2d608f3c318c6b7557d551a5a09314f03452f1a1 libfoo-data.bin
- sha256 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b libfoo-data.bin
- # Locally computed:
- sha256 ff52101fb90bbfc3fe9475e425688c660f46216d7e751c4bbdb1dc85cdccacb9 libfoo-fix-blabla.patch
- # No hash for 1234:
- none xxx libfoo-1234.tar.gz
- # Hash for license files:
- sha256 a45a845012742796534f7e91fe623262ccfb99460a2bd04015bd28d66fba95b8 COPYING
- sha256 01b1f9f2c8ee648a7a596a1abe8aa4ed7899b1c9e5551bda06da6e422b04aa55 doc/COPYING.LGPL
- ----
- If the +.hash+ file is present, and it contains one or more hashes for a
- downloaded file, the hash(es) computed by Buildroot (after download) must
- match the hash(es) stored in the +.hash+ file. If one or more hashes do
- not match, Buildroot considers this an error, deletes the downloaded file,
- and aborts.
- If the +.hash+ file is present, but it does not contain a hash for a
- downloaded file, Buildroot considers this an error and aborts. However,
- the downloaded file is left in the download directory since this
- typically indicates that the +.hash+ file is wrong but the downloaded
- file is probably OK.
- Hashes are currently checked for files fetched from http/ftp servers,
- Git repositories, files copied using scp and local files. Hashes are
- not checked for other version control systems (such as Subversion,
- CVS, etc.) because Buildroot currently does not generate reproducible
- tarballs when source code is fetched from such version control
- systems.
- Hashes should only be added in +.hash+ files for files that are
- guaranteed to be stable. For example, patches auto-generated by Github
- are not guaranteed to be stable, and therefore their hashes can change
- over time. Such patches should not be downloaded, and instead be added
- locally to the package folder.
- If the +.hash+ file is missing, then no check is done at all.
|