adding-packages-directory.txt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // -*- mode:doc; -*-
  2. Package directory
  3. ~~~~~~~~~~~~~~~~~
  4. First of all, create a directory under the +package+ directory for
  5. your software, for example +libfoo+.
  6. Some packages have been grouped by topic in a sub-directory:
  7. +multimedia+, +java+, +x11r7+, and +games+. If your package fits in
  8. one of these categories, then create your package directory in these.
  9. +Config.in+ file
  10. ^^^^^^^^^^^^^^^^
  11. Then, create a file named +Config.in+. This file will contain the
  12. option descriptions related to our +libfoo+ software that will be used
  13. and displayed in the configuration tool. It should basically contain:
  14. ---------------------------
  15. config BR2_PACKAGE_LIBFOO
  16. bool "libfoo"
  17. help
  18. This is a comment that explains what libfoo is.
  19. http://foosoftware.org/libfoo/
  20. ---------------------------
  21. The +bool+ line, +help+ line and other meta-informations about the
  22. configuration option must be indented with one tab. The help text
  23. itself should be indented with one tab and two spaces, and it must
  24. mention the upstream URL of the project.
  25. Of course, you can add other sub-options into a +if
  26. BR2_PACKAGE_LIBFOO...endif+ statement to configure particular things
  27. in your software. You can look at examples in other packages. The
  28. syntax of the +Config.in+ file is the same as the one for the kernel
  29. Kconfig file. The documentation for this syntax is available at
  30. http://lxr.free-electrons.com/source/Documentation/kbuild/kconfig-language.txt[]
  31. Finally you have to add your new +libfoo/Config.in+ to
  32. +package/Config.in+ (or in a category subdirectory if you decided to
  33. put your package in one of the existing categories). The files
  34. included there are 'sorted alphabetically' per category and are 'NOT'
  35. supposed to contain anything but the 'bare' name of the package.
  36. --------------------------
  37. source "package/libfoo/Config.in"
  38. --------------------------
  39. The +Config.in+ file of your package must also ensure that
  40. dependencies are enabled. Typically, Buildroot uses the following
  41. rules:
  42. * Use a +select+ type of dependency for dependencies on
  43. libraries. These dependencies are generally not obvious and it
  44. therefore make sense to have the kconfig system ensure that the
  45. dependencies are selected. For example, the _libgtk2_ package uses
  46. +select BR2_PACKAGE_LIBGLIB2+ to make sure this library is also
  47. enabled.
  48. * Use a +depends on+ type of dependency when the user really needs to
  49. be aware of the dependency. Typically, Buildroot uses this type of
  50. dependency for dependencies on toolchain options (large file
  51. support, RPC support, IPV6 support), or for dependencies on "big"
  52. things, such as the X.org system. In some cases, especially
  53. dependency on toolchain options, it is recommended to add a
  54. +comment+ displayed when the option is not enabled, so that the user
  55. knows why the package is not available.
  56. An example illustrates both the usage of +select+ and +depends on+.
  57. --------------------------
  58. config BR2_PACKAGE_ACL
  59. bool "acl"
  60. select BR2_PACKAGE_ATTR
  61. depends on BR2_LARGEFILE
  62. help
  63. POSIX Access Control Lists, which are used to define more
  64. fine-grained discretionary access rights for files and
  65. directories.
  66. This package also provides libacl.
  67. http://savannah.nongnu.org/projects/acl
  68. comment "acl requires a toolchain with LARGEFILE support"
  69. depends on !BR2_LARGEFILE
  70. --------------------------
  71. Note that these two dependency types are only transitive with the
  72. dependencies of the same kind.
  73. This means, in the following example:
  74. --------------------------
  75. config BR2_PACKAGE_A
  76. bool "Package A"
  77. config BR2_PACKAGE_B
  78. bool "Package B"
  79. depends on BR2_PACKAGE_A
  80. config BR2_PACKAGE_C
  81. bool "Package C"
  82. depends on BR2_PACKAGE_B
  83. config BR2_PACKAGE_D
  84. bool "Package D"
  85. select BR2_PACKAGE_B
  86. config BR2_PACKAGE_E
  87. bool "Package E"
  88. select BR2_PACKAGE_D
  89. --------------------------
  90. * Selecting +Package C+ will be visible if +Package B+ has been
  91. selected, which in turn is only visible if +Package A+ has been
  92. selected.
  93. * Selecting +Package E+ will select +Package D+, which will select
  94. +Package B+, it will not check for the dependencies of +Package B+,
  95. so it will not select +Package A+.
  96. * Since +Package B+ is selected but +Package A+ is not, this violates
  97. the dependency of +Package B+ on +Package A+. Therefore, in such a
  98. situation, the transitive dependency has to be added explicitly:
  99. --------------------------
  100. config BR2_PACKAGE_D
  101. bool "Package D"
  102. select BR2_PACKAGE_B
  103. depends on BR2_PACKAGE_A
  104. config BR2_PACKAGE_E
  105. bool "Package E"
  106. select BR2_PACKAGE_D
  107. depends on BR2_PACKAGE_A
  108. --------------------------
  109. Overall, for package library dependencies, +select+ should be
  110. preferred.
  111. Note that such dependencies will make sure that the dependency option
  112. is also enabled, but not necessarily built before your package. To do
  113. so, the dependency also needs to be expressed in the +.mk+ file of the
  114. package.
  115. The +.mk+ file
  116. ^^^^^^^^^^^^^^
  117. Finally, here's the hardest part. Create a file named +libfoo.mk+. It
  118. describes how the package should be downloaded, configured, built,
  119. installed, etc.
  120. Depending on the package type, the +.mk+ file must be written in a
  121. different way, using different infrastructures:
  122. * *Makefiles for generic packages* (not using autotools or CMake):
  123. These are based on an infrastructure similar to the one used for
  124. autotools-based packages, but requires a little more work from the
  125. developer. They specify what should be done for the configuration,
  126. compilation, installation and cleanup of the package. This
  127. infrastructure must be used for all packages that do not use the
  128. autotools as their build system. In the future, other specialized
  129. infrastructures might be written for other build systems. We cover
  130. them through in a xref:generic-package-tutorial[tutorial] and a
  131. xref:generic-package-reference[reference].
  132. * *Makefiles for autotools-based software* (autoconf, automake, etc.):
  133. We provide a dedicated infrastructure for such packages, since
  134. autotools is a very common build system. This infrastructure 'must'
  135. be used for new packages that rely on the autotools as their build
  136. system. We cover them through a xref:autotools-package-tutorial[tutorial]
  137. and xref:autotools-package-reference[reference].
  138. * *Makefiles for cmake-based software*: We provide a dedicated
  139. infrastructure for such packages, as CMake is a more and more
  140. commonly used build system and has a standardized behaviour. This
  141. infrastructure 'must' be used for new packages that rely on
  142. CMake. We cover them through a xref:cmake-package-tutorial[tutorial]
  143. and xref:cmake-package-reference[reference].
  144. * *Hand-written Makefiles:* These are currently obsolete, and no new
  145. manual Makefiles should be added. However, since there are still
  146. many of them in the tree, we keep them documented in a
  147. xref:handwritten-tutorial[tutorial].