4.6. 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

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:

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:

@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 an extra config file for the new package.