NAME

bpkg-pkg-bindist – generate binary distribution package

SYNOPSIS

bpkg pkg-bindist|bindist [--output-root|-o dir] [options] [vars] pkg...

DESCRIPTION

The pkg-bindist command generates a binary distribution package for the specified package. If additional packages are specified, then they are bundled in the same distribution package. All the specified packages must have been previously configured with bpkg-pkg-build(1) or bpkg-pkg-configure(1). For some system package managers a directory for intermediate files and subdirectories as well as the resulting binary package may have to be specified explicitly with the --output-root|-o option.

Underneath, this command roughly performs the following steps: First it installs the specified packages similar to the bpkg-pkg-install(1) command except that it may override the installation locations (via the config.install.* variables) to match the distribution's layout. Then it generates any necessary distribution package metadata files based on the information from the package manifest files. Finally, it invokes the distribution-specific command to produce the binary package. Unless overridden with the --architecture and --distribution options, the binary package is generated for the host architecture using the host's standard system package manager. Additional command line variables (vars, normally config.*) can be passed to the build system during the installation step. See the following distribution-specific description sections below for details and invocation examples:

DEBIAN DESCRIPTION

FEDORA DESCRIPTION

ARCHIVE DESCRIPTION

The specified packages may have dependencies and the default behavior is to not bundle them but rather to specify them as dependencies in the corresponding distribution package metadata, if applicable. This default behavior can be overridden with the --recursive option (see the option description for the available modes). Note, however, that dependencies that are satisfied by system packages are always specified as dependencies in the distribution package metadata (if applicable).

PKG-BINDIST OPTIONS

See the following sections below for distribution-specific options:

PKG-BINDIST DEBIAN OPTIONS

PKG-BINDIST FEDORA OPTIONS

PKG-BINDIST ARCHIVE OPTIONS

--distribution name
Alternative system/distribution package manager to generate the binary package for. The valid name values are debian (Debian and alike, such as Ubuntu, etc), fedora (Fedora and alike, such as RHEL, CentOS, etc), and archive (installation archive on any operating system). Note that some package managers may only be supported when running on certain host operating systems.
--architecture name
Alternative architecture to generate the binary package for. The valid name values are system/distribution package manager-specific. If unspecified, the host architecture is used.
--recursive mode
Bundle or generate dependencies of the specified packages. The mode value can be either auto, in which case only the required files from each dependency package are bundled, full, in which case all the files are bundled, or separate, in which case a separate binary package is generated for each non-system dependency. It can also be none which is equivalent to not specifying this option (primarily useful for overriding a previously-specified value).

Specifically, in the auto mode any required files, such as shared libraries, are pulled implicitly by the install build system operation, for example, as part of installing an executable from one of the specified packages. In contrast, in the full mode, each dependency package is installed explicitly and completely, as if they were specified as additional package on the command line. The separate mode is equivalent to invoking the pkg-bindist command on each dependency package. See also the --private option.

--private
Enable the private installation subdirectory functionality using the package name as the private subdirectory. This is primarily useful when bundling dependencies, such as shared libraries, of an executable that is being installed into a shared location, such as /usr/. See the config.install.private configuration variable documentation in the build system manual for details. This option only makes sense together with the --recursive option auto and full modes.
--output-root|-o dir
Directory for intermediate files and subdirectories as well as the resulting binary package. Note that this option may be required for some system package managers and may not be specified for others.
--wipe-output
Wipe the output root directory (either specified with --output-root or system package manager-specific) clean before using it to generate the binary package.
--keep-output
Keep intermediate files in the output root directory (either specified with --output-root or system package manager-specific) that were used to generate the binary package. This is primarily useful for troubleshooting.
--allow-dependent-config
Allow configuration that is imposed by dependent packages. Normally this is undesirable because the resulting binary packages become configured specificaly for particular dependent packages.
--os-release-id v
Override the ID component in os-release(5) or equivalent. Note that unlike the rest of the --os-release-* options, this option suppresses automatic detection of the host operating system information.
--os-release-version-id v
Override the VERSION_ID component in os-release(5) or equivalent.
--os-release-name v
Override the NAME component in os-release(5) or equivalent.
--directory|-d dir
Assume configuration is in dir rather than in the current working directory.

