Title: Source Package Format 1.0
Status: DRAFT
Date: 2012-03-08

1. Status of This Document

This specification is in DRAFT status. It is a work-in-progress and is subject to change. Comments and revisions are welcome.

1.1. Remaining Tasks

2. Abstract

This document describes version 1.0 of the format for software source packages.

3. Background

A source package consists of software source code, a build system, and package metadata. From it is built one or more binary packages, which can be installed into an operating system.

4. Rationale

This source package format is functionally similar to Debian's source package formats. It differs from them most noticeably in that:

Overall, this format is designed to be conducive to building packages for a highly flexible embedded operating system. Additionally, source packages in this format are intended to be maintained independently (like packages in Debian and most other GNU/Linux distributions are) rather than in one monolithic software repository (as is the case with most embedded operating system distributions).

It may not be the most efficient or maintainer-friendly format, but this is an innovative first step and may be improved over time.

5. Directory Structure

The source package directory hierarchy can be summarized with the following tree:

<source-package-directory>/
 +- <binpkg>.pkg/
 |   +- control
 |   |    Metadata about the binary package.
 |   +- install
 |   |    A list of patterns to match files to be installed in the binary
 |   |    package.
 |   +- postinst
 |   +- postrm
 |   +- preinst
 |   \- prerm
 +- build
 |    A makefile with target rules to build the binary package(s).
 +- changelog
 |    A log of changes made to the source package.
 +- config
 |    A list of build-time and run-time configuration files.
 +- control
 |    Metadata about the source package.
 +- copyright
 |    Information about copyrights and licenses in the source package.
 +- format
 |    A magic file to identify the source format version.  Should simply
 |    contain the string "1.0".
 +- patches/
 |    Patches to be applied to package sources before building.
 +- <pkgname>-<pkgver>.tar.<ext>
 |    Upstream source archive (for non-native packages).
 \- src/
      Package sources (for native packages).

<source-package-directory> is the directory in which all packaging work is done. There are no constraints on the name of this directory.

<binpkg> is the name of each binary package generated by the source package.

<pkgname> is the name of the source package.

<pkgver> is the upstream source version.

<ext> is a compression format file extension. It must be one of the following:

6. Build File Format

An executable file named build should direct the process of building one or more binary packages from a source package. This file should be a makefile with a target for each binary package (whose name is that of the binary package) and a target for each build stamp (whose name is that of the build stamp file).

6.1. Build Stamps

A build stamp is a file the existence of which indicates that one or more packages were successfully built. It is located in the package building work area directory, and its name ends in .buildstamp.

In a makefile that directs the building of binary packages, each package target should depend on one build stamp target. Actual building of packages should be done in build stamp targets. After successfully building one or more binary packages, a build stamp target should create its build stamp file in the work area directory.

6.2. Multiple and Split Binary Packages

Some source packages generate multiple binary packages from a single build of the packaged software. In the build makefiles of such source packages, the targets for these binary packages should all depend on the same build stamp target. This is called a split binary package configuration.

Some source packages generate a set of one or more binary packages that is built independently of all other packages. In the build makefiles of such source packages, the target or targets for this set of binary packages should depend on a build stamp on which no other binary package targets depend. This is called a multiple binary package configuration.

Note that both configurations may be used in a single source package.

7. Change Log Format

Changes made to the source package should be explained in the file changelog.

Each new package revision must be documented with an entry of the following format:

package (version)
[zero or more blank lines]
  * change details
[zero or more blank lines]
  * more change details
    more detailed change details
[zero or more blank lines]
 -- maintainer  date

package is the source package name.

version is the source package version number.

maintainer is the name and e-mail address of the package maintainer. This field must follow the syntax of the mailbox symbol of RFC 5322 section 3.4.

date is the date of packaging. This field must follow the syntax of the date-time symbol of RFC 5322 section 3.3.

It is recommended that single blank lines be used:

8. Configuration File List Format

Platform-specific configuration files used by the source package at build time or by the binary package(s) at run time should be listed in the file config.

Each file must be described with an entry of the following format:

type source destination

type is the string buildtime for a file used at build time or runtime for a file used at run time.

source is the path to the file, relative to the platform configuration directory -- either /usr/share/config/PLATFORM/PACKAGE-VERSION or /usr/share/config/PLATFORM/PACKAGE, where PLATFORM is the architcture string denoting an application platform, PACKAGE is the name of the configurable source package, and VERSION is the upstream version of the configurable source package.

destination is the path (file or directory) to which the file should be copied. For a file used at build time, it is a path relative to the package building work area. For a file used at run time, it is an absolute path in the user's filesystem hierarchy.

9. Control File Format

See Debian Policy Manual section 5.1 for the syntax of control files.

10. Source Package Metadata

The fields in the source package metadata are:

11. Binary Package Metadata

The fields in the binary package metadata are:

12. Legal Notice

Copyright (C) 2012 Patrick "P. J." McDermott

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.