# Debhelper-based infrastructure for building Octave add-on packages

## Introduction

This package (dh-octave) contains the infrastructure for building
add-on packages for Octave which use the mechanism in pkg.m.  This is
particularly the case of the [Octave-Forge][1] packages.

dh-octave is completely based on [Debhelper][2].  It contains scripts
for automation of the building, the installation, the checking and the
cleaning of the add-on package.  It also generates the appropriate
substitution variables for use in `debian/control`.

[1]: https://octave.sourceforge.io/
[2]: https://github.com/Debian/debhelper

## Usage

For a basic usage of dh-octave, this is the minimal `debian/rules`
file:

```make
#!/usr/bin/make -f
# -*- makefile -*-

%:
	dh $@ --buildsystem=octave --with=octave
```

For executing actions beyond the ones of `pkg install`, the
following Debhelper targets can be used:

- override_dh_auto_build
- override_dh_auto_install
- override_dh_auto_clean

For fine tuning the execution of the unit tests, the following
environment variables are available:

- `DH_OCTAVE_TEST_ENV`

    The value of this variable is prepended to the `octave` command
    used for running the unit tests.  For instance, one can set its
    value to `LD_PRELOAD=` in order to prevent the tests from being
    run in a fakeroot environment.  It can also be another command,
    like 'xfvb-run`.

- `DH_OCTAVE_TEST_OPT`

    This variable alter the behavior of the tests.  Possible values
    are `quiet`, `normal`, and `verbose` (the later is the default).

- `DH_OCTAVE_EXCLUDE_TEST`

    This variable can be used to prevent the execution of certain unit
    tests.  It should contain a space-separated list of file names
    (`*.m` or `*.cc`) for which the unit tests should not be run.

## Building a Debian package from scratch

`dh_octave_make` is a helper script for generating a first version of
a Debian package for an Octave-Forge package.  The command should be
launched from the top directory of the unpacked sources of an
Octave-Forge packages.  A file called `DESCRIPTION` must be present,
from which information about the package is gathered.
`dh_octave_make` generated the the `debian/*` with sensible contents,
although they need further editing.

## Internals of dh-octave

The dh-octave package adds a new buildsystem to the Debhelper system
through the file `buildsystem.pm`.  In this file, the `install` and
`clean` targets of Debhelper are redefined.  Notice that there is no
`build` target in that file, since the building *and* the installation
are done in the `install` target, by running the code in the Octave
script `/usr/share/dh-octave/install-pkg.m`.

The dh-octave package also alters the sequence of Debhelepr commands
through the file `sequence.pm`.  It inserts calls to the `dh_octave_*`
commands in the appropriate places, namely:

| Debhelper target       | where  | dh-octave command      |
| ---------------------- | ------ | ---------------------- |
| `dh_auto_configure`    | before | `dh_octave_version`    |
| `dh_auto_install`      | after  | `dh_octave_check`      |
| `dh_install`           | after  | `dh_octave_substvar`   |
| `dh_installchangelogs` | after  | `dh_octave_changelogs` |

Notice that the commands above are not meant to be called directly by
the user, but are active through the option `--with=octave` of `dh` in
`debian/rules`.
