About This Document =================== This document describes version 1.0 of the format for software source packages. Legal Notice ============ Copyright (C) 2012 Patrick "P. J." McDermott This document may be reproduced, distributed, modified, and otherwise dealt in under the terms of the Expat/MIT License: http://www.jclark.com/xml/copying.txt Specification Status ==================== This specification is in draft status. It is a work-in-progress and is subject to change. Comments and revisions are welcome. TODO ---- * Finish describing binary package control fields. * Describe the control file format. * Describe the formats of the config and changelog files. 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. Rationale ========= This source package format is modeled after the package format of the OpenBricks Embedded Linux Framework. However, this format more natively supports the building of multiple binary packages from one source package. Additionally, source packages in this format are intended to be maintained independently (like Debian packages are) rather than in one monolithic software repository (such as that of OpenBricks). In this and other respects, this format draws inspiration from Debian's source package formats. Directory Structure =================== The source package directory hierarchy can be summarized with the following tree, where "" is the name of each binary package generated by the source package: / +- .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. +- _. | Upstream source archive (for non-native packages). \- src/ Package sources (for native packages). 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). 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. 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. Control File Format =================== See documentation on Debian packaging. Binary Package Metadata ======================= The fields in the binary package metadata are: * Package (required) The name of the binary package. Binary package names may only consist of lowercase Latin letters, digits, plus and minus signs, and periods. Names must be at least two characters long and must start with either a letter or a digit. * Architecture (required) The names of the architectures for which this package is built. The list of names may consist of values selected from the following: - A three-tuple binary architecture name to specify that the package can be built for the binary architecture and any application platform. - An application platform architecture name to specify that the package can be built for the application platform and its associated binary architecture. Alternatively, the list may consist solely of one of the following values: - The string "all" to specify that the package can be built on any binary architecture and any application platform and can then be installed on binary architectures and/or application platforms other than those on which it is built. - The string "any" to specify that the package cen be built for any binary architecture and any application platform. * Essential (optional) A flag to indicate whether the package is essential for the functioning of a system on which it is installed. If this field is set to "yes", opkg will refuse to remove the package except when upgrading it. If this field is set to any other value or is omitted, the package may be removed by a user. * Depends (optional) A list of packages that must be installed and configured before the package may itself be configured. * Recommends (optional) * Suggests (optional) * Pre-Depends (optional) A list of packages that must be installed before the package may itself be installed. * Conflicts (optional) * Provides (optional) * Replaces (optional) * Description (required) A description of the binary package. This is a multiline field. The first line is a short synopsis, and all following lines are an extended description. Source Package Metadata ======================= The fields in the source package metadata are: * Source (required) The name of the source package. Source package names may only consist of lowercase Latin letters, digits, plus and minus signs, and periods. Names must be at least two characters long and must start with either a letter or a digit. * Maintainer (required) The name and e-mail address of the package maintainer. This field must follow the syntax of the "mailbox" symbol in RFC 5322 section 3.4. * Build-Depends (optional) A list of packages that must be installed before the package can be built. * Homepage The URL of the Web site for the package. Accessible at this site should be origin source code and documentation and/or information. Though the information in this field is machine-usable, the URL must not be surrounded by angle brackets or any other characters. 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. 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: * After the package name and version and before change entries, * After change entries and before the maintainer and date, and * Between groups of related change entries.