From 1594c3e48ef10512fa4dfc399343fa67c4f32f40 Mon Sep 17 00:00:00 2001
From: Juan RP <xtraeme@gmail.com>
Date: Tue, 31 Dec 2013 07:42:58 +0100
Subject: [PATCH] doc/manual.txt: multiple improvements and tweaks.

---
 doc/manual.txt | 418 +++++++++++++++++++++++++++----------------------
 1 file changed, 229 insertions(+), 189 deletions(-)

diff --git a/doc/manual.txt b/doc/manual.txt
index a8af37c0fd7..347a4661f93 100644
--- a/doc/manual.txt
+++ b/doc/manual.txt
@@ -1,3 +1,5 @@
+// vim: set syntax=asciidoc:
+
 The XBPS source packages manual
 ===============================
 Juan RP <xtraeme@gmail.com>
@@ -8,7 +10,7 @@ Juan RP <xtraeme@gmail.com>
 :website: http://www.voidlinux.eu
 
 This article contains an exhaustive manual of how to create new source
-packages for XBPS, the package manager of the *Void Linux distribution*.
+packages for XBPS, the `Void Linux` native packaging system.
 
 Introduction
 ------------
@@ -80,25 +82,25 @@ Package build phases
 Building a package consist of the following phases:
 
 *fetch*::
-    This phase downloads required sources for a `source package`, as defined by
-    the `distfiles` variable or `do_fetch()` function.
+ This phase downloads required sources for a `source package`, as defined by
+the `distfiles` variable or `do_fetch()` function.
 
 *extract*::
-    This phase extracts the `distfiles` files into `$wrksrc` or executes the `do_extract()`
-    function, which is the directory to be used to compile the `source package`.
+ This phase extracts the `distfiles` files into `$wrksrc` or executes the `do_extract()`
+function, which is the directory to be used to compile the `source package`.
 
 *configure*::
-    This phase executes the `configuration` of a `source package`, i.e `GNU configure scripts`.
+ This phase executes the `configuration` of a `source package`, i.e `GNU configure scripts`.
 
 *build*::
-    This phase compiles/prepares the `source files` via `make` or any other compatible method.
+ This phase compiles/prepares the `source files` via `make` or any other compatible method.
 
 *install-destdir*::
-    This phase installs the `package files` into a `fake destdir`, via `make install` or
-    any other compatible method.
+ This phase installs the `package files` into a `fake destdir`, via `make install` or
+any other compatible method.
 
 *build-pkg*::