COMMON OPTIONS

The common options are summarized below with a more detailed description available in bpkg-common-options(1).

-v
Print essential underlying commands being executed.
-V
Print all underlying commands being executed.
--quiet|-q
Run quietly, only printing error messages.
--verbose level
Set the diagnostics verbosity to level between 0 and 6.
--stdout-format format
Representation format to use for printing to stdout.
--jobs|-j num
Number of jobs to perform in parallel.
--no-result
Don't print informational messages about the outcome of performing a command or some of its parts.
--structured-result fmt
Write the result of performing a command in a structured form.
--progress
Display progress indicators for long-lasting operations, such as network transfers, building, etc.
--no-progress
Suppress progress indicators for long-lasting operations, such as network transfers, building, etc.
--diag-color
Use color in diagnostics.
--no-diag-color
Don't use color in diagnostics.
--build path
The build program to be used to build packages.
--build-option opt
Additional option to be passed to the build program.
--fetch path
The fetch program to be used to download resources.
--fetch-option opt
Additional option to be passed to the fetch program.
--fetch-timeout sec
The fetch and fetch-like (for example, git) program timeout.
--pkg-proxy url
HTTP proxy server to use when fetching package manifests and archives from remote pkg repositories.
--git path
The git program to be used to fetch git repositories.
--git-option opt
Additional common option to be passed to the git program.
--sha256 path
The sha256 program to be used to calculate SHA256 sums.
--sha256-option opt
Additional option to be passed to the sha256 program.
--tar path
The tar program to be used to extract package archives.
--tar-option opt
Additional option to be passed to the tar program.
--openssl path
The openssl program to be used for crypto operations.
--openssl-option opt
Additional option to be passed to the openssl program.
--auth type
Types of repositories to authenticate.
--trust fingerprint
Trust repository certificate with a SHA256 fingerprint.
--trust-yes
Assume the answer to all authentication prompts is yes.
--trust-no
Assume the answer to all authentication prompts is no.
--git-capabilities up=pc
Protocol capabilities (pc) for a git repository URL prefix (up).
--pager path
The pager program to be used to show long text.
--pager-option opt
Additional option to be passed to the pager program.
--options-file file
Read additional options from file.
--default-options dir
The directory to load additional default options files from.
--no-default-options
Don't load default options files.
--keep-tmp
Don't remove the bpkg's temporary directory at the end of the command execution and print its path at the verbosity level 2 or higher.

DEBIAN DESCRIPTION

The Debian binary packages are generated by producing the standard debian/control, debian/rules, and other package metadata files and then invoking dpkg-buildpackage(1) to build the binary package from that. In particular, the debian/rules implemenation is based on the dh(1) command sequencer. While this approach is normally used to build packages from source, this implementation "pretends" that this is what's happening by overriding a number of dh targets to invoke the build2 build system on the required packages directly in their bpkg configuration locations.

The dpkg-dev (or build-essential) and debhelper Debian packages must be installed before invocation. Typical invocation:

bpkg build libhello
bpkg test libhello
bpkg bindist -o /tmp/output/ libhello

Unless the --recursive option auto or full modes are specified, dependencies of the specified package are translated to dependencies in the resulting binary package using names and versions that refer to packages that would be generated by the pkg-bindist command (called "non-native" packages). If instead you would like certain dependencies to refer to binary packages provided by the distribution (called "native" packages), then you need to arrange for them to be built as system (see bpkg-pkg-build(1) for details). For example, if our libhello has a dependency on libsqlite3 and we would like the binary package for libhello to refer to libsqlite3 from Debian (or alike), then the pkg-build command would need to be (--sys-install is optional):

bpkg build --sys-install libhello ?sys:libsqlite3

Such a package with native dependencies can then be installed (including any missing native dependencies) using the apt or apt-get install command. Note that the specified .deb file must include a directory separator (/) in order to be recognized as a file rather than a package name. For example:

sudo apt-get install ./libhello_1.2.3-0~debian11_amd64.deb \
                     ./libhello-dev_1.2.3-0~debian11_amd64.deb

