mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Michael Olbrich <mol@pengutronix.de>
To: ptxdist@pengutronix.de
Cc: Bastian Krause <bst@pengutronix.de>
Subject: Re: [ptxdist] [APPLIED] doc: dev_manual: split up into multiple files
Date: Sat, 20 Jun 2020 00:04:07 +0200	[thread overview]
Message-ID: <E1jmP7H-0002Pp-CK@dude02.lab.pengutronix.de> (raw)
In-Reply-To: <20200617143125.23999-4-bst@pengutronix.de>

Thanks, applied as 5d42f6f4ef8142b15629064cc826a2b7298b4995.

Michael

[sent from post-receive hook]

On Sat, 20 Jun 2020 00:04:07 +0200, Bastian Krause <bst@pengutronix.de> wrote:
> Split the lengthy developer's manual into multiple files to ease
> navigation when editing.
> 
> No further change to the content.
> 
> Signed-off-by: Bastian Krause <bst@pengutronix.de>
> Reviewed-by: Roland Hieber <rhi@pengutronix.de>
> Tested-by: Ladislav Michl <ladis@linux-mips.org>
> Message-Id: <20200617143125.23999-4-bst@pengutronix.de>
> Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
> 
> diff --git a/doc/dev_add_bin_only_files.rst b/doc/dev_add_bin_only_files.rst
> new file mode 100644
> index 000000000000..9031e437cd4f
> --- /dev/null
> +++ b/doc/dev_add_bin_only_files.rst
> @@ -0,0 +1,105 @@
> +.. _adding_files:
> +
> +Adding Binary Only Files
> +------------------------
> +
> +Sometimes a few binary files have to be added into the root filesystem.
> +Or - to be more precise - some files, that do not need to be built in
> +any way.
> +
> +On the other hand, sometimes files should be included that are not
> +covered by any open source license and so, should not be shipped in the
> +source code format.
> +
> +Add Binary Files File by File
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +Doing to on a file by file base can happen by just using the ``install_copy``
> +macro in the *targetinstall* stage in our own customized rules file.
> +
> +.. code-block:: none
> +
> +    @$(call install_copy, binary_example, 0, 0, 0644, \
> +       </path/to/some/file/>ptx_logo.png, \
> +       /example/ptx_logo.png)
> +
> +It copies the file ``ptx_logo.png`` from some location to target’s root
> +filesystem. Refer :ref:`install_copy` for further information about using the
> +``install_copy`` macro.
> +
> +The disadvantage of this method is: if we want to install more than one
> +file, we need one call to the ``install_copy`` macro per file. This is
> +even harder if not only a set of files is to be installed, but a whole
> +directory tree with files instead.
> +
> +Add Binary Files via an Archive
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +If a whole tree of files is to be installed, working with a *tar* based
> +archive could make life easier. In this case the archive itself provides
> +all the required information the files are needing to be installed in a
> +correct manner:
> +
> +-  the file itself and its name
> +
> +-  the directory structure and the final location of every file in this
> +   structure
> +
> +-  user and group ID on a per file base
> +
> +.. code-block:: none
> +
> +    @$(call install_archive, binary_example, -, -, \
> +       </path/to/an/>archive.tgz, /)
> +
> +Refer :ref:`install_archive` for further information about using the
> +``install_archive`` macro.
> +
> +Using an archive can be useful to install parts of the root filesystem
> +that are not covered by any open source license. Its possible to ship
> +the binaries within the regular BSP, without the need for their sources.
> +However it is possible for the customer to re-create everything required
> +from the BSP to get their target up and running again.
> +
> +Another use case for the archive method could be the support for
> +different development teams. One team provides a software component in
> +the archive format, the other team does not need to build it but can use
> +it in the same way than every other software component.
> +
> +Creating a Rules File
> +~~~~~~~~~~~~~~~~~~~~~
> +
> +Let PTXdist create one for us.
> +
> +.. code-block:: text
> +
> +    $ ptxdist newpackage file
> +
> +    ptxdist: creating a new 'file' package:
> +
> +    ptxdist: enter package name.......: my_binfiles
> +    ptxdist: enter version number.....: 1
> +    ptxdist: enter package author.....: My Name <me@my-org.com>
> +    ptxdist: enter package section....: rootfs
> +
> +Now two new files are present in the BSP:
> +
> +#. ``rules/my_binfiles.in`` The template for the menu
> +
> +#. ``rules/my_binfiles.make`` The rules template
> +
> +Both files now must be customized to meet our requirements. Due to the
> +answer *rootfs* to the “``enter package section``” question, we will
> +find the new menu entry in:
> +
> +.. code-block:: text
> +
> +    Root Filesystem --->
> +    	< > my_binfiles (NEW)
> +
> +Enabling this new entry will also run our stages in
> +``rules/my_binfiles.make`` the next time we enter:
> +
> +.. code-block:: text
> +
> +    $ ptxdist go
> diff --git a/doc/dev_add_new_pkgs.rst b/doc/dev_add_new_pkgs.rst
> new file mode 100644
> index 000000000000..4ae2765c2ce9
> --- /dev/null
> +++ b/doc/dev_add_new_pkgs.rst
> @@ -0,0 +1,1339 @@
> +.. _adding_new_packages:
> +
> +Adding New Packages
> +-------------------
> +
> +PTXdist provides a huge amount of applications sufficient for the most
> +embedded use cases. But there is still need for some fancy new packages.
> +This section describes the steps and the background on how to integrate
> +new packages into the project.
> +
> +At first a summary about possible application types which PTXdist can
> +handle:
> +
> +-  **host type**: This kind of package is built to run on the build
> +   host. Most of the time such a package is needed if another
> +   target-relevant package needs to generate some data. For example the
> +   *glib* package depends on its own to create some data. But if it is
> +   compiled for the target, it can’t do so. That’s why a host glib
> +   package is required to provide these utilities runnable on the build
> +   host. It sounds strange to build a host package, even if on the build
> +   host such utilities are already installed. But this way ensures that
> +   there are no dependencies regarding the build host system.
> +
> +-  **target type**: This kind of package is built for the target.
> +
> +-  **cross type**: This kind of package is built for the build host, but
> +   creates architecture specific data for the target.
> +
> +-  **src-autoconf-prog**: This kind of package is built for the target.
> +   It is intended for development, as it does not handle a released
> +   archive but a plain source project instead. Creating such a package
> +   will also create a small autotools based source template project on
> +   demand to give the developer an easy point to start. This template is
> +   prepared to build a single executable program. For further details refer
> +   section :ref:`adding_src_autoconf_exec`.
> +
> +-  **src-autoconf-lib**: This kind of package is built for the target.
> +   It is intended for development, as it does not handle a released
> +   archive but a plain source project instead. Creating such a package
> +   will also create a small autotools/libtool based source template
> +   project on demand to give the developer an easy point to start. This
> +   template is prepared to build a single shared library. For further
> +   details refer section :ref:`adding_src_autoconf_lib`.
> +
> +-  **src-autoconf-proglib**: This kind of package is built for the
> +   target. It is intended for development, as it does not handle a
> +   released archive but a plain source project instead. Creating such a
> +   package will also create a small autotools/libtool based template
> +   project on demand to give the developer an easy point to start. This
> +   template is prepared to build a single shared library and a single
> +   executable program. The program will be linked against the shared
> +   library. For further details refer section :ref:`adding_src_autoconf_exec_lib`.
> +
> +-  **file**: This kind of package is intended to add a few simple files
> +   into the build process. We assume these files do not need any
> +   processing, they are ready to use and must only be present in the
> +   build process or at run-time (HTML files for example). Refer to the
> +   section :ref:`adding_files` for further details on how to use
> +   it.
> +
> +-  **src-make-prog**: This kind of package is built for the target. It’s
> +   intended for development, as it does not handle a released archive
> +   but a plain source project instead. Creating such a package will also
> +   create a simple makefile-based template project the developer can use
> +   as a starting point for development.
> +
> +-  **src-cmake-prog**: This kind of package is built for the target.
> +   It’s intended for developments based on the *cmake* buildsystem.
> +   Various projects are using *cmake* instead of *make* and can be built
> +   with this package type. PTXdist will prepare it to compile sources in
> +   accordance to the target libraries and their settings. Creating such
> +   a package will also create a simple template project to be used as a
> +   starting point for development.
> +
> +-  **src-qmake-prog**: This kind of package is built for the target.
> +   It’s intended for developments based on the *qmake* buildsystem. If
> +   the developer is going to develop a QT based application, this rule
> +   is prepared to compile sources in accordance to the target libraries
> +   and their settings. Creating such a package will also create a simple
> +   template project to be used as a starting point for development.
> +
> +-  **src-meson-prog**: This kind of package is built for the target.
> +   It’s intended for developments based on the *meson* buildsystem.
> +   Various projects are using *meson* today and can be built
> +   with this package type. PTXdist will prepare it to compile sources in
> +   accordance to the target libraries and their settings. Creating such
> +   a package will also create a simple template project to be used as a
> +   starting point for development.
> +
> +-  **font**: This package is a helper to add X font files to the root
> +   filesystem. This package does not create an additional IPKG, instead
> +   it adds the font to the existing font IPKG. This includes the
> +   generation of the directory index files, required by the Xorg
> +   framework to recognize the font file.
> +
> +-  **src-linux-driver**: This kind of package builds an out of tree
> +   kernel driver. It also creates a driver template to give the
> +   developer an easy point to start.
> +
> +-  **kernel**: PTXdist comes with the ability to handle one kernel in its
> +   platform. This type of package enables us to handle more than one kernel in
> +   the project.
> +
> +-  **barebox**: PTXdist comes with the ability to handle one bootloader in its
> +   platform. This type of package enables us to handle more than one bootloader
> +   in the project.
> +
> +-  **image-tgz**: This kind of package creates a tar ball from a list of
> +   packages. It is often uses as an input for other image packages.
> +
> +-  **image-genimage**: This kind of package can handle all kind of image
> +   generation for almost every target independent of its complexity.
> +
> +-  **blspec-entry**: PTXdist comes with the ability to handle one bootspec in its
> +   platform. This type of package enables us to handle more than one bootspec
> +   in the project.
> +
> +.. _foo_example:
> +
> +Rule File Creation
> +~~~~~~~~~~~~~~~~~~
> +
> +To create such a new package, we create a project local ``rules/``
> +directory first. Then we run
> +
> +.. code-block:: text
> +
> +    $ ptxdist newpackage <package type>
> +
> +If we omit the <``package type``\ >, PTXdist will list all available
> +package types.
> +
> +In our first example, we want to add a new target type archive package.
> +When running the
> +
> +.. code-block:: text
> +
> +    $ ptxdist newpackage target
> +
> +command, PTXdist asks a few questions about this package. This
> +information is the basic data PTXdist must know about the package.
> +
> +.. code-block:: text
> +
> +    ptxdist: creating a new 'target' package:
> +
> +    ptxdist: enter package name.......: foo
> +    ptxdist: enter version number.....: 1.1.0
> +    ptxdist: enter URL of basedir.....: http://www.foo.com/download/src
> +    ptxdist: enter suffix.............: tar.gz
> +    ptxdist: enter package author.....: My Name <me@my-org.com>
> +    ptxdist: enter package section....: project_specific
> +
> +What we have to answer:
> +
> +-  **package name**: As this kind of package handles a source archive,
> +   the correct answer here is the basename of the archive’s file name.
> +   If its full name is ``foo-1.1.0.tar.gz``, then ``foo`` is the
> +   basename to enter here.
> +
> +-  **version number**: Most source archives are using a release or
> +   version number in their file name. If its full name is
> +   ``foo-1.1.0.tar.gz``, then ``1.1.0`` is the version number to enter
> +   here.
> +
> +-  **URL of basedir**: This URL tells PTXdist where to download the
> +   source archive from the web (if not already done). If the full URL to
> +   download the archive is
> +   ``http://www.foo.com/download/src/foo-1.1.0.tar.gz``, the basedir
> +   part ``http://www.foo.com/download/src`` is to be entered here.
> +
> +-  **suffix**: Archives are using various formats for distribution.
> +   PTXdist uses the *suffix* entry to select the matching extraction
> +   tool. If the archive’s full name is ``foo-1.1.0.tar.gz``, then
> +   ``tar.gz`` is the suffix to enter here.
> +
> +-  **package author**: If we intend to contribute this new package to
> +   PTXdist mainline, we should add our name here. This name will be used
> +   in the copyright note of the rule file and will also be added to the
> +   generated ipkg. When you run ``ptxdist setup`` prior to this call,
> +   you can enter your name and your email address, so PTXdist will use
> +   it as the default (very handy if you intend to add many new
> +   packages).
> +
> +-  **package section**: We can enter here the menu section name where
> +   our new package menu entry should be listed. In the first step we can
> +   leave the default name unchanged. It’s a string in the menu file
> +   only, so changing it later on is still possible.
> +
> +Make it Work
> +~~~~~~~~~~~~
> +
> +Generating the rule file is only one of the required steps to get a new
> +package. The next steps to make it work are to check if all stages are
> +working as expected and to select the required parts to get them
> +installed in the target root filesystem. Also we must find a reasonable
> +location where to add our new menu entry to configure the package.
> +
> +The generated skeleton starts to add the new menu entry in the main
> +configure menu (if we left the section name unchanged). Running
> +``ptxdist menuconfig`` will show it on top of all other menus entries.
> +
> +.. important:: 
> +  To be able to implement and test all the other required steps for adding
> +  a new package, we first must enable the package for building. (Fine
> +  tuning the menu can happen later on.)
> +
> +
> +The rule file skeleton still lacks some important information. Let’s
> +take a look into some of the top lines of the generated rule file
> +``./rules/foo.make``:
> +
> +.. code-block:: make
> +
> +    FOO_VERSION	:= 1.1.0
> +    FOO_MD5	:=
> +    FOO		:= foo-$(FOO_VERSION)
> +    FOO_SUFFIX	:= tar.gz
> +    FOO_URL	:= http://www.foo.com/download/src/$(FOO).$(FOO_SUFFIX)
> +    FOO_SOURCE	:= $(SRCDIR)/$(FOO).$(FOO_SUFFIX)
> +    FOO_DIR	:= $(BUILDDIR)/$(FOO)
> +    FOO_LICENSE	:= unknown
> +
> +We can find these lines with different content in most or all of the
> +other rule files PTXdist comes with. Up to the underline character is
> +always the package name and after the underline character is always
> +PTXdist specific. What does it mean:
> +
> +-  ``*_VERSION`` brings in the version number of the release and is used
> +   for the download and IPKG/OPKG package generation.
> +
> +-  ``*_MD5`` to be sure the correct package has been downloaded, PTXdist
> +   checks the given MD5 sum against the archive content. If both sums do
> +   not match, PTXdist rejects the archive and fails the currently
> +   running build.
> +
> +-  ``*_SUFFIX`` defines the archive type, to make PTXdist choosing the
> +   correct extracting tool.
> +
> +-  ``*_URL`` defines the full qualified URL into the web for download. If
> +   alternative download locations are known, they can be listed in this
> +   variable, delimiter character is the space.
> +
> +-  ``*_SOURCE`` tells PTXdist where to store the downloaded package.
> +
> +-  ``*_DIR`` points to the directory this package will be built later on
> +   by PTXdist.
> +
> +-  ``*_LICENSE`` enables the user to get a list of licenses she/he is
> +   using in her/his project (licenses of the enabled packages).
> +
> +After enabling the menu entry, we can start to check the *get* and
> +*extract* stages, calling them manually one after another.
> +
> +.. note:: The shown commands below expect that PTXdist downloads the
> +  archives to a global directory named ``global_src``. This is not the
> +  default setting, but we recommend to use a global directory to share all
> +  archives between PTXdist based projects. Advantage is every download
> +  happens only once. Refer to the ``setup`` command PTXdist provides.
> +
> +.. code-block:: text
> +
> +    $ ptxdist get foo
> +
> +    ---------------------------
> +    target: foo-1.1.0.tar.gz
> +    ---------------------------
> +
> +    --2009-12-21 10:54:45--  http://www.foo.com/download/src/foo-1.1.0.tar.gz
> +    Length: 291190 (284K) [application/x-gzip]
> +    Saving to: `/global_src/foo-1.1.0.tar.gz.XXXXOGncZA'
> +
> +    100%[======================================>] 291,190      170K/s   in 1.7s
> +
> +    2009-12-21 10:54:48 (170 KB/s) - `/global_src/foo-1.1.0.tar.gz' saved [291190/291190]
> +
> +This command should start to download the source archive. If it fails,
> +we should check our network connection, proxy setup or if the given URL
> +in use is correct.
> +
> +.. note:: Sometimes we do not know the content of all the other variables in
> +  the rule file. To get an idea what content a variable has, we can ask
> +  PTXdist about it:
> +
> +.. code-block:: text
> +
> +    $ ptxdist print FOO_URL
> +    http://www.foo.com/download/src/foo-1.1.0.tar.gz
> +
> +The next step would be to extract the archive. But as PTXdist checks the
> +MD5 sum in this case, this step will fail, because the ``FOO_MD5``
> +variable is still empty. Let’s fill it:
> +
> +.. code-block:: text
> +
> +    $ md5sum /global_src/foo-1.1.0.tar.gz
> +    9a09840ab775a139ebb00f57a587b447
> +
> +This string must be assigned to the FOO_MD5 in our new ``foo.make``
> +rule file:
> +
> +.. code-block:: text
> +
> +    FOO_MD5		:= 9a09840ab775a139ebb00f57a587b447
> +
> +We are now prepared for the next step:
> +
> +.. code-block:: text
> +
> +    $ ptxdist extract foo
> +
> +    -----------------------
> +    target: foo.extract
> +    -----------------------
> +
> +    extract: archive=/global_src/foo-1.1.0.tar.gz
> +    extract: dest=/home/jbe/my_new_prj/build-target
> +    PATCHIN: packet=foo-1.1.0
> +    PATCHIN: dir=/home/jbe/my_new_prj/build-target/foo-1.1.0
> +    PATCHIN: no patches for foo-1.1.0 available
> +    Fixing up /home/jbe/my_new_prj/build-target/foo-1.1.0/configure
> +    finished target foo.extract
> +
> +In this example we expect an autotoolized source package. E.g. to
> +prepare the build, the archive comes with a ``configure`` script. This
> +is the default case for PTXdist. So, there is no need to modify the rule
> +file and we can simply run:
> +
> +.. code-block:: text
> +
> +    $ ptxdist prepare foo
> +
> +    -----------------------
> +    target: foo.prepare
> +    -----------------------
> +
> +    [...]
> +
> +    checking build system type... i686-host-linux-gnu
> +    checking host system type... |ptxdistCompilerName|
> +    checking whether to enable maintainer-specific portions of Makefiles... no
> +    checking for a BSD-compatible install... /usr/bin/install -c
> +    checking whether build environment is sane... yes
> +    checking for a thread-safe mkdir -p... /bin/mkdir -p
> +    checking for gawk... gawk
> +    checking whether make sets $(MAKE)... yes
> +    checking for |ptxdistCompilerName|-strip... |ptxdistCompilerName|-strip
> +    checking for |ptxdistCompilerName|-gcc... |ptxdistCompilerName|-gcc
> +    checking for C compiler default output file name... a.out
> +
> +    [...]
> +
> +    configure: creating ./config.status
> +    config.status: creating Makefile
> +    config.status: creating ppa_protocol/Makefile
> +    config.status: creating config.h
> +    config.status: executing depfiles commands
> +    finished target foo.prepare
> +
> +At this stage things can fail:
> +
> +-  A wrong or no MD5 sum was given
> +
> +-  The ``configure`` script is not cross compile aware
> +
> +-  The package depends on external components (libraries for example)
> +
> +If the ``configure`` script is not cross compile aware, we are out of
> +luck. We must patch the source archive in this case to make it work.
> +Refer to the section :ref:`configure_rebuild` on how to use
> +PTXdist’s features to simplify this task.
> +If the package depends on external components, these components might
> +be already part of PTXdist. In this case we just have to add this
> +dependency into the menu file and we are done. But if PTXdist cannot
> +fulfill this dependency, we also must add it as a separate package
> +first.
> +
> +If the *prepare* stage has finished successfully, the next step is to
> +compile the package.
> +
> +.. code-block:: text
> +
> +    $ ptxdist compile foo
> +
> +    -----------------------
> +    target: foo.compile
> +    -----------------------
> +
> +    make[1]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make  all-recursive
> +    make[2]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[3]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +
> +    [...]
> +
> +    make[3]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[2]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[1]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    finished target foo.compile
> +
> +At this stage things can fail:
> +
> +-  The build system is not cross compile aware (it tries to execute just
> +   created target binaries for example)
> +
> +-  The package depends on external components (libraries for example)
> +   not detected by ``configure``
> +
> +-  Sources are ignoring the endianness of some architectures or using
> +   header files from the build host system (from ``/usr/include`` for
> +   example)
> +
> +-  The linker uses libraries from the build host system (from
> +   ``/usr/lib`` for example) by accident
> +
> +In all of these cases we must patch the sources to make them work. Refer
> +to section :ref:`patching_packages` on how to use PTXdist’s
> +features to simplify this task.
> +
> +In this example we expect the best case: everything went fine, even for
> +cross compiling. So, we can continue with the next stage: *install*
> +
> +.. code-block:: text
> +
> +    $ ptxdist install foo
> +
> +    -----------------------
> +    target: foo.install
> +    -----------------------
> +
> +    make[1]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[2]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[3]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    test -z "/usr/bin" || /bin/mkdir -p "/home/jbe/my_new_prj/build-target/foo-1.1.0/usr/bin"
> +      /usr/bin/install -c 'foo' '/home/jbe/my_new_prj/build-target/foo-1.1.0/usr/bin/foo'
> +    make[3]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[2]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    make[1]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> +    finished target foo.install
> +
> +    ----------------------------
> +    target: foo.install.post
> +    ----------------------------
> +
> +    finished target foo.install.post
> +
> +This *install* stage does not install anything to the target root
> +filesystem. It is mostly intended to install libraries and header files
> +other programs should link against later on.
> +
> +The last stage – *targetinstall* – is the one that defines the package’s
> +components to be forwarded to the target’s root filesystem. Due to the
> +absence of a generic way, this is the task of the developer. So, at this
> +point of time we must run our favourite editor again and modify our new
> +rule file ``./rules/foo.make``.
> +
> +The skeleton for the *targetinstall* stage looks like this:
> +
> +.. code-block:: make
> +
> +    # ----------------------------------------------------------------------------
> +    # Target-Install
> +    # ----------------------------------------------------------------------------
> +
> +    $(STATEDIR)/foo.targetinstall:
> +    	@$(call targetinfo)
> +
> +    	@$(call install_init,  foo)
> +    	@$(call install_fixup, foo,PACKAGE,foo)
> +    	@$(call install_fixup, foo,PRIORITY,optional)
> +    	@$(call install_fixup, foo,VERSION,$(FOO_VERSION))
> +    	@$(call install_fixup, foo,SECTION,base)
> +    	@$(call install_fixup, foo,AUTHOR,"My Name <me@my-org.com>")
> +    	@$(call install_fixup, foo,DEPENDS,)
> +    	@$(call install_fixup, foo,DESCRIPTION,missing)
> +
> +    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foobar, /dev/null)
> +
> +    	@$(call install_finish, foo)
> +    	@$(call touch)
> +
> +The “header” of this stage defines some information IPKG needs. The
> +important part that we must modify is the call to the ``install_copy``
> +macro (refer to section :ref:`reference_macros` for more details
> +about this kind of macros). This call instructs PTXdist to include the
> +given file (with UID, GID and permissions) into the IPKG, which means to
> +install this file to the target’s root filesystem.
> +
> +From the previous *install* stage we know this package installs an
> +executable called ``foo`` to location ``/usr/bin``. We can do the same
> +for our target by changing the *install\_copy* line to:
> +
> +.. code-block:: none
> +
> +    @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
> +
> +To check it, we just run:
> +
> +.. code-block:: text
> +
> +    $ ptxdist targetinstall foo
> +
> +    -----------------------------
> +    target: foo.targetinstall
> +    -----------------------------
> +
> +    install_init:   preparing for image creation...
> +    install_init:   @ARCH@ -> i386 ... done
> +    install_init:   preinst not available
> +    install_init:   postinst not available
> +    install_init:   prerm not available
> +    install_init:   postrm not available
> +    install_fixup:  @PACKAGE@ -> foo ... done.
> +    install_fixup:  @PRIORITY@ -> optional ... done.
> +    install_fixup:  @VERSION@ -> 1.1.0 ... done.
> +    install_fixup:  @SECTION@ -> base ... done.
> +    install_fixup:  @AUTHOR@ -> "My Name <me\@my-org.com>" ... done.
> +    install_fixup:  @DESCRIPTION@ -> missing ... done.
> +    install_copy:
> +      src=/home/jbe/my_new_prj/build-target/foo-1.1.0/foo
> +      dst=/usr/bin/foo
> +      owner=0
> +      group=0
> +      permissions=0755
> +    xpkg_finish:    collecting license (unknown) ... done.
> +    xpkg_finish:    creating ipkg package ... done.
> +    finished target foo.targetinstall
> +
> +    ----------------------------------
> +    target: foo.targetinstall.post
> +    ----------------------------------
> +
> +    finished target foo.targetinstall.post
> +
> +After this command, the target’s root filesystem contains a file called
> +``/usr/bin/foo`` owned by root, its group is also root and everyone has
> +execution permissions, but only the user root has write permissions.
> +
> +One last task of this port is still open: A reasonable location for
> +the new menu entry in PTXdist’s menu hierarchy. PTXdist arranges its
> +menus on the meaning of each package. Is it a network related tool? Or
> +a scripting language? Or a graphical application?
> +Each of these global meanings has its own submenu, where we can add
> +our new entry to. We just have to edit the head of our new menu file
> +``./rules/foo.in`` to add it to a specific global menu. If our new
> +package is a network related tool, the head of the menu file should
> +look like:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=networking
> +
> +We can grep through the other menu files from the PTXdist main
> +installation ``rules/`` directory to get an idea what section names are
> +available:
> +
> +.. code-block:: text
> +
> +    rules/ $ find . -name \*.in | xargs grep "## SECTION"
> +    ./acpid.in:## SECTION=shell_and_console
> +    ./alsa-lib.in:## SECTION=system_libraries
> +    ./alsa-utils.in:## SECTION=multimedia_sound
> +    ./apache2.in:## SECTION=networking
> +    ./apache2_mod_python.in:## SECTION=networking
> +    [...]
> +    ./xkeyboard-config.in:## SECTION=multimedia_xorg_data
> +    ./xorg-app-xev.in:## SECTION=multimedia_xorg_app
> +    ./xorg-app-xrandr.in:## SECTION=multimedia_xorg_app
> +    ./host-eggdbus.in:## SECTION=hosttools_noprompt
> +    ./libssh2.in:## SECTION=networking
> +
> +Porting a new package to PTXdist is (almost) finished now.
> +
> +To check it right away, we simply run these two commands:
> +
> +.. code-block:: text
> +
> +    $ ptxdist clean foo
> +    rm -rf /home/jbe/my_new_prj/state/foo.*
> +    rm -rf /home/jbe/my_new_prj/packages/foo_*
> +    rm -rf /home/jbe/my_new_prj/build-target/foo-1.1.0
> +    $ ptxdist targetinstall foo
> +
> +    [...]
> +
> +.. important:: Discover somehow hidden dependencies with one more last check!
> +
> +Up to this point all the development of the new package was done in an already
> +built BSP. Doing so sometimes somehow hidden dependencies cannot be seen:
> +everything seems fine, the new package builds always successfully and the
> +results are working on the target.
> +
> +So to check for this kind of dependencies there is still one more final check
> +to do (even if its boring and takes time):
> +
> +.. code-block:: text
> +
> +    $ ptxdist clean
> +    [...]
> +    $ ptxdist targetinstall foo
> +    [...]
> +
> +This will re-start with a **clean** BSP and builds exactly the new package and
> +its (known) dependencies. If this builds successfully as well we are really done
> +with the new package.
> +
> +Some Notes about Licenses
> +~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +The already mentioned rule variable ``*_LICENSE`` (e.g. ``FOO_LICENSE`` in our
> +example) is very important and must be filled by the developer of the package.
> +Many licenses bring in obligations using the corresponding package (*attribution*
> +for example). To make life easier for everybody the license for a package must
> +be provided. *SPDX* license identifiers unify the license names and are used
> +in PTXdist to identify license types and obligations.
> +
> +If a package comes with more than one license, all of their SPDX identifiers
> +must be listed and connected with the keyword ``AND``. If your package comes
> +with GPL-2.0 and LGPL-2.1 licenses, the definition should look like this:
> +
> +.. code-block:: make
> +
> +   FOO_LICENSE := GPL-2.0 AND LGPL-2.1
> +
> +One specific obligation cannot be detected examining the SPDX license identifiers
> +by PTXdist: *the license choice*. In this case all licenses of choice must be
> +listed and connected by the keyword ``OR``.
> +
> +If, for example, your obligation is to select one of the licenses *GPL-2.0* **or**
> +*GPL-3.0*, the ``*_LICENSE`` variable should look like this:
> +
> +.. code-block:: make
> +
> +   FOO_LICENSE := GPL-2.0 OR GPL-3.0
> +
> +SPDX License Identifiers
> +^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +A list of SPDX license identifiers can be found here:
> +
> +   https://spdx.org/licenses/
> +
> +Help to Detect the Correct License
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +License identification isn't trivial. A help in doing so can be the following
> +repository and its content. It contains a list of known licenses based on their
> +SPDX identifier. The content is without formatting to simplify text search.
> +
> +   https://github.com/spdx/license-list-data/tree/master/text
> +
> +Advanced Rule Files
> +~~~~~~~~~~~~~~~~~~~
> +
> +The previous example on how to create a rule file sometimes works as
> +shown above. But most of the time source archives are not that simple.
> +In this section we want to give the user a more detailed selection how
> +the package will be built.
> +
> +Adding Static Configure Parameters
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The ``configure`` scripts of various source archives provide additional
> +parameters to enable or disable features, or to configure them in a
> +specific way.
> +
> +We assume the ``configure`` script of our ``foo`` example (refer to
> +section :ref:`foo_example`) supports two additional parameters:
> +
> +-  **--enable-debug**: Make the program more noisy. It’s disabled by
> +   default.
> +
> +-  **--with-bar**: Also build the special executable **bar**. Building
> +   this executable is also disabled by default.
> +
> +We now want to forward these options to the ``configure`` script when it
> +runs in the *prepare* stage. To do so, we must again open the rule file
> +with our favourite editor and navigate to the *prepare* stage entry.
> +
> +PTXdist uses the variable ``FOO_CONF_OPT`` as the list of parameters to
> +be given to ``configure``.
> +
> +Currently this variable is commented out and defined to:
> +
> +.. code-block:: make
> +
> +    # FOO_CONF_OPT := $(CROSS_AUTOCONF_USR)
> +
> +The variable ``CROSS_AUTOCONF_USR`` is predefined by PTXdist and
> +contains all basic parameters to instruct ``configure`` to prepare for a
> +**cross** compile environment.
> +
> +To use the two additional mentioned ``configure`` parameters, we comment
> +in this line and supplement this expression as follows:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_OPT := \
> +        $(CROSS_AUTOCONF_USR) \
> +        --enable-debug \
> +        --with-bar
> +
> +.. note:: We recommend to use this format with each parameter on a line of
> + its own. This format is easier to read and a diff shows more exactly any
> + change.
> +
> +To do a fast check if this addition was successful, we run:
> +
> +.. code-block:: text
> +
> +    $ ptxdist print FOO_CONF_OPT
> +    --prefix=/usr --sysconfdir=/etc --host=|ptxdistCompilerName| --build=i686-host-linux-gnu --enable-debug --with-bar
> +
> +.. note:: It depends on the currently selected platform and its architecture
> + what content this variable will have. The content shown above is an
> + example for a target.
> +
> +Or re-build the package with the new settings:
> +
> +.. code-block:: text
> +
> +    $ ptxdist drop foo prepare
> +    $ ptxdist targetinstall foo
> +
> +Adding Dynamic Configure Parameters
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Sometimes it makes sense to add this kind of parameters on demand only;
> +especially a parameter like ``--enable-debug``. To let the user decide
> +if this parameter is to be used or not, we must add a menu entry. So,
> +let’s expand our menu. Here is its current content:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=project_specific
> +
> +    config FOO
> +            tristate
> +            prompt "foo"
> +            help
> +              FIXME
> +
> +We’ll add two menu entries, one for each optional parameter we want to
> +add on demand to the ``configure`` parameters:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=project_specific
> +
> +    config FOO
> +           tristate
> +           prompt "foo"
> +           help
> +             FIXME
> +
> +    if FOO
> +    config FOO_DEBUG
> +           bool
> +           prompt "add debug noise"
> +
> +    config FOO_BAR
> +           bool
> +           prompt "build bar"
> +
> +    endif
> +
> +.. important:: Always follow the rule to extend the base name by a suboption
> +  name as the trailing part of the variable name. This gives PTXdist the ability
> +  to detect a change in the package’s settings (via menuconfig) to force its
> +  rebuild on demand.
> +
> +To make usage of the new menu entries, we must check them in the rule
> +file and add the correct parameters:
> +
> +.. code-block:: make
> +
> +    #
> +    # autoconf
> +    #
> +    FOO_CONF_OPT := \
> +        $(CROSS_AUTOCONF_USR) \
> +        --$(call ptx/endis, PTXCONF_FOO_DEBUG)-debug \
> +        --$(call ptx/wwo, PTXCONF_FOO_BAR)-bar
> +
> +.. important:: Please note the leading ``PTXCONF_`` for each define. While Kconfig is
> +  using ``FOO_BAR``, the rule file must use ``PTXCONF_FOO_BAR`` instead.
> +
> +.. note:: Refer :ref:`Rule File Macro Reference <param_macros>` for further
> +   details about these special kind of option macros (e.g. ``ptx/...``).
> +
> +It is a good practice to always add both settings, e.g. ``--disable-debug``
> +even if this is the default case. Sometimes ``configure`` tries to guess
> +something and the binary result might differ depending on the build
> +order. For example some kind of package would also build some X related
> +tools, if X libraries are found. In this case it depends on the build
> +order, if the X related tools are built or not. All the autocheck
> +features are problematic here. So, if we do not want ``configure`` to
> +guess its settings we **must disable everything we do not want**.
> +
> +To support this process, PTXdist supplies a helper script, located at
> +``/path/to/ptxdist/scripts/configure-helper.py`` that compares the configure
> +output with the settings from ``FOO_CONF_OPT``:
> +
> +.. code-block:: text
> +
> +    $ /opt/ptxdist-2017.06.0/scripts/configure-helper.py -p libsigrok
> +    --- rules/libsigrok.make
> +    +++ libsigrok-0.5.0
> +    @@ -4,3 +4,74 @@
> +     	--libdir=/usr/lib
> +     	--build=x86_64-host-linux-gnu
> +     	--host=arm-v7a-linux-gnueabihf
> +    +	--enable-warnings=min|max|fatal|no
> +    +	--disable-largefile
> +    +	--enable-all-drivers
> +    +	--enable-agilent-dmm
> +    [...]
> +    +	--enable-ruby
> +    +	--enable-java
> +    +	--without-libserialport
> +    +	--without-libftdi
> +    +	--without-libusb
> +    +	--without-librevisa
> +    +	--without-libgpib
> +    +	--without-libieee1284
> +    +	--with-jni-include-path=DIR-LIST
> +
> +In this example, many configure options from libsigrok (marked with ``+``)
> +are not yet present in ``LIBSIGROK_CONF_OPT`` and must be added, possibly also
> +by providing more dynamic options in the package definition.
> +
> +If some parts of a package are built on demand only, they must also be
> +installed on demand only. Besides the *prepare* stage, we also must
> +modify our *targetinstall* stage:
> +
> +.. code-block:: make
> +
> +    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
> +
> +    ifdef PTXCONF_FOO_BAR
> +    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/bar, /usr/bin/bar)
> +    endif
> +
> +    	@$(call install_finish, foo)
> +    	@$(call touch)
> +
> +Now we can play with our new menu entries and check if they are working
> +as expected:
> +
> +.. code-block:: text
> +
> +    $ ptxdist menuconfig
> +    $ ptxdist targetinstall foo
> +
> +Whenever we change a *FOO* related menu entry, PTXdist should detect it
> +and re-build the package when a new build is started.
> +
> +.. _external_dependencies:
> +
> +Managing External Compile Time Dependencies
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +While running the prepare stage, it could happen that it fails due to a
> +missing external dependency.
> +
> +For example:
> +
> +.. code-block:: text
> +
> +    checking whether zlib exists....failed
> +
> +In this example, our new package depends on the compression library
> +*zlib*. PTXdist comes with a target *zlib*. All we need to do in this
> +case is to declare that our new package *foo* depends on *zlib*. This
> +kind of dependency is managed in the menu file of our new package by
> +simply adding the ``select ZLIB`` line. After this addition our menu
> +file looks like:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=project_specific
> +
> +    config FOO
> +           tristate
> +           select ZLIB
> +           prompt "foo"
> +           help
> +             FIXME
> +
> +    if FOO
> +    config FOO_DEBUG
> +           bool
> +           prompt "add debug noise"
> +
> +    config FOO_BAR
> +           bool
> +           prompt "build bar"
> +
> +    endif
> +
> +PTXdist now builds the *zlib* first and our new package thereafter.
> +
> +Refer :ref:`external_dependencies_variants` for more specific dependency
> +description.
> +
> +Managing External Compile Time Dependencies on Demand
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +It is good practice to add only those dependencies that are really
> +required for the current configuration of the package. If the package
> +provides the features *foo* and *bar* and its ``configure`` provides
> +switches to enable/disable them independently, we can also add
> +dependencies on demand. Let’s assume feature *foo* needs the compression
> +library *libz* and *bar* needs the XML2 library *libxml2*. These
> +libraries are only required at run-time if the corresponding feature is
> +enabled. To add these dependencies on demand, the menu file looks like:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=project_specific
> +
> +    config FOO
> +           tristate
> +           select ZLIB if FOO_FOO
> +           select LIBXML2 if FOO_BAR
> +           prompt "foo"
> +           help
> +             FIXME
> +
> +    if FOO
> +    config FOO_DEBUG
> +           bool
> +           prompt "add debug noise"
> +
> +    config FOO_FOO
> +           bool
> +           prompt "build foo"
> +
> +    config FOO_BAR
> +           bool
> +           prompt "build bar"
> +
> +    endif
> +
> +.. important:: Do not add these ``select`` statements to the corresponding menu entry.
> +  They must belong to the main menu entry of the package to ensure that
> +  the calculation of the dependencies between the packages is done in a
> +  correct manner.
> +
> +Managing External Runtime Dependencies
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Some packages are building all of their components and also installing
> +them into the target’s sysroot. But only their *targetinstall* stage
> +decides which parts are copied to the root filesystem. So, compiling and
> +linking of our package will work, because everything required is found
> +in the target’s sysroot.
> +
> +In our example there is a hidden dependency to the math library
> +``libm``. Our new package was built successfully, because the linker was
> +able to link our binaries against the ``libm`` from the toolchain. But
> +in this case the ``libm`` must also be available in the target’s root
> +filesystem to fulfil the run-time dependency: We have to force PTXdist to
> +install ``libm``. ``libm`` is part of the *glibc* package, but is not
> +installed by default (to keep the root filesystem small). So, it **does
> +not** help to select the ``GLIBC`` symbol, to get a ``libm`` at run-time.
> +
> +The correct solution here is to add a ``select LIBC_M`` to our menu
> +file. With all the additions above it now looks like:
> +
> +.. code-block:: kconfig
> +
> +    ## SECTION=project_specific
> +
> +    config FOO
> +           tristate
> +           select ZLIB if FOO_FOO
> +           select LIBXML2 if FOO_BAR
> +           select LIBC_M
> +           prompt "foo"
> +           help
> +             FIXME
> +
> +    if FOO
> +    config FOO_DEBUG
> +           bool
> +           prompt "add debug noise"
> +
> +    config FOO_FOO
> +           bool
> +           prompt "build foo"
> +
> +    config FOO_BAR
> +           bool
> +           prompt "build bar"
> +
> +    endif
> +
> +.. note:: There are other packages around, that do not install everything by
> +  default. If our new package needs something special, we must take a look
> +  into the menu of the other package how to force the required components
> +  to be installed and add the corresponding ``selects`` to our own menu
> +  file. In this case it does not help to enable the required parts in our
> +  project configuration, because this has no effect on the build order!
> +
> +Managing Plain Makefile Packages
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Many packages are still coming with a plain ``Makefile``. The user has
> +to adapt it to make it work in a cross compile environment as well.
> +PTXdist can also handle this kind of packages. We only have to specify
> +a special *prepare* and *compile* stage.
> +
> +Such packages often have no special need for any kind of preparation. In
> +this we must instruct PTXdist to do nothing in the *prepare* stage:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_TOOL := NO
> +
> +To compile the package, we can use ``make``\ ’s feature to overwrite
> +variables used in the ``Makefile``. With this feature we can still use
> +the original ``Makefile`` but with our own (cross compile) settings.
> +
> +Most of the time the generic compile rule can be used, only a few
> +settings are required. For a well defined ``Makefile`` it is sufficient to
> +set up the correct cross compile environment for the *compile* stage:
> +
> +.. code-block:: make
> +
> +    FOO_MAKE_ENV := $(CROSS_ENV)
> +
> +``make`` will be called in this case with:
> +
> +``$(FOO_MAKE_ENV) $(MAKE) -C $(FOO_DIR) $(FOO_MAKE_OPT)``
> +
> +So, in the rule file only the two variables ``FOO_MAKE_ENV`` and
> +``FOO_MAKE_OPT`` must be set, to forward the required settings to the
> +package’s buildsystem. If the package cannot be built in parallel, we
> +can also add the ``FOO_MAKE_PAR := NO``. ``YES`` is the default.
> +
> +Managing CMake/QMake/Meson Packages
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Building packages that use ``cmake``, ``qmake`` or ``meson`` is much like
> +building packages with an autotools based buildsystem. We need to specify
> +the configuration tool:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_TOOL := cmake
> +
> +or
> +
> +.. code-block:: make
> +
> +    FOO_CONF_TOOL := qmake
> +
> +or respectively
> +
> +.. code-block:: make
> +
> +    FOO_CONF_TOOL := meson
> +
> +And provide the correct configuration options. The syntax is different so
> +PTXdist provides additional macros to simplify configurable features.
> +For ``cmake`` the configuration options typically look like this:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_OPT := \
> +    	$(CROSS_CMAKE_USR) \
> +    	-DBUILD_TESTS:BOOL=OFF \
> +    	-DENABLE_BAR:BOOL=$(call ptx/onoff, PTXCONF_FOO_BAR)
> +
> +For ``qmake`` the configuration options typically look like this:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_OPT := \
> +    	$(CROSS_QMAKE_OPT) \
> +    	PREFIX=/usr
> +
> +And for ``meson`` the configuration options typically look like this:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_OPT := \
> +    	$(CROSS_MESON_USR) \
> +    	-Dbar=$(call ptx/truefalse,PTXCONF_FOO_BAR)
> +
> +Please note that currently only host and target ``cmake``\/``meson`` packages
> +and only target ``qmake`` packages are supported.
> +
> +Managing Python Packages
> +^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +As with any other package, the correct configuration tool must be selected
> +for Python packages:
> +
> +.. code-block:: make
> +
> +    FOO_CONF_TOOL := python
> +
> +.. note:: For Python3 packages the value must be ``python3``.
> +
> +No Makefiles are used when building Python packages so the usual ``make``
> +and ``make install`` for the *compile* and *install* stages cannot be used.
> +PTXdist will call ``python setup.py build`` and ``python setup.py install``
> +instead.
> +
> +.. note:: *FOO* is still the name of our example package. It must be
> +  replaced by the real package name.
> +
> +
> +.. _patching_packages:
> +
> +Patching Packages
> +~~~~~~~~~~~~~~~~~
> +
> +There can be various reasons why a package must be patched:
> +
> +-  Package is broken for cross compile environments
> +
> +-  Package is broken within a specific feature
> +
> +-  Package is vulnerable and needs some fixes
> +
> +-  or anything else (this case is the most common one)
> +
> +Ideally, those problems should be addressed in the original project,
> +so any patches you add to your BSP or to PTXdist should also be submitted upstream.
> +The upstream project can often provide better feedback, they can integrate your
> +patch into a new release, and also maintain your changes as part of the project.
> +This way we make sure that all advantages of the open source idea work for us;
> +and your patch can be removed again later when a new release of the project is
> +integrated into your BSP or into PTXdist.
> +
> +PTXdist handles patching automatically.
> +After extracting the archive of a package, PTXdist checks for the existence of
> +a patch directory named like its ``<PKG>_PATCHES`` variable, or, if this variable
> +is not set, like its ``<PKG>`` variable.
> +The patch directory is then searched in all locations listed by the
> +``PTXDIST_PATH_PATCHES`` variable, and the first one found is used.
> +Take an exemplary package ``foo`` with version ``1.1.0``:
> +The variable ``FOO`` will have the value ``foo-1.1.0``, so PTXdist will look for
> +a patch directory named ``foo-1.1.0`` in the following locations:
> +
> +#. the current layer:
> +
> +   a. project (``./patches/foo-1.1.0``)
> +   b. platform (``./configs/|ptxdistPlatformConfigDir|/patches/foo-1.1.0``)
> +
> +#. any :ref:`base layers <layers-in-ptxdist>`,
> +   applying the same search order as above for each layer recursively
> +
> +#. ptxdist (``<ptxdist/installation/path>/patches/foo-1.1.0``)
> +
> +The patches from the first location found are used. Note: Due to this
> +search order, a PTXdist project can replace global patches from the
> +PTXdist installation. This can be useful if a project sticks to a
> +specific PTXdist revision but fixes from a more recent revision of
> +PTXdist should be used.
> +
> +PTXdist uses the utilities *git*, *patch* or *quilt* to work with
> +patches or patch series. We recommend *git*, as it can manage patch
> +series in a very easy way.
> +
> +Creating a Patch Series for a Package
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +To create a patch series for the first time, we can run the following
> +steps. We are still using our *foo-1.1.0* example package here:
> +
> +Using Quilt
> +"""""""""""
> +
> +We create a special directory for the patch series in the local project
> +directory:
> +
> +.. code-block:: text
> +
> +    $ mkdir -p patches/foo-1.1.0
> +
> +PTXdist expects a ``series`` file in the patch directory and at least
> +one patch. Otherwise it fails. Due to the fact that we do not have any
> +patch content yet, we’ll start with a dummy entry in the ``series`` file
> +and an empty ``patch`` file.
> +
> +.. code-block:: text
> +
> +    $ touch patches/foo-1.1.0/dummy
> +    $ echo dummy > patches/foo-1.1.0/series
> +
> +Next is to extract the package (if already done, we must remove it
> +first):
> +
> +.. code-block:: text
> +
> +    $ ptxdist extract foo
> +
> +This will extract the archive and create a symbolic link in the build
> +directory pointing to our local patch directory. Working this way will
> +ensure that we do not lose our created patches if we enter
> +``ptxdist clean foo`` by accident. In our case the patches are still
> +present in ``patches/foo-1.1.0`` and can be used the next time we
> +extract the package again.
> +
> +All we have to do now is to do the modification we need to make the
> +package work. We change into the build directory and use quilt_ to
> +create new patches, add files to respective patches, modify these files
> +and refresh the patches to save our changes.
> +See the *quilt* documentation (``man 1 quilt``) for more information.
> +
> +.. note:: For patches that are intended for PTXdist upstream use the git
> +  workflow described below to get proper patch headers.
> +
> +.. _quilt: http://savannah.nongnu.org/projects/quilt
> +
> +Using Git
> +"""""""""
> +
> +Create the patch directory like above for *quilt*,
> +but only add an empty series file:
> +
> +.. code-block:: text
> +
> +    $ mkdir -p patches/foo-1.1.0
> +    $ touch patches/foo-1.1.0/series
> +
> +Then extract the package with an additional command line switch:
> +
> +.. code-block:: text
> +
> +    $ ptxdist --git extract foo
> +
> +The empty series file makes PTXdist create a Git repository in the
> +respective package build directory,
> +and import the package source as the first commit.
> +
> +.. note:: Optionally, you can enable the setting *Developer Options →
> +  use git to apply patches* in `ptxdist setup` to get this behaviour
> +  as a default for every package.
> +  However, note that this setting is meant for development only, and can lead
> +  to failures – some packages try to determine if they are being compiled from
> +  a Git source tree, and behave differently in that case.
> +
> +Then you can change into the package build directory
> +(``platform-<name>/build-target/foo-1.1.0``),
> +patch the required source files,
> +and make Git commits on the way.
> +The Git history should now look something like this:
> +
> +.. code-block:: text
> +
> +    $ git log --oneline --decorate
> +    * df343e821851 (HEAD -> master) Makefile: don't build the tests
> +    * 65a360c2bd60 strfry.c: frobnicate the excusator
> +    * fdc315f6844c (tag: foobar-1.1.0, tag: base) initial commit
> +
> +Finally, call ``git ptx-patches`` to transform those Git commits into the patch
> +series in the ``patches/foo-1.1.0`` folder.
> +This way they don't get lost when cleaning the package.
> +
> +.. note:: PTXdist will only create a Git repository for packages with
> +  patches.  To use Git to generate the first patch, create an empty series
> +  file ``patches/foobar-1.1.0/series`` before extracting the packages. This
> +  will tell PTXdist to use Git anyways and ``git ptx-patches`` will put the
> +  patches there.
> +
> +Both approaches (Git and quilt) are not suitable for modifying files
> +that are autogenerated in autotools-based buildsystems.
> +Refer to the section :ref:`configure_rebuild` on how PTXdist can
> +handle this special task.
> +
> +Adding More Patches to a Package
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +If we want to add more patches to an already patched package, we can use
> +nearly the same way as creating patches for the first time. But if the
> +patch series comes from the PTXdist main installation, we do not have
> +write permissions to these directories (do NEVER work on the main
> +installation directories, NEVER, NEVER, NEVER). Due to the search order
> +in which PTXdist searches for patches for a specific package, we can
> +copy the global patch series to our local project directory. Now we have
> +the permissions to add more patches or modify the existing ones. Also
> +*quilt* and *git* are our friends here to manage the patch series.
> +
> +If we think that our new patches are valuable also for others, or they
> +fix an error, it could be a good idea to send these patches to PTXdist
> +mainline, and to the upstream project too.
> +
> +
> +.. _configure_rebuild:
> +
> +Modifying Autotoolized Packages
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Autotoolized packages are very picky when automatically generated files
> +get patched. The patch order is very important in this case and
> +sometimes it even fails and nobody knows why.
> +
> +To improve a package’s autotools-based build system, PTXdist comes with
> +its own project local autotools to regenerate the autotools template
> +files, instead of patching them. With this feature, only the template
> +files must be patched, the required ``configure`` script and the
> +``Makefile.in`` files are regenerated in the final stages of the
> +*prepare* step.
> +
> +This feature works like the regular patching mechanism. The only
> +difference is the additional ``autogen.sh`` file in the patch directory.
> +If it exists and has execution permissions, it will be called after the
> +package was patched (while the *extract* stage is running).
> +
> +Its content depends on developer needs; for the most simple case the
> +content can be:
> +
> +.. code-block:: bash
> +
> +    #!/bin/bash
> +
> +    aclocal $ACLOCAL_FLAGS
> +
> +    libtoolize \
> +            --force \
> +            --copy
> +
> +    autoreconf \
> +            --force \
> +            --install \
> +            --warnings=cross \
> +            --warnings=syntax \
> +            --warnings=obsolete \
> +            --warnings=unsupported
> +
> +.. note:: In this way not yet autotoolized package can be autotoolized. We
> +  just have to add the common autotool template files (``configure.ac``
> +  and ``Makefile.am`` for example) via a patch series to the package
> +  source and the ``autogen.sh`` to the patch directory.
> diff --git a/doc/dev_create_new_pkg_templates.rst b/doc/dev_create_new_pkg_templates.rst
> new file mode 100644
> index 000000000000..d7c2927b6846
> --- /dev/null
> +++ b/doc/dev_create_new_pkg_templates.rst
> @@ -0,0 +1,77 @@
> +Creating New Package Templates
> +------------------------------
> +
> +For larger projects it can be convenient to have project specific package
> +templates. This can be achieved by either modifying existing templates or
> +by creating completely new templates.
> +
> +Modifying a Template
> +~~~~~~~~~~~~~~~~~~~~
> +
> +A template can be modified by providing new input files. This is easier
> +than creating a new template but does not allow to specify new variables to
> +substitute in the input files.
> +
> +PTXdist looks for template files the same way it looks for rules files. The
> +only difference is, that it searches in the ``templates/`` subdirectory.
> +So a modified ``./rules/templates/template-target-make`` can be used to
> +tweak the ``target`` template.
> +
> +Creating a New Template
> +~~~~~~~~~~~~~~~~~~~~~~~
> +
> +For a completely new template, some bash scripting is required. All shell
> +code must be placed in a file named like this:
> +``./scripts/lib/ptxd_lib_*.sh``.
> +
> +The minimum requirement for a new template is:
> +-  a shell function that creates the new package
> +-  registering the new template
> +
> +.. code-block:: sh
> +
> +    ptxd_template_new_mypkg() {
> +        # create the package here
> +    }
> +    export -f ptxd_template_new_mypkg
> +    ptxd_template_help_list[${#ptxd_template_help_list[@]}]="mypkg"
> +    ptxd_template_help_list[${#ptxd_template_help_list[@]}]="create awesome mypkg package"
> +
> +PTXdist provides several helper functions to simplify the template.
> +Using those functions, the package creation process is split into two
> +parts:
> +
> +-  query the user for input and export variables.
> +-  create the new package files from the template source files by
> +   substituting all instances of ``@<variable>@`` with the value of the
> +   corresponding variable.
> +
> +A simple template function could look like this:
> +
> +.. code-block:: sh
> +
> +    ptxd_template_new_mypkg() {
> +        ptxd_template_read_basic &&
> +        ptxd_template_read "enter download section" DL_SECTION "foobar"
> +        ptxd_template_read_author &&
> +        export section="local_${dlsection}" &&
> +        ptxd_template_write_rules
> +    }
> +
> +This template requires ``rules/templates/template-mypkg-make`` and
> +``rules/templates/template-mypkg-in`` as source files. They could be
> +derived from the ``target`` template with a simple modification:
> +
> +.. code-block:: make
> +
> +    @PACKAGE@_SUFFIX	:= tar.xz
> +    @PACKAGE@_URL	:= http://dl.my-company.local/downloads/@DL_SECTION@/$(@PACKAGE@).$(@PACKAGE@_SUFFIX)
> +
> +The helper functions that are used in the example above are defined in
> +``scripts/lib/ptxd_lib_template.sh`` in the PTXdist source tree.
> +
> +The template is a normal shell function. Arbitrary things can be done here
> +to create the new package. The helper functions are just the most
> +convenient way to crate simple templates. It is also possible to create
> +more files. For examples, the builtin ``genimage`` template creates a extra
> +config file for the new package.
> diff --git a/doc/dev_dir_hierarchy.rst b/doc/dev_dir_hierarchy.rst
> new file mode 100644
> index 000000000000..bd1ad40d0c19
> --- /dev/null
> +++ b/doc/dev_dir_hierarchy.rst
> @@ -0,0 +1,108 @@
> +.. _directory_hierarchy:
> +
> +PTXdist’s Directory Hierarchy
> +-----------------------------
> +
> +.. note:: Referenced directories are meant relative to the PTXdist main
> +  installation location (if not otherwise stated). If not configured
> +  differently, this main path is ``/usr/local/lib/ptxdist-|ptxdistVendorVersion|``
> +
> +Rule Files
> +~~~~~~~~~~
> +
> +When building a single package, PTXdist needs the information on how to
> +handle the package, i.e. on how to get it from the source up to what the
> +target needs at run-time. This information is provided by a rule file per
> +package.
> +
> +PTXdist collects all rule files in its ``rules/`` directory. Whenever
> +PTXdist builds something, all these rule files are scanned at once.
> +These rule files are global rule files, valid for all projects. PTXdist
> +uses a mechanism to be able to add or replace specific rule files on a
> +per project base. If a ``rules/`` directory exists in the current
> +project, its content is scanned too. These project local rule files are
> +used in addition to the global rule files or – if they are using the
> +same name as a global rule file – **replacing** the global rule file.
> +
> +The replacing mechanism can be used to extend or adapt packages for
> +specific project requirements. Or it can be used for bug fixing by
> +backporting rule files from more recent PTXdist revisions to projects
> +that are stuck to an older PTXdist revision for maintenance only.
> +
> +Patch Series
> +~~~~~~~~~~~~
> +
> +There are many packages in the wild that are not cross build aware. They
> +fail compiling some files, use wrong include paths or try to link
> +against host libraries. To be successful in the embedded world, these
> +types of failures must be fixed. If required, PTXdist provides such
> +fixes per package. They are organized in *patch series* and can be found
> +in a ``patches/`` directory within a subdirectory using the same name
> +as the package itself.
> +
> +PTXdist uses the utility ``patch`` or ``quilt`` (or ``git`` on demand) to apply
> +an existing patch series after extracting the archive. So, every patch series
> +contains a set of patches and one ``series`` file to define the order in
> +which the patches must be applied.
> +
> +.. note:: Patches can be compressed.
> +
> +Patches are looked for at several locations:
> +
> +1.  the ``patches/`` folder in your BSP (``${PTXDIST_WORKSPACE}/patches``)
> +
> +2.  the folder ``patches/`` folder relative to your selected platformconfig
> +    file (``${PTXDIST_PLATFORMCONFIGDIR}/patches``). If your platformconfig
> +    file is at ``configs/|ptxdistPlatformConfigDir|/platformconfig``, this
> +    patch folder will be ``configs/|ptxdistPlatformConfigDir|/patches/``.
> +
> +3.  the ``patches/`` folder in PTXdist's main installation directory
> +    (``${PTXDIST_TOPDIR}/patches``)
> +
> +The list is tried from first to last.
> +If no patches were found in one of the locations, the next location is tried.
> +When all locations have been tried unsuccessfully, the package is not patched.
> +
> +This search order can be used to use specific patch series for specific
> +cases.
> +
> +-  platform specific
> +
> +-  project specific
> +
> +-  common case
> +
> +-  bug fixing
> +
> +The *bug fixing* case is used in accordance to a replacement of a rule
> +file. If this was done due to a backport, and the more recent PTXdist
> +revision does not only exchange the rule file but also the patch series,
> +this mechanism ensures that both relevant parts can be updated in the
> +project.
> +
> +Runtime Configuration
> +~~~~~~~~~~~~~~~~~~~~~
> +
> +Many packages are using run-time configuration files along with their
> +executables and libraries. PTXdist provides default configuration files
> +for the most common cases. These files can be found in the
> +``projectroot/etc`` directory and they are using the same names as the ones
> +at run-time (and their install directory on the target side will also be
> +``/etc``).
> +
> +But some of these default configuration files are empty, due to the
> +absence of a common case. The project must provide replacements of these
> +files with a more useful content in every case where the (empty) default
> +one does not meet the target’s requirements.
> +
> +PTXdist first searches in the local project directory for a specific
> +configuration file and falls back to use the default one if none exists
> +locally. Refer section :ref:`install_alternative` for further
> +details in which order and locations PTXdist searches for these kind of files.
> +
> +A popular example is the configuration file ``/etc/fstab``. The default
> +one coming with PTXdist works for the most common cases. But if our
> +project requires a special setup, we can just copy the default one to
> +the local ``./projectroot/etc/fstab``, modify it and we are done. The
> +next time PTXdist builds the root filesystem it will use the local
> +``fstab`` instead of the global (default) one.
> diff --git a/doc/dev_layers_in_ptxdist.rst b/doc/dev_layers_in_ptxdist.rst
> new file mode 100644
> index 000000000000..ec92c8c8a86c
> --- /dev/null
> +++ b/doc/dev_layers_in_ptxdist.rst
> @@ -0,0 +1,111 @@
> +.. _layers-in-ptxdist:
> +
> +Layers in PTXdist
> +-----------------
> +
> +For better maintenance or other reasons, a PTXdist project can be split
> +into multiple layers. Each layer has exactly the same directory hierarchy
> +as described in :ref:`directory_hierarchy` and other chapters.
> +
> +All layers are explicitly stacked in the filesystem. The top layer is the
> +workspace of the PTXdist project. Any ``selected_*`` links and the platform
> +build directory are created here. The layer below is defined by the
> +subdirectory or symlink named ``base/``. More can be stacked the same
> +way, so ``base/base/`` is the third layer and so on.
> +In many ways, PTXdist itself can be considered as the bottom layer. This is
> +either implicit or explicit with one last ``base/`` symlink.
> +
> +A project can overwrite files provided by PTXdist in many different ways,
> +e.g. rule files or files installed with :ref:`install_alternative` etc.
> +This concept expands naturally to layers. Each layer can overwrite files
> +provided by lower layers in the exact same way. Any files are always
> +searched for in a strict layer by layer order.
> +
> +Writing Layer Aware Rules
> +~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +For the most part, package rules work just as expected when multiple layers
> +are used. Any layer specific handling is done implicitly by PTXdist.
> +However, there are a few things that need special handling.
> +
> +The variables :ref:`PTXDIST_WORKSPACE<ptxdist_workspace>` and
> +:ref:`PTXDIST_PLATFORMCONFIGDIR`<ptxdist_platformconfigdir>` always refer
> +to the directories in the top layer. These variables might be used in rules
> +files like this:
> +
> +.. code-block:: make
> +
> +   MY_KERNEL_CONFIG := $(PTXDIST_PLATFORMCONFIGDIR)/kernelconfig.special
> +
> +If the referenced file is in any layer but the top one then it will not
> +be found. To handle use-cases like this, the macros :ref:`in_path` and
> +:ref:`in_platformconfigdir` can be used:
> +
> +.. code-block:: make
> +
> +   MY_KERNEL_CONFIG := $(call ptx/in-platformconfigdir, kernelconfig.special)
> +
> +This way, the layers are searched top to bottom until the config file is
> +found.
> +
> +PTXdist Config Files with Multiple Layers
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +In many cases a layer may want to modify the **ptxconfig** by enabling or
> +disabling some options. Any changes must be propagated through the whole
> +layer stack.
> +
> +The features and workflow described here apply to the **ptxconfig**, the
> +**platformconfig** and any **collectionconfig** used in the project.
> +
> +To do this, PTXdist stores a delta config to the layer below and a full
> +config file in each layer. If the two files are missing then the config is
> +unchanged. The bottom layer has only the config file and no delta.
> +
> +At runtime, PTXdist will always use the full config file in the top layer
> +where the config exists. Before doing so, it will ensure that the config is
> +consistent across all layers. This means that, for any layer that contains a
> +delta config, the full config file of the layer below has not changed since
> +the delta config was last updated. If any inconsistency is detected,
> +PTXdist will abort.
> +
> +For any command that modifies the config file, except ``oldconfig``,
> +PTXdist will use kconfig implicitly on all layers to check if the config
> +for this layer is up to date. This is a stricter check than the consistency
> +validation. For example, if a new package was added to a layer without
> +updating the **ptxconfig** then this will be detected and PTXdist will
> +abort. If all other layers are up to date, then PTXdist will use the delta
> +config of the top layer, apply it to the full config of the layer below
> +and execute the specified command with the resulting config file.
> +
> +.. note:: If the config file does not exist yet on the top layer, then it
> +  will be created if changes to the config are made. Similarly the config
> +  will be deleted if the delta is empty after the changes. In either case
> +  it may be necessary to update any ``selected_*`` link to point to the
> +  correct config.
> +
> +If PTXdist detects an inconsistency or an out of date config file then it
> +must be updated before they can be used. This can be done by using the
> +``oldconfig`` command. In this special case, PTXdist will iterate from the
> +bottom to the top layer and run ``oldconfig`` for each of them. It will
> +use the delta config applied to the full config of the layer below at each
> +step. This means that it's possible to enable or disable a option in the
> +bottom layer and ``oldconfig`` will propagate this change to all other
> +layers.
> +
> +Packages with kconfig Based Config Files
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +For packages such as the Linux kernel that have kconfig based config files,
> +a lot of the infrastructure to handle config files and deltas across
> +multiple layers can be reused. Consistency validation is done implicitly
> +and ``menuconfig`` and other kconfig commands will use config files and
> +deltas as expected.
> +
> +It's not possible to implicitly run ``oldconfig`` on other layers (this may
> +require a different source tree for the packages), so any inconsistencies
> +must be resolved manually by running ``oldconfig`` explicitly on each
> +layer.
> +
> +The make macros that provide these features are currently used by the
> +barebox and kernel packages and templates.
> diff --git a/doc/dev_manual.rst b/doc/dev_manual.rst
> index 50827b6a9cdd..47a77a9be62f 100644
> --- a/doc/dev_manual.rst
> +++ b/doc/dev_manual.rst
> @@ -5,1758 +5,12 @@ PTXdist Developer’s Manual
>  
>  This chapter shows all (or most) of the details of how PTXdist works.
>  
> --  where are the files stored that PTXdist uses when building packages
> -
> --  how patching works
> -
> --  where is PTXdist fetching a package’s run-time configuration files
> -   from
> -
> --  how to control a package’s build stages
> -
> --  how to add new packages
> -
> -.. _directory_hierarchy:
> -
> -PTXdist’s Directory Hierarchy
> ------------------------------
> -
> -.. note:: Referenced directories are meant relative to the PTXdist main
> -  installation location (if not otherwise stated). If not configured
> -  differently, this main path is ``/usr/local/lib/ptxdist-|ptxdistVendorVersion|``
> -
> -Rule Files
> -~~~~~~~~~~
> -
> -When building a single package, PTXdist needs the information on how to
> -handle the package, i.e. on how to get it from the source up to what the
> -target needs at run-time. This information is provided by a rule file per
> -package.
> -
> -PTXdist collects all rule files in its ``rules/`` directory. Whenever
> -PTXdist builds something, all these rule files are scanned at once.
> -These rule files are global rule files, valid for all projects. PTXdist
> -uses a mechanism to be able to add or replace specific rule files on a
> -per project base. If a ``rules/`` directory exists in the current
> -project, its content is scanned too. These project local rule files are
> -used in addition to the global rule files or – if they are using the
> -same name as a global rule file – **replacing** the global rule file.
> -
> -The replacing mechanism can be used to extend or adapt packages for
> -specific project requirements. Or it can be used for bug fixing by
> -backporting rule files from more recent PTXdist revisions to projects
> -that are stuck to an older PTXdist revision for maintenance only.
> -
> -Patch Series
> -~~~~~~~~~~~~
> -
> -There are many packages in the wild that are not cross build aware. They
> -fail compiling some files, use wrong include paths or try to link
> -against host libraries. To be successful in the embedded world, these
> -types of failures must be fixed. If required, PTXdist provides such
> -fixes per package. They are organized in *patch series* and can be found
> -in a ``patches/`` directory within a subdirectory using the same name
> -as the package itself.
> -
> -PTXdist uses the utility ``patch`` or ``quilt`` (or ``git`` on demand) to apply
> -an existing patch series after extracting the archive. So, every patch series
> -contains a set of patches and one ``series`` file to define the order in
> -which the patches must be applied.
> -
> -.. note:: Patches can be compressed.
> -
> -Patches are looked for at several locations:
> -
> -1.  the ``patches/`` folder in your BSP (``${PTXDIST_WORKSPACE}/patches``)
> -
> -2.  the folder ``patches/`` folder relative to your selected platformconfig
> -    file (``${PTXDIST_PLATFORMCONFIGDIR}/patches``). If your platformconfig
> -    file is at ``configs/|ptxdistPlatformConfigDir|/platformconfig``, this
> -    patch folder will be ``configs/|ptxdistPlatformConfigDir|/patches/``.
> -
> -3.  the ``patches/`` folder in PTXdist's main installation directory
> -    (``${PTXDIST_TOPDIR}/patches``)
> -
> -The list is tried from first to last.
> -If no patches were found in one of the locations, the next location is tried.
> -When all locations have been tried unsuccessfully, the package is not patched.
> -
> -This search order can be used to use specific patch series for specific
> -cases.
> -
> --  platform specific
> -
> --  project specific
> -
> --  common case
> -
> --  bug fixing
> -
> -The *bug fixing* case is used in accordance to a replacement of a rule
> -file. If this was done due to a backport, and the more recent PTXdist
> -revision does not only exchange the rule file but also the patch series,
> -this mechanism ensures that both relevant parts can be updated in the
> -project.
> -
> -Runtime Configuration
> -~~~~~~~~~~~~~~~~~~~~~
> -
> -Many packages are using run-time configuration files along with their
> -executables and libraries. PTXdist provides default configuration files
> -for the most common cases. These files can be found in the
> -``projectroot/etc`` directory and they are using the same names as the ones
> -at run-time (and their install directory on the target side will also be
> -``/etc``).
> -
> -But some of these default configuration files are empty, due to the
> -absence of a common case. The project must provide replacements of these
> -files with a more useful content in every case where the (empty) default
> -one does not meet the target’s requirements.
> -
> -PTXdist first searches in the local project directory for a specific
> -configuration file and falls back to use the default one if none exists
> -locally. Refer section :ref:`install_alternative` for further
> -details in which order and locations PTXdist searches for these kind of files.
> -
> -A popular example is the configuration file ``/etc/fstab``. The default
> -one coming with PTXdist works for the most common cases. But if our
> -project requires a special setup, we can just copy the default one to
> -the local ``./projectroot/etc/fstab``, modify it and we are done. The
> -next time PTXdist builds the root filesystem it will use the local
> -``fstab`` instead of the global (default) one.
> -
> -.. _adding_new_packages:
> -
> -Adding New Packages
> --------------------
> -
> -PTXdist provides a huge amount of applications sufficient for the most
> -embedded use cases. But there is still need for some fancy new packages.
> -This section describes the steps and the background on how to integrate
> -new packages into the project.
> -
> -At first a summary about possible application types which PTXdist can
> -handle:
> -
> --  **host type**: This kind of package is built to run on the build
> -   host. Most of the time such a package is needed if another
> -   target-relevant package needs to generate some data. For example the
> -   *glib* package depends on its own to create some data. But if it is
> -   compiled for the target, it can’t do so. That’s why a host glib
> -   package is required to provide these utilities runnable on the build
> -   host. It sounds strange to build a host package, even if on the build
> -   host such utilities are already installed. But this way ensures that
> -   there are no dependencies regarding the build host system.
> -
> --  **target type**: This kind of package is built for the target.
> -
> --  **cross type**: This kind of package is built for the build host, but
> -   creates architecture specific data for the target.
> -
> --  **src-autoconf-prog**: This kind of package is built for the target.
> -   It is intended for development, as it does not handle a released
> -   archive but a plain source project instead. Creating such a package
> -   will also create a small autotools based source template project on
> -   demand to give the developer an easy point to start. This template is
> -   prepared to build a single executable program. For further details refer
> -   section :ref:`adding_src_autoconf_exec`.
> -
> --  **src-autoconf-lib**: This kind of package is built for the target.
> -   It is intended for development, as it does not handle a released
> -   archive but a plain source project instead. Creating such a package
> -   will also create a small autotools/libtool based source template
> -   project on demand to give the developer an easy point to start. This
> -   template is prepared to build a single shared library. For further
> -   details refer section :ref:`adding_src_autoconf_lib`.
> -
> --  **src-autoconf-proglib**: This kind of package is built for the
> -   target. It is intended for development, as it does not handle a
> -   released archive but a plain source project instead. Creating such a
> -   package will also create a small autotools/libtool based template
> -   project on demand to give the developer an easy point to start. This
> -   template is prepared to build a single shared library and a single
> -   executable program. The program will be linked against the shared
> -   library. For further details refer section :ref:`adding_src_autoconf_exec_lib`.
> -
> --  **file**: This kind of package is intended to add a few simple files
> -   into the build process. We assume these files do not need any
> -   processing, they are ready to use and must only be present in the
> -   build process or at run-time (HTML files for example). Refer to the
> -   section :ref:`adding_files` for further details on how to use
> -   it.
> -
> --  **src-make-prog**: This kind of package is built for the target. It’s
> -   intended for development, as it does not handle a released archive
> -   but a plain source project instead. Creating such a package will also
> -   create a simple makefile-based template project the developer can use
> -   as a starting point for development.
> -
> --  **src-cmake-prog**: This kind of package is built for the target.
> -   It’s intended for developments based on the *cmake* buildsystem.
> -   Various projects are using *cmake* instead of *make* and can be built
> -   with this package type. PTXdist will prepare it to compile sources in
> -   accordance to the target libraries and their settings. Creating such
> -   a package will also create a simple template project to be used as a
> -   starting point for development.
> -
> --  **src-qmake-prog**: This kind of package is built for the target.
> -   It’s intended for developments based on the *qmake* buildsystem. If
> -   the developer is going to develop a QT based application, this rule
> -   is prepared to compile sources in accordance to the target libraries
> -   and their settings. Creating such a package will also create a simple
> -   template project to be used as a starting point for development.
> -
> --  **src-meson-prog**: This kind of package is built for the target.
> -   It’s intended for developments based on the *meson* buildsystem.
> -   Various projects are using *meson* today and can be built
> -   with this package type. PTXdist will prepare it to compile sources in
> -   accordance to the target libraries and their settings. Creating such
> -   a package will also create a simple template project to be used as a
> -   starting point for development.
> -
> --  **font**: This package is a helper to add X font files to the root
> -   filesystem. This package does not create an additional IPKG, instead
> -   it adds the font to the existing font IPKG. This includes the
> -   generation of the directory index files, required by the Xorg
> -   framework to recognize the font file.
> -
> --  **src-linux-driver**: This kind of package builds an out of tree
> -   kernel driver. It also creates a driver template to give the
> -   developer an easy point to start.
> -
> --  **kernel**: PTXdist comes with the ability to handle one kernel in its
> -   platform. This type of package enables us to handle more than one kernel in
> -   the project.
> -
> --  **barebox**: PTXdist comes with the ability to handle one bootloader in its
> -   platform. This type of package enables us to handle more than one bootloader
> -   in the project.
> -
> --  **image-tgz**: This kind of package creates a tar ball from a list of
> -   packages. It is often uses as an input for other image packages.
> -
> --  **image-genimage**: This kind of package can handle all kind of image
> -   generation for almost every target independent of its complexity.
> -
> --  **blspec-entry**: PTXdist comes with the ability to handle one bootspec in its
> -   platform. This type of package enables us to handle more than one bootspec
> -   in the project.
> -
> -.. _foo_example:
> -
> -Rule File Creation
> -~~~~~~~~~~~~~~~~~~
> -
> -To create such a new package, we create a project local ``rules/``
> -directory first. Then we run
> -
> -.. code-block:: text
> -
> -    $ ptxdist newpackage <package type>
> -
> -If we omit the <``package type``\ >, PTXdist will list all available
> -package types.
> -
> -In our first example, we want to add a new target type archive package.
> -When running the
> -
> -.. code-block:: text
> -
> -    $ ptxdist newpackage target
> -
> -command, PTXdist asks a few questions about this package. This
> -information is the basic data PTXdist must know about the package.
> -
> -.. code-block:: text
> -
> -    ptxdist: creating a new 'target' package:
> -
> -    ptxdist: enter package name.......: foo
> -    ptxdist: enter version number.....: 1.1.0
> -    ptxdist: enter URL of basedir.....: http://www.foo.com/download/src
> -    ptxdist: enter suffix.............: tar.gz
> -    ptxdist: enter package author.....: My Name <me@my-org.com>
> -    ptxdist: enter package section....: project_specific
> -
> -What we have to answer:
> -
> --  **package name**: As this kind of package handles a source archive,
> -   the correct answer here is the basename of the archive’s file name.
> -   If its full name is ``foo-1.1.0.tar.gz``, then ``foo`` is the
> -   basename to enter here.
> -
> --  **version number**: Most source archives are using a release or
> -   version number in their file name. If its full name is
> -   ``foo-1.1.0.tar.gz``, then ``1.1.0`` is the version number to enter
> -   here.
> -
> --  **URL of basedir**: This URL tells PTXdist where to download the
> -   source archive from the web (if not already done). If the full URL to
> -   download the archive is
> -   ``http://www.foo.com/download/src/foo-1.1.0.tar.gz``, the basedir
> -   part ``http://www.foo.com/download/src`` is to be entered here.
> -
> --  **suffix**: Archives are using various formats for distribution.
> -   PTXdist uses the *suffix* entry to select the matching extraction
> -   tool. If the archive’s full name is ``foo-1.1.0.tar.gz``, then
> -   ``tar.gz`` is the suffix to enter here.
> -
> --  **package author**: If we intend to contribute this new package to
> -   PTXdist mainline, we should add our name here. This name will be used
> -   in the copyright note of the rule file and will also be added to the
> -   generated ipkg. When you run ``ptxdist setup`` prior to this call,
> -   you can enter your name and your email address, so PTXdist will use
> -   it as the default (very handy if you intend to add many new
> -   packages).
> -
> --  **package section**: We can enter here the menu section name where
> -   our new package menu entry should be listed. In the first step we can
> -   leave the default name unchanged. It’s a string in the menu file
> -   only, so changing it later on is still possible.
> -
> -Make it Work
> -~~~~~~~~~~~~
> -
> -Generating the rule file is only one of the required steps to get a new
> -package. The next steps to make it work are to check if all stages are
> -working as expected and to select the required parts to get them
> -installed in the target root filesystem. Also we must find a reasonable
> -location where to add our new menu entry to configure the package.
> -
> -The generated skeleton starts to add the new menu entry in the main
> -configure menu (if we left the section name unchanged). Running
> -``ptxdist menuconfig`` will show it on top of all other menus entries.
> -
> -.. important:: 
> -  To be able to implement and test all the other required steps for adding
> -  a new package, we first must enable the package for building. (Fine
> -  tuning the menu can happen later on.)
> -
> -
> -The rule file skeleton still lacks some important information. Let’s
> -take a look into some of the top lines of the generated rule file
> -``./rules/foo.make``:
> -
> -.. code-block:: make
> -
> -    FOO_VERSION	:= 1.1.0
> -    FOO_MD5	:=
> -    FOO		:= foo-$(FOO_VERSION)
> -    FOO_SUFFIX	:= tar.gz
> -    FOO_URL	:= http://www.foo.com/download/src/$(FOO).$(FOO_SUFFIX)
> -    FOO_SOURCE	:= $(SRCDIR)/$(FOO).$(FOO_SUFFIX)
> -    FOO_DIR	:= $(BUILDDIR)/$(FOO)
> -    FOO_LICENSE	:= unknown
> -
> -We can find these lines with different content in most or all of the
> -other rule files PTXdist comes with. Up to the underline character is
> -always the package name and after the underline character is always
> -PTXdist specific. What does it mean:
> -
> --  ``*_VERSION`` brings in the version number of the release and is used
> -   for the download and IPKG/OPKG package generation.
> -
> --  ``*_MD5`` to be sure the correct package has been downloaded, PTXdist
> -   checks the given MD5 sum against the archive content. If both sums do
> -   not match, PTXdist rejects the archive and fails the currently
> -   running build.
> -
> --  ``*_SUFFIX`` defines the archive type, to make PTXdist choosing the
> -   correct extracting tool.
> -
> --  ``*_URL`` defines the full qualified URL into the web for download. If
> -   alternative download locations are known, they can be listed in this
> -   variable, delimiter character is the space.
> -
> --  ``*_SOURCE`` tells PTXdist where to store the downloaded package.
> -
> --  ``*_DIR`` points to the directory this package will be built later on
> -   by PTXdist.
> -
> --  ``*_LICENSE`` enables the user to get a list of licenses she/he is
> -   using in her/his project (licenses of the enabled packages).
> -
> -After enabling the menu entry, we can start to check the *get* and
> -*extract* stages, calling them manually one after another.
> -
> -.. note:: The shown commands below expect that PTXdist downloads the
> -  archives to a global directory named ``global_src``. This is not the
> -  default setting, but we recommend to use a global directory to share all
> -  archives between PTXdist based projects. Advantage is every download
> -  happens only once. Refer to the ``setup`` command PTXdist provides.
> -
> -.. code-block:: text
> -
> -    $ ptxdist get foo
> -
> -    ---------------------------
> -    target: foo-1.1.0.tar.gz
> -    ---------------------------
> -
> -    --2009-12-21 10:54:45--  http://www.foo.com/download/src/foo-1.1.0.tar.gz
> -    Length: 291190 (284K) [application/x-gzip]
> -    Saving to: `/global_src/foo-1.1.0.tar.gz.XXXXOGncZA'
> -
> -    100%[======================================>] 291,190      170K/s   in 1.7s
> -
> -    2009-12-21 10:54:48 (170 KB/s) - `/global_src/foo-1.1.0.tar.gz' saved [291190/291190]
> -
> -This command should start to download the source archive. If it fails,
> -we should check our network connection, proxy setup or if the given URL
> -in use is correct.
> -
> -.. note:: Sometimes we do not know the content of all the other variables in
> -  the rule file. To get an idea what content a variable has, we can ask
> -  PTXdist about it:
> -
> -.. code-block:: text
> -
> -    $ ptxdist print FOO_URL
> -    http://www.foo.com/download/src/foo-1.1.0.tar.gz
> -
> -The next step would be to extract the archive. But as PTXdist checks the
> -MD5 sum in this case, this step will fail, because the ``FOO_MD5``
> -variable is still empty. Let’s fill it:
> -
> -.. code-block:: text
> -
> -    $ md5sum /global_src/foo-1.1.0.tar.gz
> -    9a09840ab775a139ebb00f57a587b447
> -
> -This string must be assigned to the FOO_MD5 in our new ``foo.make``
> -rule file:
> -
> -.. code-block:: text
> -
> -    FOO_MD5		:= 9a09840ab775a139ebb00f57a587b447
> -
> -We are now prepared for the next step:
> -
> -.. code-block:: text
> -
> -    $ ptxdist extract foo
> -
> -    -----------------------
> -    target: foo.extract
> -    -----------------------
> -
> -    extract: archive=/global_src/foo-1.1.0.tar.gz
> -    extract: dest=/home/jbe/my_new_prj/build-target
> -    PATCHIN: packet=foo-1.1.0
> -    PATCHIN: dir=/home/jbe/my_new_prj/build-target/foo-1.1.0
> -    PATCHIN: no patches for foo-1.1.0 available
> -    Fixing up /home/jbe/my_new_prj/build-target/foo-1.1.0/configure
> -    finished target foo.extract
> -
> -In this example we expect an autotoolized source package. E.g. to
> -prepare the build, the archive comes with a ``configure`` script. This
> -is the default case for PTXdist. So, there is no need to modify the rule
> -file and we can simply run:
> -
> -.. code-block:: text
> -
> -    $ ptxdist prepare foo
> -
> -    -----------------------
> -    target: foo.prepare
> -    -----------------------
> -
> -    [...]
> -
> -    checking build system type... i686-host-linux-gnu
> -    checking host system type... |ptxdistCompilerName|
> -    checking whether to enable maintainer-specific portions of Makefiles... no
> -    checking for a BSD-compatible install... /usr/bin/install -c
> -    checking whether build environment is sane... yes
> -    checking for a thread-safe mkdir -p... /bin/mkdir -p
> -    checking for gawk... gawk
> -    checking whether make sets $(MAKE)... yes
> -    checking for |ptxdistCompilerName|-strip... |ptxdistCompilerName|-strip
> -    checking for |ptxdistCompilerName|-gcc... |ptxdistCompilerName|-gcc
> -    checking for C compiler default output file name... a.out
> -
> -    [...]
> -
> -    configure: creating ./config.status
> -    config.status: creating Makefile
> -    config.status: creating ppa_protocol/Makefile
> -    config.status: creating config.h
> -    config.status: executing depfiles commands
> -    finished target foo.prepare
> -
> -At this stage things can fail:
> -
> --  A wrong or no MD5 sum was given
> -
> --  The ``configure`` script is not cross compile aware
> -
> --  The package depends on external components (libraries for example)
> -
> -If the ``configure`` script is not cross compile aware, we are out of
> -luck. We must patch the source archive in this case to make it work.
> -Refer to the section :ref:`configure_rebuild` on how to use
> -PTXdist’s features to simplify this task.
> -If the package depends on external components, these components might
> -be already part of PTXdist. In this case we just have to add this
> -dependency into the menu file and we are done. But if PTXdist cannot
> -fulfill this dependency, we also must add it as a separate package
> -first.
> -
> -If the *prepare* stage has finished successfully, the next step is to
> -compile the package.
> -
> -.. code-block:: text
> -
> -    $ ptxdist compile foo
> -
> -    -----------------------
> -    target: foo.compile
> -    -----------------------
> -
> -    make[1]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make  all-recursive
> -    make[2]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[3]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -
> -    [...]
> -
> -    make[3]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[2]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[1]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    finished target foo.compile
> -
> -At this stage things can fail:
> -
> --  The build system is not cross compile aware (it tries to execute just
> -   created target binaries for example)
> -
> --  The package depends on external components (libraries for example)
> -   not detected by ``configure``
> -
> --  Sources are ignoring the endianness of some architectures or using
> -   header files from the build host system (from ``/usr/include`` for
> -   example)
> -
> --  The linker uses libraries from the build host system (from
> -   ``/usr/lib`` for example) by accident
> -
> -In all of these cases we must patch the sources to make them work. Refer
> -to section :ref:`patching_packages` on how to use PTXdist’s
> -features to simplify this task.
> -
> -In this example we expect the best case: everything went fine, even for
> -cross compiling. So, we can continue with the next stage: *install*
> -
> -.. code-block:: text
> -
> -    $ ptxdist install foo
> -
> -    -----------------------
> -    target: foo.install
> -    -----------------------
> -
> -    make[1]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[2]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[3]: Entering directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    test -z "/usr/bin" || /bin/mkdir -p "/home/jbe/my_new_prj/build-target/foo-1.1.0/usr/bin"
> -      /usr/bin/install -c 'foo' '/home/jbe/my_new_prj/build-target/foo-1.1.0/usr/bin/foo'
> -    make[3]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[2]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    make[1]: Leaving directory `/home/jbe/my_new_prj/build-target/foo-1.1.0'
> -    finished target foo.install
> -
> -    ----------------------------
> -    target: foo.install.post
> -    ----------------------------
> -
> -    finished target foo.install.post
> -
> -This *install* stage does not install anything to the target root
> -filesystem. It is mostly intended to install libraries and header files
> -other programs should link against later on.
> -
> -The last stage – *targetinstall* – is the one that defines the package’s
> -components to be forwarded to the target’s root filesystem. Due to the
> -absence of a generic way, this is the task of the developer. So, at this
> -point of time we must run our favourite editor again and modify our new
> -rule file ``./rules/foo.make``.
> -
> -The skeleton for the *targetinstall* stage looks like this:
> -
> -.. code-block:: make
> -
> -    # ----------------------------------------------------------------------------
> -    # Target-Install
> -    # ----------------------------------------------------------------------------
> -
> -    $(STATEDIR)/foo.targetinstall:
> -    	@$(call targetinfo)
> -
> -    	@$(call install_init,  foo)
> -    	@$(call install_fixup, foo,PACKAGE,foo)
> -    	@$(call install_fixup, foo,PRIORITY,optional)
> -    	@$(call install_fixup, foo,VERSION,$(FOO_VERSION))
> -    	@$(call install_fixup, foo,SECTION,base)
> -    	@$(call install_fixup, foo,AUTHOR,"My Name <me@my-org.com>")
> -    	@$(call install_fixup, foo,DEPENDS,)
> -    	@$(call install_fixup, foo,DESCRIPTION,missing)
> -
> -    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foobar, /dev/null)
> -
> -    	@$(call install_finish, foo)
> -    	@$(call touch)
> -
> -The “header” of this stage defines some information IPKG needs. The
> -important part that we must modify is the call to the ``install_copy``
> -macro (refer to section :ref:`reference_macros` for more details
> -about this kind of macros). This call instructs PTXdist to include the
> -given file (with UID, GID and permissions) into the IPKG, which means to
> -install this file to the target’s root filesystem.
> -
> -From the previous *install* stage we know this package installs an
> -executable called ``foo`` to location ``/usr/bin``. We can do the same
> -for our target by changing the *install\_copy* line to:
> -
> -.. code-block:: none
> -
> -    @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
> -
> -To check it, we just run:
> -
> -.. code-block:: text
> -
> -    $ ptxdist targetinstall foo
> -
> -    -----------------------------
> -    target: foo.targetinstall
> -    -----------------------------
> -
> -    install_init:   preparing for image creation...
> -    install_init:   @ARCH@ -> i386 ... done
> -    install_init:   preinst not available
> -    install_init:   postinst not available
> -    install_init:   prerm not available
> -    install_init:   postrm not available
> -    install_fixup:  @PACKAGE@ -> foo ... done.
> -    install_fixup:  @PRIORITY@ -> optional ... done.
> -    install_fixup:  @VERSION@ -> 1.1.0 ... done.
> -    install_fixup:  @SECTION@ -> base ... done.
> -    install_fixup:  @AUTHOR@ -> "My Name <me\@my-org.com>" ... done.
> -    install_fixup:  @DESCRIPTION@ -> missing ... done.
> -    install_copy:
> -      src=/home/jbe/my_new_prj/build-target/foo-1.1.0/foo
> -      dst=/usr/bin/foo
> -      owner=0
> -      group=0
> -      permissions=0755
> -    xpkg_finish:    collecting license (unknown) ... done.
> -    xpkg_finish:    creating ipkg package ... done.
> -    finished target foo.targetinstall
> -
> -    ----------------------------------
> -    target: foo.targetinstall.post
> -    ----------------------------------
> -
> -    finished target foo.targetinstall.post
> -
> -After this command, the target’s root filesystem contains a file called
> -``/usr/bin/foo`` owned by root, its group is also root and everyone has
> -execution permissions, but only the user root has write permissions.
> -
> -One last task of this port is still open: A reasonable location for
> -the new menu entry in PTXdist’s menu hierarchy. PTXdist arranges its
> -menus on the meaning of each package. Is it a network related tool? Or
> -a scripting language? Or a graphical application?
> -Each of these global meanings has its own submenu, where we can add
> -our new entry to. We just have to edit the head of our new menu file
> -``./rules/foo.in`` to add it to a specific global menu. If our new
> -package is a network related tool, the head of the menu file should
> -look like:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=networking
> -
> -We can grep through the other menu files from the PTXdist main
> -installation ``rules/`` directory to get an idea what section names are
> -available:
> -
> -.. code-block:: text
> -
> -    rules/ $ find . -name \*.in | xargs grep "## SECTION"
> -    ./acpid.in:## SECTION=shell_and_console
> -    ./alsa-lib.in:## SECTION=system_libraries
> -    ./alsa-utils.in:## SECTION=multimedia_sound
> -    ./apache2.in:## SECTION=networking
> -    ./apache2_mod_python.in:## SECTION=networking
> -    [...]
> -    ./xkeyboard-config.in:## SECTION=multimedia_xorg_data
> -    ./xorg-app-xev.in:## SECTION=multimedia_xorg_app
> -    ./xorg-app-xrandr.in:## SECTION=multimedia_xorg_app
> -    ./host-eggdbus.in:## SECTION=hosttools_noprompt
> -    ./libssh2.in:## SECTION=networking
> -
> -Porting a new package to PTXdist is (almost) finished now.
> -
> -To check it right away, we simply run these two commands:
> -
> -.. code-block:: text
> -
> -    $ ptxdist clean foo
> -    rm -rf /home/jbe/my_new_prj/state/foo.*
> -    rm -rf /home/jbe/my_new_prj/packages/foo_*
> -    rm -rf /home/jbe/my_new_prj/build-target/foo-1.1.0
> -    $ ptxdist targetinstall foo
> -
> -    [...]
> -
> -.. important:: Discover somehow hidden dependencies with one more last check!
> -
> -Up to this point all the development of the new package was done in an already
> -built BSP. Doing so sometimes somehow hidden dependencies cannot be seen:
> -everything seems fine, the new package builds always successfully and the
> -results are working on the target.
> -
> -So to check for this kind of dependencies there is still one more final check
> -to do (even if its boring and takes time):
> -
> -.. code-block:: text
> -
> -    $ ptxdist clean
> -    [...]
> -    $ ptxdist targetinstall foo
> -    [...]
> -
> -This will re-start with a **clean** BSP and builds exactly the new package and
> -its (known) dependencies. If this builds successfully as well we are really done
> -with the new package.
> -
> -Some Notes about Licenses
> -~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -The already mentioned rule variable ``*_LICENSE`` (e.g. ``FOO_LICENSE`` in our
> -example) is very important and must be filled by the developer of the package.
> -Many licenses bring in obligations using the corresponding package (*attribution*
> -for example). To make life easier for everybody the license for a package must
> -be provided. *SPDX* license identifiers unify the license names and are used
> -in PTXdist to identify license types and obligations.
> -
> -If a package comes with more than one license, all of their SPDX identifiers
> -must be listed and connected with the keyword ``AND``. If your package comes
> -with GPL-2.0 and LGPL-2.1 licenses, the definition should look like this:
> -
> -.. code-block:: make
> -
> -   FOO_LICENSE := GPL-2.0 AND LGPL-2.1
> -
> -One specific obligation cannot be detected examining the SPDX license identifiers
> -by PTXdist: *the license choice*. In this case all licenses of choice must be
> -listed and connected by the keyword ``OR``.
> -
> -If, for example, your obligation is to select one of the licenses *GPL-2.0* **or**
> -*GPL-3.0*, the ``*_LICENSE`` variable should look like this:
> -
> -.. code-block:: make
> -
> -   FOO_LICENSE := GPL-2.0 OR GPL-3.0
> -
> -SPDX License Identifiers
> -^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -A list of SPDX license identifiers can be found here:
> -
> -   https://spdx.org/licenses/
> -
> -Help to Detect the Correct License
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -License identification isn't trivial. A help in doing so can be the following
> -repository and its content. It contains a list of known licenses based on their
> -SPDX identifier. The content is without formatting to simplify text search.
> -
> -   https://github.com/spdx/license-list-data/tree/master/text
> -
> -Advanced Rule Files
> -~~~~~~~~~~~~~~~~~~~
> -
> -The previous example on how to create a rule file sometimes works as
> -shown above. But most of the time source archives are not that simple.
> -In this section we want to give the user a more detailed selection how
> -the package will be built.
> -
> -Adding Static Configure Parameters
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -The ``configure`` scripts of various source archives provide additional
> -parameters to enable or disable features, or to configure them in a
> -specific way.
> -
> -We assume the ``configure`` script of our ``foo`` example (refer to
> -section :ref:`foo_example`) supports two additional parameters:
> -
> --  **--enable-debug**: Make the program more noisy. It’s disabled by
> -   default.
> -
> --  **--with-bar**: Also build the special executable **bar**. Building
> -   this executable is also disabled by default.
> -
> -We now want to forward these options to the ``configure`` script when it
> -runs in the *prepare* stage. To do so, we must again open the rule file
> -with our favourite editor and navigate to the *prepare* stage entry.
> -
> -PTXdist uses the variable ``FOO_CONF_OPT`` as the list of parameters to
> -be given to ``configure``.
> -
> -Currently this variable is commented out and defined to:
> -
> -.. code-block:: make
> -
> -    # FOO_CONF_OPT := $(CROSS_AUTOCONF_USR)
> -
> -The variable ``CROSS_AUTOCONF_USR`` is predefined by PTXdist and
> -contains all basic parameters to instruct ``configure`` to prepare for a
> -**cross** compile environment.
> -
> -To use the two additional mentioned ``configure`` parameters, we comment
> -in this line and supplement this expression as follows:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_OPT := \
> -        $(CROSS_AUTOCONF_USR) \
> -        --enable-debug \
> -        --with-bar
> -
> -.. note:: We recommend to use this format with each parameter on a line of
> - its own. This format is easier to read and a diff shows more exactly any
> - change.
> -
> -To do a fast check if this addition was successful, we run:
> -
> -.. code-block:: text
> -
> -    $ ptxdist print FOO_CONF_OPT
> -    --prefix=/usr --sysconfdir=/etc --host=|ptxdistCompilerName| --build=i686-host-linux-gnu --enable-debug --with-bar
> -
> -.. note:: It depends on the currently selected platform and its architecture
> - what content this variable will have. The content shown above is an
> - example for a target.
> -
> -Or re-build the package with the new settings:
> -
> -.. code-block:: text
> -
> -    $ ptxdist drop foo prepare
> -    $ ptxdist targetinstall foo
> -
> -Adding Dynamic Configure Parameters
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -Sometimes it makes sense to add this kind of parameters on demand only;
> -especially a parameter like ``--enable-debug``. To let the user decide
> -if this parameter is to be used or not, we must add a menu entry. So,
> -let’s expand our menu. Here is its current content:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=project_specific
> -
> -    config FOO
> -            tristate
> -            prompt "foo"
> -            help
> -              FIXME
> -
> -We’ll add two menu entries, one for each optional parameter we want to
> -add on demand to the ``configure`` parameters:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=project_specific
> -
> -    config FOO
> -           tristate
> -           prompt "foo"
> -           help
> -             FIXME
> -
> -    if FOO
> -    config FOO_DEBUG
> -           bool
> -           prompt "add debug noise"
> -
> -    config FOO_BAR
> -           bool
> -           prompt "build bar"
> -
> -    endif
> -
> -.. important:: Always follow the rule to extend the base name by a suboption
> -  name as the trailing part of the variable name. This gives PTXdist the ability
> -  to detect a change in the package’s settings (via menuconfig) to force its
> -  rebuild on demand.
> -
> -To make usage of the new menu entries, we must check them in the rule
> -file and add the correct parameters:
> -
> -.. code-block:: make
> -
> -    #
> -    # autoconf
> -    #
> -    FOO_CONF_OPT := \
> -        $(CROSS_AUTOCONF_USR) \
> -        --$(call ptx/endis, PTXCONF_FOO_DEBUG)-debug \
> -        --$(call ptx/wwo, PTXCONF_FOO_BAR)-bar
> -
> -.. important:: Please note the leading ``PTXCONF_`` for each define. While Kconfig is
> -  using ``FOO_BAR``, the rule file must use ``PTXCONF_FOO_BAR`` instead.
> -
> -.. note:: Refer :ref:`Rule File Macro Reference <param_macros>` for further
> -   details about these special kind of option macros (e.g. ``ptx/...``).
> -
> -It is a good practice to always add both settings, e.g. ``--disable-debug``
> -even if this is the default case. Sometimes ``configure`` tries to guess
> -something and the binary result might differ depending on the build
> -order. For example some kind of package would also build some X related
> -tools, if X libraries are found. In this case it depends on the build
> -order, if the X related tools are built or not. All the autocheck
> -features are problematic here. So, if we do not want ``configure`` to
> -guess its settings we **must disable everything we do not want**.
> -
> -To support this process, PTXdist supplies a helper script, located at
> -``/path/to/ptxdist/scripts/configure-helper.py`` that compares the configure
> -output with the settings from ``FOO_CONF_OPT``:
> -
> -.. code-block:: text
> -
> -    $ /opt/ptxdist-2017.06.0/scripts/configure-helper.py -p libsigrok
> -    --- rules/libsigrok.make
> -    +++ libsigrok-0.5.0
> -    @@ -4,3 +4,74 @@
> -     	--libdir=/usr/lib
> -     	--build=x86_64-host-linux-gnu
> -     	--host=arm-v7a-linux-gnueabihf
> -    +	--enable-warnings=min|max|fatal|no
> -    +	--disable-largefile
> -    +	--enable-all-drivers
> -    +	--enable-agilent-dmm
> -    [...]
> -    +	--enable-ruby
> -    +	--enable-java
> -    +	--without-libserialport
> -    +	--without-libftdi
> -    +	--without-libusb
> -    +	--without-librevisa
> -    +	--without-libgpib
> -    +	--without-libieee1284
> -    +	--with-jni-include-path=DIR-LIST
> -
> -In this example, many configure options from libsigrok (marked with ``+``)
> -are not yet present in ``LIBSIGROK_CONF_OPT`` and must be added, possibly also
> -by providing more dynamic options in the package definition.
> -
> -If some parts of a package are built on demand only, they must also be
> -installed on demand only. Besides the *prepare* stage, we also must
> -modify our *targetinstall* stage:
> -
> -.. code-block:: make
> -
> -    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
> -
> -    ifdef PTXCONF_FOO_BAR
> -    	@$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/bar, /usr/bin/bar)
> -    endif
> -
> -    	@$(call install_finish, foo)
> -    	@$(call touch)
> -
> -Now we can play with our new menu entries and check if they are working
> -as expected:
> -
> -.. code-block:: text
> -
> -    $ ptxdist menuconfig
> -    $ ptxdist targetinstall foo
> -
> -Whenever we change a *FOO* related menu entry, PTXdist should detect it
> -and re-build the package when a new build is started.
> -
> -.. _external_dependencies:
> -
> -Managing External Compile Time Dependencies
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -While running the prepare stage, it could happen that it fails due to a
> -missing external dependency.
> -
> -For example:
> -
> -.. code-block:: text
> -
> -    checking whether zlib exists....failed
> -
> -In this example, our new package depends on the compression library
> -*zlib*. PTXdist comes with a target *zlib*. All we need to do in this
> -case is to declare that our new package *foo* depends on *zlib*. This
> -kind of dependency is managed in the menu file of our new package by
> -simply adding the ``select ZLIB`` line. After this addition our menu
> -file looks like:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=project_specific
> -
> -    config FOO
> -           tristate
> -           select ZLIB
> -           prompt "foo"
> -           help
> -             FIXME
> -
> -    if FOO
> -    config FOO_DEBUG
> -           bool
> -           prompt "add debug noise"
> -
> -    config FOO_BAR
> -           bool
> -           prompt "build bar"
> -
> -    endif
> -
> -PTXdist now builds the *zlib* first and our new package thereafter.
> -
> -Refer :ref:`external_dependencies_variants` for more specific dependency
> -description.
> -
> -Managing External Compile Time Dependencies on Demand
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -It is good practice to add only those dependencies that are really
> -required for the current configuration of the package. If the package
> -provides the features *foo* and *bar* and its ``configure`` provides
> -switches to enable/disable them independently, we can also add
> -dependencies on demand. Let’s assume feature *foo* needs the compression
> -library *libz* and *bar* needs the XML2 library *libxml2*. These
> -libraries are only required at run-time if the corresponding feature is
> -enabled. To add these dependencies on demand, the menu file looks like:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=project_specific
> -
> -    config FOO
> -           tristate
> -           select ZLIB if FOO_FOO
> -           select LIBXML2 if FOO_BAR
> -           prompt "foo"
> -           help
> -             FIXME
> -
> -    if FOO
> -    config FOO_DEBUG
> -           bool
> -           prompt "add debug noise"
> -
> -    config FOO_FOO
> -           bool
> -           prompt "build foo"
> -
> -    config FOO_BAR
> -           bool
> -           prompt "build bar"
> -
> -    endif
> -
> -.. important:: Do not add these ``select`` statements to the corresponding menu entry.
> -  They must belong to the main menu entry of the package to ensure that
> -  the calculation of the dependencies between the packages is done in a
> -  correct manner.
> -
> -Managing External Runtime Dependencies
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -Some packages are building all of their components and also installing
> -them into the target’s sysroot. But only their *targetinstall* stage
> -decides which parts are copied to the root filesystem. So, compiling and
> -linking of our package will work, because everything required is found
> -in the target’s sysroot.
> -
> -In our example there is a hidden dependency to the math library
> -``libm``. Our new package was built successfully, because the linker was
> -able to link our binaries against the ``libm`` from the toolchain. But
> -in this case the ``libm`` must also be available in the target’s root
> -filesystem to fulfil the run-time dependency: We have to force PTXdist to
> -install ``libm``. ``libm`` is part of the *glibc* package, but is not
> -installed by default (to keep the root filesystem small). So, it **does
> -not** help to select the ``GLIBC`` symbol, to get a ``libm`` at run-time.
> -
> -The correct solution here is to add a ``select LIBC_M`` to our menu
> -file. With all the additions above it now looks like:
> -
> -.. code-block:: kconfig
> -
> -    ## SECTION=project_specific
> -
> -    config FOO
> -           tristate
> -           select ZLIB if FOO_FOO
> -           select LIBXML2 if FOO_BAR
> -           select LIBC_M
> -           prompt "foo"
> -           help
> -             FIXME
> -
> -    if FOO
> -    config FOO_DEBUG
> -           bool
> -           prompt "add debug noise"
> -
> -    config FOO_FOO
> -           bool
> -           prompt "build foo"
> -
> -    config FOO_BAR
> -           bool
> -           prompt "build bar"
> -
> -    endif
> -
> -.. note:: There are other packages around, that do not install everything by
> -  default. If our new package needs something special, we must take a look
> -  into the menu of the other package how to force the required components
> -  to be installed and add the corresponding ``selects`` to our own menu
> -  file. In this case it does not help to enable the required parts in our
> -  project configuration, because this has no effect on the build order!
> -
> -Managing Plain Makefile Packages
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -Many packages are still coming with a plain ``Makefile``. The user has
> -to adapt it to make it work in a cross compile environment as well.
> -PTXdist can also handle this kind of packages. We only have to specify
> -a special *prepare* and *compile* stage.
> -
> -Such packages often have no special need for any kind of preparation. In
> -this we must instruct PTXdist to do nothing in the *prepare* stage:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_TOOL := NO
> -
> -To compile the package, we can use ``make``\ ’s feature to overwrite
> -variables used in the ``Makefile``. With this feature we can still use
> -the original ``Makefile`` but with our own (cross compile) settings.
> -
> -Most of the time the generic compile rule can be used, only a few
> -settings are required. For a well defined ``Makefile`` it is sufficient to
> -set up the correct cross compile environment for the *compile* stage:
> -
> -.. code-block:: make
> -
> -    FOO_MAKE_ENV := $(CROSS_ENV)
> -
> -``make`` will be called in this case with:
> -
> -``$(FOO_MAKE_ENV) $(MAKE) -C $(FOO_DIR) $(FOO_MAKE_OPT)``
> -
> -So, in the rule file only the two variables ``FOO_MAKE_ENV`` and
> -``FOO_MAKE_OPT`` must be set, to forward the required settings to the
> -package’s buildsystem. If the package cannot be built in parallel, we
> -can also add the ``FOO_MAKE_PAR := NO``. ``YES`` is the default.
> -
> -Managing CMake/QMake/Meson Packages
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -Building packages that use ``cmake``, ``qmake`` or ``meson`` is much like
> -building packages with an autotools based buildsystem. We need to specify
> -the configuration tool:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_TOOL := cmake
> -
> -or
> -
> -.. code-block:: make
> -
> -    FOO_CONF_TOOL := qmake
> -
> -or respectively
> -
> -.. code-block:: make
> -
> -    FOO_CONF_TOOL := meson
> -
> -And provide the correct configuration options. The syntax is different so
> -PTXdist provides additional macros to simplify configurable features.
> -For ``cmake`` the configuration options typically look like this:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_OPT := \
> -    	$(CROSS_CMAKE_USR) \
> -    	-DBUILD_TESTS:BOOL=OFF \
> -    	-DENABLE_BAR:BOOL=$(call ptx/onoff, PTXCONF_FOO_BAR)
> -
> -For ``qmake`` the configuration options typically look like this:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_OPT := \
> -    	$(CROSS_QMAKE_OPT) \
> -    	PREFIX=/usr
> -
> -And for ``meson`` the configuration options typically look like this:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_OPT := \
> -    	$(CROSS_MESON_USR) \
> -    	-Dbar=$(call ptx/truefalse,PTXCONF_FOO_BAR)
> -
> -Please note that currently only host and target ``cmake``\/``meson`` packages
> -and only target ``qmake`` packages are supported.
> -
> -Managing Python Packages
> -^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -As with any other package, the correct configuration tool must be selected
> -for Python packages:
> -
> -.. code-block:: make
> -
> -    FOO_CONF_TOOL := python
> -
> -.. note:: For Python3 packages the value must be ``python3``.
> -
> -No Makefiles are used when building Python packages so the usual ``make``
> -and ``make install`` for the *compile* and *install* stages cannot be used.
> -PTXdist will call ``python setup.py build`` and ``python setup.py install``
> -instead.
> -
> -.. note:: *FOO* is still the name of our example package. It must be
> -  replaced by the real package name.
> -
> -
> -.. _patching_packages:
> -
> -Patching Packages
> -~~~~~~~~~~~~~~~~~
> -
> -There can be various reasons why a package must be patched:
> -
> --  Package is broken for cross compile environments
> -
> --  Package is broken within a specific feature
> -
> --  Package is vulnerable and needs some fixes
> -
> --  or anything else (this case is the most common one)
> -
> -Ideally, those problems should be addressed in the original project,
> -so any patches you add to your BSP or to PTXdist should also be submitted upstream.
> -The upstream project can often provide better feedback, they can integrate your
> -patch into a new release, and also maintain your changes as part of the project.
> -This way we make sure that all advantages of the open source idea work for us;
> -and your patch can be removed again later when a new release of the project is
> -integrated into your BSP or into PTXdist.
> -
> -PTXdist handles patching automatically.
> -After extracting the archive of a package, PTXdist checks for the existence of
> -a patch directory named like its ``<PKG>_PATCHES`` variable, or, if this variable
> -is not set, like its ``<PKG>`` variable.
> -The patch directory is then searched in all locations listed by the
> -``PTXDIST_PATH_PATCHES`` variable, and the first one found is used.
> -Take an exemplary package ``foo`` with version ``1.1.0``:
> -The variable ``FOO`` will have the value ``foo-1.1.0``, so PTXdist will look for
> -a patch directory named ``foo-1.1.0`` in the following locations:
> -
> -#. the current layer:
> -
> -   a. project (``./patches/foo-1.1.0``)
> -   b. platform (``./configs/|ptxdistPlatformConfigDir|/patches/foo-1.1.0``)
> -
> -#. any :ref:`base layers <layers-in-ptxdist>`,
> -   applying the same search order as above for each layer recursively
> -
> -#. ptxdist (``<ptxdist/installation/path>/patches/foo-1.1.0``)
> -
> -The patches from the first location found are used. Note: Due to this
> -search order, a PTXdist project can replace global patches from the
> -PTXdist installation. This can be useful if a project sticks to a
> -specific PTXdist revision but fixes from a more recent revision of
> -PTXdist should be used.
> -
> -PTXdist uses the utilities *git*, *patch* or *quilt* to work with
> -patches or patch series. We recommend *git*, as it can manage patch
> -series in a very easy way.
> -
> -Creating a Patch Series for a Package
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -To create a patch series for the first time, we can run the following
> -steps. We are still using our *foo-1.1.0* example package here:
> -
> -Using Quilt
> -"""""""""""
> -
> -We create a special directory for the patch series in the local project
> -directory:
> -
> -.. code-block:: text
> -
> -    $ mkdir -p patches/foo-1.1.0
> -
> -PTXdist expects a ``series`` file in the patch directory and at least
> -one patch. Otherwise it fails. Due to the fact that we do not have any
> -patch content yet, we’ll start with a dummy entry in the ``series`` file
> -and an empty ``patch`` file.
> -
> -.. code-block:: text
> -
> -    $ touch patches/foo-1.1.0/dummy
> -    $ echo dummy > patches/foo-1.1.0/series
> -
> -Next is to extract the package (if already done, we must remove it
> -first):
> -
> -.. code-block:: text
> -
> -    $ ptxdist extract foo
> -
> -This will extract the archive and create a symbolic link in the build
> -directory pointing to our local patch directory. Working this way will
> -ensure that we do not lose our created patches if we enter
> -``ptxdist clean foo`` by accident. In our case the patches are still
> -present in ``patches/foo-1.1.0`` and can be used the next time we
> -extract the package again.
> -
> -All we have to do now is to do the modification we need to make the
> -package work. We change into the build directory and use quilt_ to
> -create new patches, add files to respective patches, modify these files
> -and refresh the patches to save our changes.
> -See the *quilt* documentation (``man 1 quilt``) for more information.
> -
> -.. note:: For patches that are intended for PTXdist upstream use the git
> -  workflow described below to get proper patch headers.
> -
> -.. _quilt: http://savannah.nongnu.org/projects/quilt
> -
> -Using Git
> -"""""""""
> -
> -Create the patch directory like above for *quilt*,
> -but only add an empty series file:
> -
> -.. code-block:: text
> -
> -    $ mkdir -p patches/foo-1.1.0
> -    $ touch patches/foo-1.1.0/series
> -
> -Then extract the package with an additional command line switch:
> -
> -.. code-block:: text
> -
> -    $ ptxdist --git extract foo
> -
> -The empty series file makes PTXdist create a Git repository in the
> -respective package build directory,
> -and import the package source as the first commit.
> -
> -.. note:: Optionally, you can enable the setting *Developer Options →
> -  use git to apply patches* in `ptxdist setup` to get this behaviour
> -  as a default for every package.
> -  However, note that this setting is meant for development only, and can lead
> -  to failures – some packages try to determine if they are being compiled from
> -  a Git source tree, and behave differently in that case.
> -
> -Then you can change into the package build directory
> -(``platform-<name>/build-target/foo-1.1.0``),
> -patch the required source files,
> -and make Git commits on the way.
> -The Git history should now look something like this:
> -
> -.. code-block:: text
> -
> -    $ git log --oneline --decorate
> -    * df343e821851 (HEAD -> master) Makefile: don't build the tests
> -    * 65a360c2bd60 strfry.c: frobnicate the excusator
> -    * fdc315f6844c (tag: foobar-1.1.0, tag: base) initial commit
> -
> -Finally, call ``git ptx-patches`` to transform those Git commits into the patch
> -series in the ``patches/foo-1.1.0`` folder.
> -This way they don't get lost when cleaning the package.
> -
> -.. note:: PTXdist will only create a Git repository for packages with
> -  patches.  To use Git to generate the first patch, create an empty series
> -  file ``patches/foobar-1.1.0/series`` before extracting the packages. This
> -  will tell PTXdist to use Git anyways and ``git ptx-patches`` will put the
> -  patches there.
> -
> -Both approaches (Git and quilt) are not suitable for modifying files
> -that are autogenerated in autotools-based buildsystems.
> -Refer to the section :ref:`configure_rebuild` on how PTXdist can
> -handle this special task.
> -
> -Adding More Patches to a Package
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -If we want to add more patches to an already patched package, we can use
> -nearly the same way as creating patches for the first time. But if the
> -patch series comes from the PTXdist main installation, we do not have
> -write permissions to these directories (do NEVER work on the main
> -installation directories, NEVER, NEVER, NEVER). Due to the search order
> -in which PTXdist searches for patches for a specific package, we can
> -copy the global patch series to our local project directory. Now we have
> -the permissions to add more patches or modify the existing ones. Also
> -*quilt* and *git* are our friends here to manage the patch series.
> -
> -If we think that our new patches are valuable also for others, or they
> -fix an error, it could be a good idea to send these patches to PTXdist
> -mainline, and to the upstream project too.
> -
> -
> -.. _configure_rebuild:
> -
> -Modifying Autotoolized Packages
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -
> -Autotoolized packages are very picky when automatically generated files
> -get patched. The patch order is very important in this case and
> -sometimes it even fails and nobody knows why.
> -
> -To improve a package’s autotools-based build system, PTXdist comes with
> -its own project local autotools to regenerate the autotools template
> -files, instead of patching them. With this feature, only the template
> -files must be patched, the required ``configure`` script and the
> -``Makefile.in`` files are regenerated in the final stages of the
> -*prepare* step.
> -
> -This feature works like the regular patching mechanism. The only
> -difference is the additional ``autogen.sh`` file in the patch directory.
> -If it exists and has execution permissions, it will be called after the
> -package was patched (while the *extract* stage is running).
> -
> -Its content depends on developer needs; for the most simple case the
> -content can be:
> -
> -.. code-block:: bash
> -
> -    #!/bin/bash
> -
> -    aclocal $ACLOCAL_FLAGS
> -
> -    libtoolize \
> -            --force \
> -            --copy
> -
> -    autoreconf \
> -            --force \
> -            --install \
> -            --warnings=cross \
> -            --warnings=syntax \
> -            --warnings=obsolete \
> -            --warnings=unsupported
> -
> -.. note:: In this way not yet autotoolized package can be autotoolized. We
> -  just have to add the common autotool template files (``configure.ac``
> -  and ``Makefile.am`` for example) via a patch series to the package
> -  source and the ``autogen.sh`` to the patch directory.
> -
> -.. _adding_files:
> -
> -Adding Binary Only Files
> -------------------------
> -
> -Sometimes a few binary files have to be added into the root filesystem.
> -Or - to be more precise - some files, that do not need to be built in
> -any way.
> -
> -On the other hand, sometimes files should be included that are not
> -covered by any open source license and so, should not be shipped in the
> -source code format.
> -
> -Add Binary Files File by File
> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -Doing to on a file by file base can happen by just using the ``install_copy``
> -macro in the *targetinstall* stage in our own customized rules file.
> -
> -.. code-block:: none
> -
> -    @$(call install_copy, binary_example, 0, 0, 0644, \
> -       </path/to/some/file/>ptx_logo.png, \
> -       /example/ptx_logo.png)
> -
> -It copies the file ``ptx_logo.png`` from some location to target’s root
> -filesystem. Refer :ref:`install_copy` for further information about using the
> -``install_copy`` macro.
> -
> -The disadvantage of this method is: if we want to install more than one
> -file, we need one call to the ``install_copy`` macro per file. This is
> -even harder if not only a set of files is to be installed, but a whole
> -directory tree with files instead.
> -
> -Add Binary Files via an Archive
> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -If a whole tree of files is to be installed, working with a *tar* based
> -archive could make life easier. In this case the archive itself provides
> -all the required information the files are needing to be installed in a
> -correct manner:
> -
> --  the file itself and its name
> -
> --  the directory structure and the final location of every file in this
> -   structure
> -
> --  user and group ID on a per file base
> -
> -.. code-block:: none
> -
> -    @$(call install_archive, binary_example, -, -, \
> -       </path/to/an/>archive.tgz, /)
> -
> -Refer :ref:`install_archive` for further information about using the
> -``install_archive`` macro.
> -
> -Using an archive can be useful to install parts of the root filesystem
> -that are not covered by any open source license. Its possible to ship
> -the binaries within the regular BSP, without the need for their sources.
> -However it is possible for the customer to re-create everything required
> -from the BSP to get their target up and running again.
> -
> -Another use case for the archive method could be the support for
> -different development teams. One team provides a software component in
> -the archive format, the other team does not need to build it but can use
> -it in the same way than every other software component.
> -
> -Creating a Rules File
> -~~~~~~~~~~~~~~~~~~~~~
> -
> -Let PTXdist create one for us.
> -
> -.. code-block:: text
> -
> -    $ ptxdist newpackage file
> -
> -    ptxdist: creating a new 'file' package:
> -
> -    ptxdist: enter package name.......: my_binfiles
> -    ptxdist: enter version number.....: 1
> -    ptxdist: enter package author.....: My Name <me@my-org.com>
> -    ptxdist: enter package section....: rootfs
> -
> -Now two new files are present in the BSP:
> -
> -#. ``rules/my_binfiles.in`` The template for the menu
> -
> -#. ``rules/my_binfiles.make`` The rules template
> -
> -Both files now must be customized to meet our requirements. Due to the
> -answer *rootfs* to the “``enter package section``” question, we will
> -find the new menu entry in:
> -
> -.. code-block:: text
> -
> -    Root Filesystem --->
> -    	< > my_binfiles (NEW)
> -
> -Enabling this new entry will also run our stages in
> -``rules/my_binfiles.make`` the next time we enter:
> -
> -.. code-block:: text
> -
> -    $ ptxdist go
> -
> -Creating New Package Templates
> -------------------------------
> -
> -For larger projects it can be convenient to have project specific package
> -templates. This can be achieved by either modifying existing templates or
> -by creating completely new templates.
> -
> -Modifying a Template
> -~~~~~~~~~~~~~~~~~~~~
> -
> -A template can be modified by providing new input files. This is easier
> -than creating a new template but does not allow to specify new variables to
> -substitute in the input files.
> -
> -PTXdist looks for template files the same way it looks for rules files. The
> -only difference is, that it searches in the ``templates/`` subdirectory.
> -So a modified ``./rules/templates/template-target-make`` can be used to
> -tweak the ``target`` template.
> -
> -Creating a New Template
> -~~~~~~~~~~~~~~~~~~~~~~~
> -
> -For a completely new template, some bash scripting is required. All shell
> -code must be placed in a file named like this:
> -``./scripts/lib/ptxd_lib_*.sh``.
> -
> -The minimum requirement for a new template is:
> --  a shell function that creates the new package
> --  registering the new template
> -
> -.. code-block:: sh
> -
> -    ptxd_template_new_mypkg() {
> -        # create the package here
> -    }
> -    export -f ptxd_template_new_mypkg
> -    ptxd_template_help_list[${#ptxd_template_help_list[@]}]="mypkg"
> -    ptxd_template_help_list[${#ptxd_template_help_list[@]}]="create awesome mypkg package"
> -
> -PTXdist provides several helper functions to simplify the template.
> -Using those functions, the package creation process is split into two
> -parts:
> -
> --  query the user for input and export variables.
> --  create the new package files from the template source files by
> -   substituting all instances of ``@<variable>@`` with the value of the
> -   corresponding variable.
> -
> -A simple template function could look like this:
> -
> -.. code-block:: sh
> -
> -    ptxd_template_new_mypkg() {
> -        ptxd_template_read_basic &&
> -        ptxd_template_read "enter download section" DL_SECTION "foobar"
> -        ptxd_template_read_author &&
> -        export section="local_${dlsection}" &&
> -        ptxd_template_write_rules
> -    }
> -
> -This template requires ``rules/templates/template-mypkg-make`` and
> -``rules/templates/template-mypkg-in`` as source files. They could be
> -derived from the ``target`` template with a simple modification:
> -
> -.. code-block:: make
> -
> -    @PACKAGE@_SUFFIX	:= tar.xz
> -    @PACKAGE@_URL	:= http://dl.my-company.local/downloads/@DL_SECTION@/$(@PACKAGE@).$(@PACKAGE@_SUFFIX)
> -
> -The helper functions that are used in the example above are defined in
> -``scripts/lib/ptxd_lib_template.sh`` in the PTXdist source tree.
> -
> -The template is a normal shell function. Arbitrary things can be done here
> -to create the new package. The helper functions are just the most
> -convenient way to crate simple templates. It is also possible to create
> -more files. For examples, the builtin ``genimage`` template creates a extra
> -config file for the new package.
> -
> -.. _layers-in-ptxdist:
> -
> -Layers in PTXdist
> ------------------
> -
> -For better maintenance or other reasons, a PTXdist project can be split
> -into multiple layers. Each layer has exactly the same directory hierarchy
> -as described in :ref:`directory_hierarchy` and other chapters.
> -
> -All layers are explicitly stacked in the filesystem. The top layer is the
> -workspace of the PTXdist project. Any ``selected_*`` links and the platform
> -build directory are created here. The layer below is defined by the
> -subdirectory or symlink named ``base/``. More can be stacked the same
> -way, so ``base/base/`` is the third layer and so on.
> -In many ways, PTXdist itself can be considered as the bottom layer. This is
> -either implicit or explicit with one last ``base/`` symlink.
> -
> -A project can overwrite files provided by PTXdist in many different ways,
> -e.g. rule files or files installed with :ref:`install_alternative` etc.
> -This concept expands naturally to layers. Each layer can overwrite files
> -provided by lower layers in the exact same way. Any files are always
> -searched for in a strict layer by layer order.
> -
> -Writing Layer Aware Rules
> -~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -For the most part, package rules work just as expected when multiple layers
> -are used. Any layer specific handling is done implicitly by PTXdist.
> -However, there are a few things that need special handling.
> -
> -The variables :ref:`PTXDIST_WORKSPACE<ptxdist_workspace>` and
> -:ref:`PTXDIST_PLATFORMCONFIGDIR`<ptxdist_platformconfigdir>` always refer
> -to the directories in the top layer. These variables might be used in rules
> -files like this:
> -
> -.. code-block:: make
> -
> -   MY_KERNEL_CONFIG := $(PTXDIST_PLATFORMCONFIGDIR)/kernelconfig.special
> -
> -If the referenced file is in any layer but the top one then it will not
> -be found. To handle use-cases like this, the macros :ref:`in_path` and
> -:ref:`in_platformconfigdir` can be used:
> -
> -.. code-block:: make
> -
> -   MY_KERNEL_CONFIG := $(call ptx/in-platformconfigdir, kernelconfig.special)
> -
> -This way, the layers are searched top to bottom until the config file is
> -found.
> -
> -PTXdist Config Files with Multiple Layers
> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -In many cases a layer may want to modify the **ptxconfig** by enabling or
> -disabling some options. Any changes must be propagated through the whole
> -layer stack.
> -
> -The features and workflow described here apply to the **ptxconfig**, the
> -**platformconfig** and any **collectionconfig** used in the project.
> -
> -To do this, PTXdist stores a delta config to the layer below and a full
> -config file in each layer. If the two files are missing then the config is
> -unchanged. The bottom layer has only the config file and no delta.
> -
> -At runtime, PTXdist will always use the full config file in the top layer
> -where the config exists. Before doing so, it will ensure that the config is
> -consistent across all layers. This means that, for any layer that contains a
> -delta config, the full config file of the layer below has not changed since
> -the delta config was last updated. If any inconsistency is detected,
> -PTXdist will abort.
> -
> -For any command that modifies the config file, except ``oldconfig``,
> -PTXdist will use kconfig implicitly on all layers to check if the config
> -for this layer is up to date. This is a stricter check than the consistency
> -validation. For example, if a new package was added to a layer without
> -updating the **ptxconfig** then this will be detected and PTXdist will
> -abort. If all other layers are up to date, then PTXdist will use the delta
> -config of the top layer, apply it to the full config of the layer below
> -and execute the specified command with the resulting config file.
> -
> -.. note:: If the config file does not exist yet on the top layer, then it
> -  will be created if changes to the config are made. Similarly the config
> -  will be deleted if the delta is empty after the changes. In either case
> -  it may be necessary to update any ``selected_*`` link to point to the
> -  correct config.
> -
> -If PTXdist detects an inconsistency or an out of date config file then it
> -must be updated before they can be used. This can be done by using the
> -``oldconfig`` command. In this special case, PTXdist will iterate from the
> -bottom to the top layer and run ``oldconfig`` for each of them. It will
> -use the delta config applied to the full config of the layer below at each
> -step. This means that it's possible to enable or disable a option in the
> -bottom layer and ``oldconfig`` will propagate this change to all other
> -layers.
> -
> -Packages with kconfig Based Config Files
> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> -
> -For packages such as the Linux kernel that have kconfig based config files,
> -a lot of the infrastructure to handle config files and deltas across
> -multiple layers can be reused. Consistency validation is done implicitly
> -and ``menuconfig`` and other kconfig commands will use config files and
> -deltas as expected.
> -
> -It's not possible to implicitly run ``oldconfig`` on other layers (this may
> -require a different source tree for the packages), so any inconsistencies
> -must be resolved manually by running ``oldconfig`` explicitly on each
> -layer.
> -
> -The make macros that provide these features are currently used by the
> -barebox and kernel packages and templates.
> +.. toctree::
> +   :glob:
> +   :maxdepth: 2
> +
> +   dev_dir_hierarchy
> +   dev_add_new_pkgs
> +   dev_add_bin_only_files
> +   dev_create_new_pkg_templates
> +   dev_layers_in_ptxdist

_______________________________________________
ptxdist mailing list
ptxdist@pengutronix.de
To unsubscribe, send a mail with subject "unsubscribe" to ptxdist-request@pengutronix.de

  reply	other threads:[~2020-06-19 22:04 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-17 14:31 [ptxdist] [PATCH v3 0/6] Add code-signing-provider template, add code signing docs Bastian Krause
2020-06-17 14:31 ` [ptxdist] [PATCH v3 1/6] ptxd_lib_template: add ptxd_template_read_options Bastian Krause
2020-06-19  6:24   ` Michael Olbrich
2020-06-19  8:13     ` Bastian Krause
2020-06-19 22:04   ` [ptxdist] [APPLIED] " Michael Olbrich
2020-06-17 14:31 ` [ptxdist] [PATCH v3 2/6] package templates: add code-signing-provider template Bastian Krause
2020-06-18 11:40   ` Roland Hieber
2020-06-18 11:50     ` Bastian Krause
2020-06-19  6:12       ` Michael Olbrich
2020-06-19  6:28   ` Michael Olbrich
2020-06-19  7:52     ` Bastian Krause
2020-06-19 22:04   ` [ptxdist] [APPLIED] " Michael Olbrich
2020-09-24 10:04   ` [ptxdist] [PATCH v3 2/6] " Ladislav Michl
2020-09-24 11:05     ` Bastian Krause
2020-09-24 11:15       ` Ladislav Michl
2020-09-24 12:23         ` Bastian Krause
2020-06-17 14:31 ` [ptxdist] [PATCH v3 3/6] doc: dev_manual: split up into multiple files Bastian Krause
2020-06-19 22:04   ` Michael Olbrich [this message]
2020-06-17 14:31 ` [ptxdist] [PATCH v3 4/6] doc: move code signing docs from scripts/ into doc/ Bastian Krause
2020-06-19 22:04   ` [ptxdist] [APPLIED] " Michael Olbrich
2020-06-17 14:31 ` [ptxdist] [PATCH v3 5/6] doc: dev_code_signing: rework and extend code signing section Bastian Krause
2020-06-19 22:04   ` [ptxdist] [APPLIED] " Michael Olbrich
2020-06-17 14:31 ` [ptxdist] [PATCH v3 6/6] doc: introduce ref_code_signing_helpers Bastian Krause
2020-06-19 22:04   ` [ptxdist] [APPLIED] " Michael Olbrich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1jmP7H-0002Pp-CK@dude02.lab.pengutronix.de \
    --to=mol@pengutronix.de \
    --cc=bst@pengutronix.de \
    --cc=ptxdist@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox