A Build System with wpkg

Introduction

The --build command allows a project manager to generate source packages that in turn can be used to generate binary packages for one's project.

Then, the --build command (again), from that source package, can compile the project and save the result in binary packages.

To achieve the feat, the packager makes uses of a few files in your project. Some of the files are mandatory (ChangeLog), others are optional although some are recommended (LICENSE, copyright, README.txt, etc.)

The control file is not required because all the necessary information to create the control file come from the ChangeLog and the other files. However, if you want to include a certain number of specialized fields, a control.info file becomes necessary.

Standalone Build

At first, you probably want to test that your package can indeed be built using wpkg.

The first step is to create the source package:

cd .../root/directory/of/your/project
wpkg --build

The --build by itself creates a source package of the package you are in. Note that if your package includes sub-packages (i.e. like wpkg includes the zlib package) then you probably want to make sure that all the files listed below exist either in the default location or in the root directory of your project1.

Once the source package was successfully created, it is time to try building the binary packages. This is very simple as well:

wpkg --root <path to a target> --build <package name>-src_<version>.deb

The .deb will have been created in the root directory of you project. Note that it is possible to place it somewhere else with --output-dir or --output-repository-dir. The --root option in that last command is required because the source package is going to be installed in the target before getting built. The system uses a rollback mechanism, so once the source package is dealt with, it automatically gets removed along with all the dependencies that got installed at the same time.

Once this last command works, you are done in terms of getting packages to build for this project.

IMPORTANT NOTE

At this point a source package can really only support one distribution. More than one would not work with the build process to binary packages as the --root option would require a different target for each distribution involved.

Updating a Source Package in your Repository

I suggest that you first try the build process as shown in the Standalone Build chapter. Once that works, you certainly want to include your project source package in your repository. This is the same command as before with the addition of the --output-repository-dir to indicate where your repository is:

wpkg --build --output-repository-dir .../my/repository

Note that the build command automatically creates all the required directories and saves the file where it is expected to go in the repository. Say for example that the Component field is set to main/tools/developers, then the source package ends up under:

.../my/repository/sources/main/tools

The path segment sources is automatically used as a replacement for the Distribution path and only the first two segments of the Component path are used.

Building Source Packages in a Repository

When you save your source packages (.deb files with the source code of your project) in your repository (see Updating a Source Package in Your Repository above) then you make it available to the repository build process via the following command:

wpkg --root <path to a target> --build .../my/repository

Note that we do not specify the sources directory, only the root of the repository. Also we need a --root option since the process is going to install source packages on that target before compiling them.

Assuming everything works according to plan, the <path to target> target will be returned as it was before you started the build (except for the database which keeps information about all installations.) This is the case whether or not the target succeeds its build process.

In this last process, the wpkg tool is 100% in charge of getting everything compiled, linked, installed for packaging, and packaged. Assuming everything works as expected, the result is the generation of binary packages of all the packages that are considered out of date, in the order as defined by the different package dependencies.

Note that if your target system has packages already installed, and those packages are in conflict with some of the packages that need to be compiled, then an error will occur at the time the system attempts to install those packages and the process will end. At this point you should make use of pretty much empty targets to increase the changes for this process to work.

IMPORTANT NOTE

It is important to note that at this point the system is not actually capable of handling more than one Distribution. The fact is that the target has to be using the correct distribution information, has had only packages from the same distribution installed in it, to work as expected. At this point this is not yet implemented. It is not unlikely that the system will be converted to automatically generate a target while doing the work on building source packages from a full repository.

Verification Steps

When creating a source package or a binary package, a large set of verifications check the input data. If anything is wrong, then an error is emitted and in the very end the package does not get saved.

What gets verified varies depending on how the package is being created. Since there are many different manners to create a package, these steps are not listed here. Note that for a source package you can list the verification steps with the following --help command line:

wpkg --help build-validations [--verbose]

Where --verbose is optional although that will give you a lot more details about the build steps.

Expected and Mandatory Files

The build process that creates a source package searches for a set of files in your source project. For the process to succeed some of these files must exist because these files are used and will be required to create the binary packages.

The filenames having a path that are listed in the table below are all relative from the root of the project. Files without a path may appear anywhere.

Official Filename Aliases Required? Comments
wpkg/control.info control.info Yes Uses the .info file format (fields with /<component> names).
wpkg/copyright debian/copyright Yes Uses the copyright file format.
wpkg/changelog debian/changelog Yes If not one of the two default filenames, anywhere else, case insensitive, for example, ChangeLog, as in wpkg, works too.
./CMakeLists.txt   Yes We only understand cmake to configure a package, so if that file is missing it won't work!
COPYING LICENSE No Also accepts COPYING.txt or LICENSE.txt all case insensitive.
README README.txt No Should be declared, will generate warnings if not available. Checked case insensitively.
INSTALL INSTALL.txt No Should be declared, will generate warnings if not available. Checked case insensitively.

Fields Used from the ChangeLog File

The following table shows you the fields found in the ChangeLog file that are used to fill out fields in your control file.

ChangeLog Information Control Field
Package Name Package
Version these changes applies to Version
List of distributions Distribution
Urgency Urgency
Logs about the changes Changes
Logs with a bug reference Closes
Developer name and email address Maintainer
Date when this log entry was started Changes-Date

Note that the source package accepts a list of distributions in its Distribution field. When building such a package, it gets built once per distribution found in its source package field.

  • 1. In version 0.9.0, only files in the root directory are checked anyway, except for the few checked under wpkg/... and debian/...