See Debian Package Mapping for Production for details on bpkg to Debian package name and version mapping.

PKG-BINDIST DEBIAN OPTIONS

--debian-prepare-only
Prepare all the package metadata files (control, rules, etc) but do not invoke dpkg-buildpackage to generate the binary package, printing its command line instead unless requested to be quiet. Implies --keep-output.
--debian-buildflags mode
Package build flags (dpkg-buildflags) usage mode. Valid mode values are assign (use the build flags instead of configured), append (use the build flags in addition to configured, putting them last), prepend (use the build flags in addition to configured, putting them first), and ignore (ignore build flags). The default mode is assign. Note that compiler mode options, if any, are used as configured.
--debian-maint-option o
Alternative options to specify in the DEB_BUILD_MAINT_OPTIONS variable of the rules file. To specify multiple maintainer options repeat this option and/or specify them as a single value separated with spaces.
--debian-build-option o
Additional option to pass to the dpkg-buildpackage program. Repeat this option to specify multiple build options.
--debian-build-meta data
Alternative or additional build metadata to include in the binary package version. If the specified value starts/ends with + then the value (with + removed) is added after/before the default metadata. Otherwise it is used as is instead of the default metadata. If empty value is specified, then no build metadata is included. By default, the build metadata is the ID and VERSION_ID components from os-release(5), for example, debian10 in version 1.2.3-0~debian10. See also --os-release-*.
--debian-section v
Alternative Section control file field value for the main binary package. The default is either libs or devel, depending on the package type.
--debian-priority v
Alternative Priority control file field value. The default is optional.
--debian-maintainer v
Alternative Maintainer control file field value. The default is the package-email value from package manifest.
--debian-architecture v
Alternative Architecture control file field value for the main binary package, normally all (architecture-independent). The default is any (architecture-dependent).
--debian-main-langdep v
Override the language runtime dependencies (such as libc6, libstdc++6, etc) in the Depends control file field value of the main binary package.
--debian-dev-langdep v
Override the language runtime dependencies (such as libc-dev, libstdc++-dev, etc) in the Depends control file field value of the development (-dev) binary package.
--debian-main-extradep v
Extra dependencies to add to the Depends control file field value of the main binary package.
--debian-dev-extradep v
Extra dependencies to add to the Depends control file field value of the development (-dev) binary package.

FEDORA DESCRIPTION

The Fedora binary packages are generated by producing the standard RPM spec file and then invoking rpmbuild(8) to build the binary package from that. While this approach is normally used to build packages from source, this implementation "pretends" that this is what's happening by overriding a number of RPM spec file sections to invoke the build2 build system on the required packages directly in their bpkg configuration locations.

The rpmdevtools Fedora package must be installed before invocation. Typical invocation:

bpkg build libhello
bpkg test libhello
bpkg bindist libhello

The resulting binary packages are placed into the standard rpmbuild output directory (normally ~/rpmbuild/RPMS/arch/).

Unless the --recursive option auto or full modes are specified, dependencies of the specified package are translated to dependencies in the resulting binary package using names and versions that refer to packages that would be generated by the pkg-bindist command (called "non-native" packages). If instead you would like certain dependencies to refer to binary packages provided by the distribution (called "native" packages), then you need to arrange for them to be built as system (see bpkg-pkg-build(1) for details). For example, if our libhello has a dependency on libsqlite3 and we would like the binary package for libhello to refer to sqlite-libs from Fedora (or alike), then the pkg-build command would need to be (--sys-install is optional):

bpkg build --sys-install libhello ?sys:libsqlite3

Such a package with native dependencies can then be installed (including any missing native dependencies) using the dnf install command. For example:

sudo dnf install libhello-1.2.3-1.fc35.x86_64.rpm \
                 libhello-devel-1.2.3-1.fc35.x86_64.rpm

See Fedora Package Mapping for Production for details on bpkg to Fedora package name and version mapping.

PKG-BINDIST FEDORA OPTIONS