-    This phase builds the `binary packages` with files stored in the `package destdir`.
+ This phase builds the `binary packages` with files stored in the `package destdir`.
 
 `xbps-src` supports running just the specified phase, and if it ran
 successfully, the phase will be skipped later (unless its work directory
@@ -111,28 +113,28 @@ The following functions are defined by `xbps-src` and can be used on any templat
 *vinstall()*::
     `vinstall <file> <mode> <targetdir> [<name>]`
 
-    Installs `file` with the specified `mode` into `targetdir` in `$DESTDIR`
-    (if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
-    The optional 4th argument can be used to change the `file name`.
+Installs `file` with the specified `mode` into `targetdir` in `$DESTDIR`
+(if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
+The optional 4th argument can be used to change the `file name`.
 
 *vcopy()*::
     `vcopy <pattern> <targetdir>`
 
-    Copies resursively all files in `pattern` to `targetdir` on `$DESTDIR`
-    (if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
+Copies resursively all files in `pattern` to `targetdir` on `$DESTDIR`
+(if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
 
 *vmove()*::
     `vmove <pattern>`
 
-    Moves `pattern` to the specified directory in `$DESTDIR`
-    (if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
+Moves `pattern` to the specified directory in `$DESTDIR`
+(if called from a `source section`) or `$PKGDESTDIR` (if called from a `package section`).
 
 *vmkdir()*::
     `vmkdir <directory> [<mode>]`
 
-    Creates a directory in `$DESTDIR` (if called from a `source section`) or
-    $PKGDESTDIR` (if called from a `package section`). The 2nd optional argument
-    sets the mode of the directory.
+Creates a directory in `$DESTDIR` (if called from a `source section`) or
+`$PKGDESTDIR` (if called from a `package section`). The 2nd optional argument
+sets the mode of the directory.
 
 NOTE: shell wildcards must be properly quoted.
 
@@ -141,37 +143,37 @@ Global variables
 The following variables are defined by `xbps-src` and can be used on any template:
 
 *makejobs*::
-    Set to `-jX` if `XBPS_MAKEJOBS` is defined, to allow parallel jobs with `GNU make`.
+ Set to `-jX` if `XBPS_MAKEJOBS` is defined, to allow parallel jobs with `GNU make`.
 
 *sourcepkg*::
-    Set to the to main package name, can be used to match the main package
-    rather than additional binary package names.
+ Set to the to main package name, can be used to match the main package
+rather than additional binary package names.
 
 *CHROOT_READY*::
-    True if the target chroot (masterdir) is ready for chroot builds.
+ True if the target chroot (masterdir) is ready for chroot builds.
 
 *CROSS_BUILD*::
-    True if `xbps-src` is cross compiling a package.
+ True if `xbps-src` is cross compiling a package.
 
 *DESTDIR*::
-    Full path to the fake destdir used by the `source section`, set to
-    `${XBPS_MASTERDIR}/destdir/${sourcepkg}-${version}`.
+ Full path to the fake destdir used by the `source section`, set to
+`${XBPS_MASTERDIR}/destdir/${sourcepkg}-${version}`.
 
 *PKGDESTDIR*::
-    Full path to the fake destdir used by the `pkg_install()` function in the
-    `package section`, set to `${XBPS_MASTERDIR}/destdir/pkg-${pkgname}-${version}`.
+ Full path to the fake destdir used by the `pkg_install()` function in the
+`package section`, set to `${XBPS_MASTERDIR}/destdir/pkg-${pkgname}-${version}`.
 
 *XBPS_MACHINE*::
-    The machine architecture as returned by `uname -m`.
+ The machine architecture as returned by `uname -m`.
 
 *XBPS_SRCDISTDIR*::
-    Full path to where the `source distfiles` are stored, i.e `$XBPS_HOSTDIR/sources`.
+ Full path to where the `source distfiles` are stored, i.e `$XBPS_HOSTDIR/sources`.
 
 *XBPS_SRCPKGDIR*::
-    Full path to the `srcpkgs` directory.
+ Full path to the `srcpkgs` directory.
 
 *XBPS_TARGET_MACHINE*::
-    The target machine architecture when cross compiling a package.
+ The target machine architecture when cross compiling a package.
 
 
 Source section
@@ -181,150 +183,151 @@ Mandatory variables
 The list of mandatory variables in the `source section`:
 
 *homepage*::
-    A string pointing to the `upstream` homepage.
+ A string pointing to the `upstream` homepage.
 
 *license*::
-    A string matching any license file available in `/usr/share/licenses`.
-    Multiple licenses should be separated by commas, i.e `GPL-3, LGPL-2.1`.
+ A string matching any license file available in `/usr/share/licenses`.
+Multiple licenses should be separated by commas, i.e `GPL-3, LGPL-2.1`.
 
 *maintainer*::
-    A string in the form of `name <user@domain>`.
+ A string in the form of `name <user@domain>`.
 
 *pkgname*::
-    A string with the package name, matching `srcpkgs/<pkgname>`.
+ A string with the package name, matching `srcpkgs/<pkgname>`.
 
 *revision*::
-    A number that must be set to 1 when the `source package` is created, or
-    updated to a new `upstream version`. This should only be increased when
-    the generated `binary packages` have been modified.
+ A number that must be set to 1 when the `source package` is created, or
+updated to a new `upstream version`. This should only be increased when
+the generated `binary packages` have been modified.
 
 *short_desc*::
-    A string with a brief description for this package. Max 72 chars.
+ A string with a brief description for this package. Max 72 chars.
 
 *version*::
-    A string with the package version. Must not contain dashes and at least
-    one digit is required.
+ A string with the package version. Must not contain dashes and at least
+one digit is required.
 
 
 Optional variables
 ~~~~~~~~~~~~~~~~~~
 *hostmakedepends*::
-    The list of `host` dependencies required to build the package. Dependencies
-    can be specified with the following version comparators: `<`, `>`, `<=`, `>=`
-    or `foo-1.0_1` to match an exact version. If version comparator is not
-    defined (just a package name), the version comparator is automatically set to `>=0`.
-    Example `hostmakedepends="foo blah<1.0"`.
+ The list of `host` dependencies required to build the package. Dependencies
+can be specified with the following version comparators: `<`, `>`, `<=`, `>=`
+or `foo-1.0_1` to match an exact version. If version comparator is not
+defined (just a package name), the version comparator is automatically set to `>=0`.
+Example `hostmakedepends="foo blah<1.0"`.
 
 *makedepends*::
-    The list of `target` dependencies required to build the package. Dependencies
-    can be specified with the following version comparators: `<`, `>`, `<=`, `>=`
-    or `foo-1.0_1` to match an exact version. If version comparator is not
-    defined (just a package name), the version comparator is automatically set to `>=0`.
-    Example `makedepends="foo blah>=1.0"`.
+ The list of `target` dependencies required to build the package. Dependencies
+can be specified with the following version comparators: `<`, `>`, `<=`, `>=`
+or `foo-1.0_1` to match an exact version. If version comparator is not
+defined (just a package name), the version comparator is automatically set to `>=0`.
+Example `makedepends="foo blah>=1.0"`.
 
 *bootstrap*::
-    If enabled the source package is considered to be part of the `bootstrap`
-    process and required to be able to build packages in the chroot. Only a
-    small number of packages must set this property.
+ If enabled the source package is considered to be part of the `bootstrap`
+process and required to be able to build packages in the chroot. Only a
+small number of packages must set this property.
 
 *distfiles*::
-    The full URL to the `upstream` source distribution files. Multiple files
-    can be separated by blanks. The files must end in `.tar.lzma`, `.tar.xz`,
-    `.txz`, `.tar.bz2`, `.tbz`, `.tar.gz`, `.tgz`, `.gz`, `.bz2`, `.tar` or
-    `.zip`. Example `distfiles="http://foo.org/foo-1.0.tar.gz"`
+ The full URL to the `upstream` source distribution files. Multiple files
+can be separated by blanks. The files must end in `.tar.lzma`, `.tar.xz`,
+`.txz`, `.tar.bz2`, `.tbz`, `.tar.gz`, `.tgz`, `.gz`, `.bz2`, `.tar` or
+`.zip`. Example `distfiles="http://foo.org/foo-1.0.tar.gz"`
 
 *checksum*::
-    The `sha256` digests matching `${distfiles}`. Multiple files can be
-    separated by blanks. Please note that the order must be the same than
-    was used in `${distfiles}`. Example `checksum="kkas00xjkjas"`
+ The `sha256` digests matching `${distfiles}`. Multiple files can be
+separated by blanks. Please note that the order must be the same than
+was used in `${distfiles}`. Example `checksum="kkas00xjkjas"`
 
 *long_desc*::
-   A long description of the main package. Max 80 chars per line and must
-   not contain the following characters: `&`, `<`, `>`.
+ A long description of the main package. Max 80 chars per line and must
+not contain the following characters: `&`, `<`, `>`.
 
 *wrksrc*::
-    The directory name where the package sources are extracted, by default
-    set to `${pkgname}-${version}`.
+ The directory name where the package sources are extracted, by default
+set to `${pkgname}-${version}`.
 
 *build_wrksrc*::
-    A directory relative to `${wrksrc}` that will be used when building the package.
+ A directory relative to `${wrksrc}` that will be used when building the package.
 
 *create_wrksrc*::
-    Enable it to create the `${wrksrc}` directory. Required if a package
-    contains multiple `distfiles`.
+ Enable it to create the `${wrksrc}` directory. Required if a package
+contains multiple `distfiles`.
 
 *only_for_archs*::
-    This expects a separated list of architectures where the package can be
-    built matching `uname -m` output. Example `only_for_archs="x86_64 armv6l"`
+ This expects a separated list of architectures where the package can be
+built matching `uname -m` output. Example `only_for_archs="x86_64 armv6l"`
 
 *build_style*::
-    This specifies the `build method` for a package. Read below to know more
-    about the available package `build methods`. If `build_style` is not set,
-    the package must define at least a `do_install()` function, and optionally
-    more build phases as such `do_configure()`, `do_build()`, etc.
+ This specifies the `build method` for a package. Read below to know more
+about the available package `build methods`. If `build_style` is not set,
+the package must define at least a `do_install()` function, and optionally
+ more build phases as such `do_configure()`, `do_build()`, etc.
 
 *create_srcdir*::
-    This creates a directory in `${XBPS_SRCDISTDIR}` as such `${pkgname}-${version}`
-    to store the package sources at the `extract` phase. Required in packages that
-    use unversioned ${distfiles}`.
+ This creates a directory in `${XBPS_SRCDISTDIR}` as such `${pkgname}-${version}`
+to store the package sources at the `extract` phase. Required in packages that
+use unversioned ${distfiles}`.
 
 *configure_script*::
-    The name of the `configure` script to execute at the `configure` phase if
-    `${build_style}` is set to `configure` or `gnu-configure` build methods.
-    By default set to `./configure`.
+ The name of the `configure` script to execute at the `configure` phase if
+`${build_style}` is set to `configure` or `gnu-configure` build methods.
+By default set to `./configure`.
 
 *configure_args*::
-    The arguments to be passed in to the `configure` script if `${build_style}`
-    is set to `configure` or `gnu-configure` build methods. By default, prefix
-    must be set to `/usr`. In `gnu-configure` packages, some options are already
-    set by default: `--prefix=/usr --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --localstatedir=/var`.
+ The arguments to be passed in to the `configure` script if `${build_style}`
+is set to `configure` or `gnu-configure` build methods. By default, prefix
+must be set to `/usr`. In `gnu-configure` packages, some options are already
+set by default: `--prefix=/usr --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --localstatedir=/var`.
 
 *make_cmd*::
-    The executable to run at the `build` phase if `${build_style}` is set to
-    `configure`, `gnu-configure` or `gnu-makefile` build methods.
-    By default set to `make`.
+ The executable to run at the `build` phase if `${build_style}` is set to
+`configure`, `gnu-configure` or `gnu-makefile` build methods.
+By default set to `make`.
 
 *make_build_args*::
-    The arguments to be passed in to `${make_cmd}` at the build phase if
-    `${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
-    build methods. Unset by default.
+ The arguments to be passed in to `${make_cmd}` at the build phase if
+`${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
+build methods. Unset by default.
 
 *make_install_args*::
-    The arguments to be passed in to `${make_cmd}` at the `install-destdir`
-    phase if `${build_style}` is set to `configure`, `gnu-configure` or
-    `gnu_makefile` build methods. Unset by default.
+ The arguments to be passed in to `${make_cmd}` at the `install-destdir`
+phase if `${build_style}` is set to `configure`, `gnu-configure` or
+`gnu_makefile` build methods. By default set to
+`PREFIX=/usr DESTDIR=${DESTDIR}`.
 
 *make_build_target*::
-    The target to be passed in to `${make_cmd}` at the build phase if
-    `${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
-    build methods. Unset by default (`all` target).
+ The target to be passed in to `${make_cmd}` at the build phase if
+`${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
+build methods. Unset by default (`all` target).
 
 *make_install_target*::
-    The target to be passed in to `${make_cmd}` at the `install-destdir` phase
-    if `${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
-    build methods. By default set to `DESTDIR=${DESTDIR} install`.
+ The target to be passed in to `${make_cmd}` at the `install-destdir` phase
+if `${build_style}` is set to `configure`, `gnu-configure` or `gnu_makefile`
+build methods. By default set to `install`.
 
 *patch_args*::
-    The arguments to be passed in to the `patch(1)` command when applying
-    patches to the package sources after `do_extract()`. Patches are stored in
-    `srcpkgs/<pkgname>/patches` and must be in `-p0` format. By default set to `-Np0`.
+ The arguments to be passed in to the `patch(1)` command when applying
+patches to the package sources after `do_extract()`. Patches are stored in
+`srcpkgs/<pkgname>/patches` and must be in `-p0` format. By default set to `-Np0`.
 
 *disable_parallel_build*::
-    If set the package won't be built in parallel and `XBPS_MAKEJOBS` has no effect.
+ If set the package won't be built in parallel and `XBPS_MAKEJOBS` has no effect.
 
 *keep_libtool_archives*::
-    If enabled the `GNU Libtool` archives won't be removed. By default those
-    files are always removed automatically.
+ If enabled the `GNU Libtool` archives won't be removed. By default those
+files are always removed automatically.
 
 *skip_extraction*::
-    A list of filenames that should not be extracted in the `extract` phase.
-    This must match the basename of any url defined in `${distfiles}`.
-    Example `skip_extraction="foo-${version}.tar.gz"`.
+ A list of filenames that should not be extracted in the `extract` phase.
+This must match the basename of any url defined in `${distfiles}`.
+Example `skip_extraction="foo-${version}.tar.gz"`.
 
 *force_debug_pkgs*::
-    If enabled binary packages with debugging symbols will be generated
-    even if `XBPS_DEBUG_PKGS` is disabled in `xbps-src.conf` or in the
-    `command line arguments`.
+ If enabled binary packages with debugging symbols will be generated
+even if `XBPS_DEBUG_PKGS` is disabled in `xbps-src.conf` or in the
+`command line arguments`.
 
 build style scripts
 ~~~~~~~~~~~~~~~~~~~
@@ -336,42 +339,48 @@ to execute a `build_style` script must be defined via `hostmakedepends`.
 The current list of available `build_style` scripts is the following:
 
 *cmake*::
-    For packages that use the CMake build system, configuration arguments
-    can be passed in via `configure_args`.
+ For packages that use the CMake build system, configuration arguments
+can be passed in via `configure_args`.
 
 *configure*::
-    For packages that use non-GNU configure scripts, at least `--prefix=/usr`
-    should be passed in via `configure_args`.
+ For packages that use non-GNU configure scripts, at least `--prefix=/usr`
+should be passed in via `configure_args`.
 
 *gnu-configure*::
-    For packages that use GNU configure scripts, additional configuration
-    arguments can be passed in via `configure_args`.
+ For packages that use GNU configure scripts, additional configuration
+arguments can be passed in via `configure_args`.
 
 *gnu-makefile*::
-    For packages that use GNU make, build arguments can be passed in via
-    `make_build_args` and install arguments via `make_install_args`. The build
-    target can be overriden via `make_build_target` and the install target
+ For packages that use GNU make, build arguments can be passed in via
+`make_build_args` and install arguments via `make_install_args`. The build
+target can be overriden via `make_build_target` and the install target
+via `make_install_target`.
 
 *meta*::
-    For `meta-packages`, i.e packages that only install local files or simply
-    depend on additional packages.
+ For `meta-packages`, i.e packages that only install local files or simply
+depend on additional packages. This build style does not install
+dependencies to the root directory, and only checks if a binary package is
+available in repositories.
 
 *perl-ModuleBuild*::
-    For packages that use the Perl
-    http://search.cpan.org/~leont/Module-Build-0.4202/lib/Module/Build.pm[Module::Build] method.
+ For packages that use the Perl
+http://search.cpan.org/~leont/Module-Build-0.4202/lib/Module/Build.pm[Module::Build] method.
 
 *perl*::
-    For packages that use the Perl
-    http://perldoc.perl.org/ExtUtils/MakeMaker.html[ExtUtils::MakeMaker] build method.
+ For packages that use the Perl
+http://perldoc.perl.org/ExtUtils/MakeMaker.html[ExtUtils::MakeMaker] build method.
 
 *python-module*::
-    For packages that use the Python module build method (setup.py).
+ For packages that use the Python module build method (setup.py).
 
 *waf3*::
-   For packages that use the Python3 `waf` build method with python3.
+ For packages that use the Python3 `waf` build method with python3.
 
 *waf*::
-   For packages that use the Python `waf` method with python2.
+ For packages that use the Python `waf` method with python2.
+
+NOTE: if `build_style` is not set, the template must (at least) define a
+`do_install()` function and optionally more phases via `do_xxx()` functions.
 
 Functions
 ~~~~~~~~~
@@ -379,80 +388,47 @@ The following functions can be defined to change the behavior of how the
 package is downloaded, compiled and installed.
 
 *do_fetch()*::
-    if defined and `distfiles` is not set, use it to fetch the required sources.
+ if defined and `distfiles` is not set, use it to fetch the required sources.
 
 *do_extract()*::
-    if defined and `distfiles` is not set, use it to extract the required sources.
+ if defined and `distfiles` is not set, use it to extract the required sources.
 
 *post_extract()*::
-    Actions to execute after `do_extract()`.
+ Actions to execute after `do_extract()`.
 
 *pre_configure()*::
-    Actions to execute after `post_extract()`.
+ Actions to execute after `post_extract()`.
 
 *do_configure()*::
-    Actions to execute to configure the package; `${configure_args}` should
-    still be passed in if it's a GNU configure script.
+ Actions to execute to configure the package; `${configure_args}` should
+still be passed in if it's a GNU configure script.
 
 *post_configure()*::
-    Actions to execute after `do_configure()`.
+ Actions to execute after `do_configure()`.
 
 *pre_build()*::
-    Actions to execute after `post_configure()`.
+ Actions to execute after `post_configure()`.
 
 *do_build()*::
-    Actions to execute to build the package.
+ Actions to execute to build the package.
 
 *post_build()*::
-    Actions to execute after `do_build()`.
+ Actions to execute after `do_build()`.
 
 *pre_install()*::
-    Actions to execute after `post_build()`.
+ Actions to execute after `post_build()`.
 
 *do_install()*::
-    Actions to execute to install the packages files into the `fake destdir`.
+ Actions to execute to install the packages files into the `fake destdir`.
 
 *post_install()*::
-    Actions to execute after `do_install()`.
+ Actions to execute after `do_install()`.
 
 NOTE: A function defined in a template has preference over the same function
 defined by a `build_style` script.
 
-Run-time dependencies
-~~~~~~~~~~~~~~~~~~~~~
-
-Dependencies for ELF executables or shared libraries are detected
-automatically by `xbps-src`, hence run-time dependencies must not be specified
-in the *package sections* with the following exceptions:
-
-- ELF binaries using dlopen(3).
-- non ELF objects, i.e perl/python/ruby/etc modules.
-- Overriding the minimal version specified in the `shlibs` file.
-
-The run-time dependencies for ELF binaries are detected by checking which SONAMEs
-use and then the SONAMEs are mapped to a binary package name with a minimal
-required version. The `shlibs` file in the `xbps-packages/common` directory
-sets up the `SONAME pkgname>=version` mappings.
-
-For example the `foo-1.0_1` package provides the `libfoo.so.1` SONAME and
-software requiring this library will link to `libfoo`; the resulting binary
-package will have a run-time dependency to `foo>=1.0_1` package as specified in
-`common/shlibs`:
-
------------------------
-# common/shlibs
-...
-libfoo.so.1 foo-1.0_1
-...
------------------------
-
-- The first field specifies the SONAME.
-- The second field specified the package name and minimal version required.
-- A third optional field specifies the architecture (rarely used).
-
 Build options
-~~~~~~~~~~~~~
-
+-------------
 Some packages might be built with different build options to enable/disable
 additional features; `xbps-src` allows you to do this with some simple tweaks
 to the `template` file.
@@ -460,14 +436,14 @@ to the `template` file.
 The following variables may be set to allow package build options:
 
 *build_options*::
-    Sets the build options supported by the source package.
+ Sets the build options supported by the source package.
 
 *build_options_default*::
-    Sets the default build options to be used by the source package.
+ Sets the default build options to be used by the source package.
 
 *desc_option_<option>*::
-    Sets the description for the build option `option`. This must match the
-    keyword set in *build_options*.
+ Sets the description for the build option `option`. This must match the
+keyword set in *build_options*.
 
 After defining those required variables, you can check for the
 `build_option_<option>` variable to know if it has been set and adapt the source
@@ -533,9 +509,69 @@ The build options can also be shown for binary packages via `xbps-query(8)`:
 $ xbps-query -R --property=build-options foo
 --------------------------------------------
 
-Contributing via git
-~~~~~~~~~~~~~~~~~~~~
+Package section
+---------------
+Mandatory functions
+~~~~~~~~~~~~~~~~~~~
+A `package section` needs at least one mandatory function matching the
+`$pkgname` of the `source section`: `<pkgname>_package()`. Multiple binary
+packages with the same template can be created by adding additional
+`<pkg>_package()` functions.
 
+Those `<pkg>_package()` functions are run in alphabetical order, with the
+exception of the `<pkgname>_package()` function, which is always the last one.
+
+Optional variables
+~~~~~~~~~~~~~~~~~~
+*conf_files*::
+A list of configuration files the binary package owns; this expects full
+paths, and multiple entries can be separated by blanks, i.e:
+`conf_files="/etc/foo.conf /etc/foo2.conf"`.
+
+*noarch*::
+ If set, the binary package is not architecture specific and can be shared
+by all supported architectures.
+
+*nonfree*::
+ If set, the binary package will be put into the *non free* repository.
+
+*nostrip*::
+ If set, the ELF binaries with debugging symbols won't be stripped. By
+default all binaries are stripped.
+
+Run-time dependencies
+---------------------
+Dependencies for ELF executables or shared libraries are detected
+automatically by `xbps-src`, hence run-time dependencies must not be specified
+in the *package sections* with the following exceptions:
+
+- ELF binaries using dlopen(3).
+- non ELF objects, i.e perl/python/ruby/etc modules.
+- Overriding the minimal version specified in the `shlibs` file.
+
+The run-time dependencies for ELF binaries are detected by checking which SONAMEs
+use and then the SONAMEs are mapped to a binary package name with a minimal
+required version. The `shlibs` file in the `xbps-packages/common` directory
+sets up the `SONAME pkgname>=version` mappings.
+
+For example the `foo-1.0_1` package provides the `libfoo.so.1` SONAME and
+software requiring this library will link to `libfoo`; the resulting binary
+package will have a run-time dependency to `foo>=1.0_1` package as specified in
+`common/shlibs`:
+
+-----------------------
+# common/shlibs
+...
+libfoo.so.1 foo-1.0_1
+...
+-----------------------
+
+- The first field specifies the SONAME.
+- The second field specified the package name and minimal version required.
+- A third optional field specifies the architecture (rarely used).
+
+Contributing via git
+--------------------
 You can fork the `xbps-packages` git repository on github and then set up
 a remote to pull in new changes:
 
@@ -556,8 +592,12 @@ for more information.
 
 For commit messages please use the following rules:
 
-- If you've imported a new package use `New package: <pkgver>`.
-- If you've updated a package use `<pkgname>: updated to <version>`.
-- If you've removed a package use `<pkgname>: removed ...`.
-
+- If you've imported a new package use `"New package: <pkgver>"`.
+- If you've updated a package use `"<pkgname>: updated to <version>"`.
+- If you've removed a package use `"<pkgname>: removed ..."`.
+- If you've modified a package use `"<pkgname>: ..."`.
 
+Help
+----
+If after reading this `manual` you still need some kind of help, please join
+us at `#xbps` via IRC at `irc.freenode.net`.