--fedora-prepare-only
Prepare the RPM spec file but do not invoke rpmbuild to generate the binary package, printing its command line instead unless requested to be quiet.
--fedora-buildflags mode
Package build flags (%{build_*flags} macros) usage mode. Valid mode values are assign (use the build flags instead of configured), append (use the build flags in addition to configured, putting them last), prepend (use the build flags in addition to configured, putting them first), and ignore (ignore build flags). The default mode is assign. Note that compiler mode options, if any, are used as configured.
--fedora-build-option o
Additional option to pass to the rpmbuild program. If specified, these options must be consistent with the query options (--fedora-query-option) to result in identical macro expansions. Repeat this option to specify multiple build options.
--fedora-query-option o
Additional option to pass to the rpm program. This program is used to query RPM macro values which affect the binary package. If specified, these options must be consistent with the build options (--fedora-build-option) to result in identical macro expansions. Repeat this option to specify multiple query options.
--fedora-dist-tag tag
Alternative or additional distribution tag to use in the binary package release. If the specified value starts/ends with + then the value (with + removed) is added after/before the default distribution tag. Otherwise it is used as is instead of the default tag. If empty value is specified, then no distribution tag is included. The default is a value that identifies the distribution being used to build the package, for example, fc35 for Fedora 35 or el8 for RHEL 8.
--fedora-packager v
Alternative Packager RPM spec file directive value. The default is the package-email value from package manifest. If empty value is specified, then the Packager directive is omitted from the spec file.
--fedora-build-arch v
BuildArch RPM spec file directive value for the main binary package, normally noarch (architecture-independent). By default the directive is omitted, assuming that the package is architecture-dependent.
--fedora-main-langreq v
Override the language runtime dependencies (such as glibc, libstdc++, etc) of the main binary package by replacing the corresponding Requires RPM spec file directives. If empty value is specified then no language runtime dependencies are specified. Repeat this option to specify multiple language runtime dependencies.
--fedora-devel-langreq v
Override the language runtime dependencies (such as glibc-devel, libstdc++-devel, etc) of the development (-devel) binary package by replacing the corresponding Requires RPM spec file directives. If empty value is specified then no language runtime dependencies are specified. Repeat this option to specify multiple language runtime dependencies.
--fedora-stat-langreq v
Override the language runtime dependencies (such as glibc-static, libstdc++-static, etc) of the static libraries (-static) binary package by replacing the corresponding Requires RPM spec file directives. If empty value is specified then no language runtime dependencies are specified. Repeat this option to specify multiple language runtime dependencies.
--fedora-main-extrareq v
Extra dependency to add to the main binary package as an additional Requires RPM spec file directive. Repeat this option to specify multiple extra dependencies.
--fedora-devel-extrareq v
Extra dependency to add to the development (-devel) binary package as an additional Requires RPM spec file directive. Repeat this option to specify multiple extra dependencies.
--fedora-stat-extrareq v
Extra dependency to add to the static libraries (-static) binary package as an additional Requires RPM spec file directive. Repeat this option to specify multiple extra dependencies.

ARCHIVE DESCRIPTION

The installation archive binary packages are generated by invoking the build2 build system on the required packages directly in their bpkg configuration locations and installing them into the binary package directory using the config.install.chroot mechanism. Then this directory is packaged with tar or zip to produce one or more binary package archives.

The generation of installation archive packages is never the default and should be requested explicitly with the --distribution=archive option. The installation directory layout and the package archives to generate can be specified with the --archive-install-* and --archive-type options (refer to their documentation for defaults).

The binary package directory (the top-level directory inside the archive) as well as the archive file base (the file name without the extension) are the same and have the following form:

package-version-build_metadata

Where package is the package name and version is the bpkg package version. Unless overridden with the --archive-build-meta option, build_metadata has the following form:

cpu-os[-langrt...]

Where cpu is the target CPU (for example, x86_64 or aarch64; omitted if --archive-no-cpu is specified), os is the ID and VERSION_ID components from os-release(5) (or equivalent, for example, debian11 or windows10; omitted if --archive-no-os is specified), and langrt are the language runtimes as mapped by the --archive-lang* options (for example, gcc12 or msvc17.4).

For example, given the following invocation on Debian 11 running on x86_64:

bpkg build libhello
bpkg test libhello
bpkg bindist              \
  -o /tmp/output/         \
  --distribution=archive  \
  --archive-lang cc=gcc12 \
  libhello

We will end up with the package archive in the following form:

libhello-1.2.3-x86_64-debian11-gcc12.tar.xz

The recommended language runtime id format is the runtime name followed by the version, for example, gcc12 or msvc17.4. Note that its purpose is not to provide a precise specification of requirements but rather to help the user of a binary package to pick the appropriate variant. Refer to the --archive-lang* options documentation for details on the mapping semantics.

Instead of mapping languages individually you can specify entire build metadata as a single value with the --archive-build-meta (it is also possible to add additional metadata; see the option documentation for details). For example:

bpkg bindist                              \
  -o /tmp/output/                         \
  --distribution=archive                  \
  --archive-build-meta=x86_64-linux-glibc
  libhello

This will produce the package archive in the following form:

libhello-1.2.3-x86_64-linux-glibc.tar.xz

To install the binary package from archive simply unpack it using tar or zip. You can use the --strip-components tar option to remove the top-level package directory (the same can be achieved for zip archives by using bsdtar on Windows). For example, to unpack the package contents so that they end up in /usr/local/:

sudo tar -xf libhello-1.2.3-x86_64-debian11-gcc12.tar.xz \
  -C / --strip-components=1

If you expect the binary package to be unpacked into a directory other than its original installation directory (--archive-install-root), then it's recommended to make it relocatable by specifying the config.install.relocatable=true configuration variable. For example:

bpkg bindist                      \
  ...                             \
  config.install.relocatable=true \
  libhello

Note that not all source packages support relocatable installation (see Rolocatable Installation for details).

Another mechanism that can useful when generating archive packages is the ability to filter the files being installed. This, for example, can be used to create binary packages that don't contain any development-related files. See Installation Filtering for details. See also the --archive-split option.

The installation archive package can be generated for a target other than the host by specifying the target triplet with the --architecture option. In this case the bpkg configuration is assumed to be appropriately configured for cross-compiling to the specified target. You will also need to explicitly specify the --archive-install-root option (or --archive-install-config) as well as the --os-release-id option (and likely want to specify other --os-release-* options). For example, for cross-compiling from Linux to Windows using the MinGW GCC toolchain:

bpkg bindist                        \
  --distribution=archive            \
  --architecture=x86_64-w64-mingw32 \
  --os-release-id=windows           \
  --os-release-name=Windows         \
  --os-release-version-id=10        \
  --archive-install-root /          \
  --archive-lang cc=mingw_w64_gcc12 \
  ...

PKG-BINDIST ARCHIVE OPTIONS

--archive-prepare-only
Prepare all the package contents but do not create the binary package archive, printing its directory instead unless requested to be quiet. Implies --keep-output.
--archive-type ext
Archive type to create specified as a file extension, for example, tar.xz, tar.gz, tar, zip. Repeat this option to generate multiple archive types. If unspecified, then a default type appropriate for the target operating system is used, currently zip for Windows and tar.xz for POSIX. Note, however, that these defaults may change in the future.
--archive-lang ln=rt
Map interface language name ln to runtime id rt. If no mapping is found for an interface language in this map, then fallback to the --archive-lang-impl map. If still no mapping is found, then fail. If the information about an interface language is unimportant and should be ignored, then empty runtime id can be specified. Note that the mapping specified with this option is only considered if the package type is a library (for other package types all languages used are implementation). Note also that multiple runtime ids specified for the same language are combined except for an empty id, which is treated as a request to clear previous entries.
--archive-lang-impl ln=rt
Map implementation language name ln to runtime id rt. If no mapping is found for an implementation language in this map, then assume the information about this implementation language is unimportant and ignore it (examples of such cases include static linking as well as a language runtime that is always present). See --archive-lang for background.
--archive-no-cpu
Assume the package is CPU architecture-independent and omit it from the binary package directory name and archive file base.
--archive-no-os
Assume the package is operating system-independent and omit it from the binary package directory name and archive file base.
--archive-build-meta data
Alternative or additional build metadata to include after the version in the binary package directory and file names. If the specified value starts/ends with + then the value (with + removed) is added after/before the default metadata. Otherwise it is used as is instead of the default metadata. If empty value is specified, then no build metadata is included.
--archive-install-root d
Alternative installation root directory. The default is /usr/local/ on POSIX and C:\project\ on Windows, where project is the project package manifest value.
--archive-install-config
Use the installation directory layout (config.install.* variables) as configured instead of overriding them with defaults appropriate for the target operating system. Note that this includes config.install.private and config.bin.rpath if needed for a private installation. Note also that the config.install.root value is still overridden with the --archive-install-root option value if specified.
--archive-split key=filt
Split the installation into multiple binary packages. Specifically, for each key=filt pair, perform the install operation with config.install.filter=filt and package the resulting files as package-key-version-build_metadata omitting the -key part if key is empty. Note that wildcard patterns in filt must be quoted. See Installation Filtering for background.

STRUCTURED RESULT

Instead of printing to stderr the list of generated binary packages in a format more suitable for human consumption, the pkg-bindist command can be instructed to write it to stdout in a machine-readable form by specifying the --structured-result option. Currently, the only recognized format value for this option is json with the output being a JSON object that is a serialized representation of the following C++ struct bindist_result:

struct os_release
{
  string           name_id;     // ID
  vector<string>   like_ids;    // ID_LIKE
  optional<string> version_id;  // VERSION_ID
  optional<string> variant_id;  // VARIANT_ID

  optional<string> name;              // NAME
  optional<string> version_codename;  // VERSION_CODENAME
  optional<string> variant;           // VARIANT
};

struct file
{
  string type;
  string path;
  optional<string> system_name;
};

struct package
{
  string           name;
  string           version;
  optional<string> system_version;
  vector<file>     files;
};

struct bindist_result
{
  string           distribution;     // --distribution or auto-detected
  string           architecture;     // --architecture or auto-detected
  os_release       os_release;       // --os-release-* or auto-detected
  optional<string> recursive;        // --recursive
  bool             private;          // --private
  bool             dependent_config; // See --allow-dependent-config

  package          package;
  vector<package>  dependencies;     // Only in --recursive=separate
};

For example:

{
  "distribution": "debian",
  "architecture": "amd64",
  "os_release": {
    "name_id": "debian",
    "version_id": "11",
    "name": "Debian GNU/Linux"
  },
  "package": {
    "name": "libfoo",
    "version": "2.5.0-b.23",
    "system_version": "2.5.0~b.23-0~debian11",
    "files": [
      {
        "type": "main.deb",
        "path": "/tmp/libfoo_2.5.0~b.23-0~debian11_amd64.deb",
        "system_name": "libfoo"
      },
      {
        "type": "dev.deb",
        "path": "/tmp/libfoo-dev_2.5.0~b.23-0~debian11_amd64.deb",
        "system_name": "libfoo-dev"
      },
      ...
    ]
  }
}

See the JSON OUTPUT section in bpkg-common-options(1) for details on the overall properties of this format and the semantics of the struct serialization.

The file::type member is a distribution-specific value that classifies the file. For the debian distribution the possible values are main.deb, dev.deb, doc.deb, common.deb, dbgsym.deb, changes (.changes file), and buildid (.buildid file); see Debian Package Mapping for Production for background. For the fedora distribution the possible values are main.rpm, devel.rpm, static.rpm, doc.rpm, common.rpm, and debuginfo.rpm; see Fedora Package Mapping for Production for background. For the archive distribution this is the archive type (--archive-type), for example, tar.xz or zip, potentially prefixed with key if the --archive-split functionality is used, for example, dev.tar.xz.

The package::system_version and/or file::system_name members are absent if not applicable to the distribution. The file::system_name member is also absent if the file is not a binary package (for example, .changes and .buildid files in the debian distribution).

DEFAULT OPTIONS FILES

See bpkg-default-options-files(1) for an overview of the default options files. For the pkg-bindist command the search start directory is the configuration directory. The following options files are searched for in each directory and, if found, loaded in the order listed:

bpkg.options
bpkg-pkg-bindist.options

The following pkg-bindist command options cannot be specified in the default options files:

--directory|-d

BUGS

Send bug reports to the users@build2.org mailing list.