diff options
Diffstat (limited to 'bpkg/pkg-bindist.cli')
-rw-r--r-- | bpkg/pkg-bindist.cli | 908 |
1 files changed, 908 insertions, 0 deletions
diff --git a/bpkg/pkg-bindist.cli b/bpkg/pkg-bindist.cli new file mode 100644 index 0000000..1401723 --- /dev/null +++ b/bpkg/pkg-bindist.cli @@ -0,0 +1,908 @@ +// file : bpkg/pkg-bindist.cli +// license : MIT; see accompanying LICENSE file + +include <map>; + +include <bpkg/configuration.cli>; + +"\section=1" +"\name=bpkg-pkg-bindist" +"\summary=generate binary distribution package" + +namespace bpkg +{ + { + "<options> <dir> <vars> <pkg>", + + "\h|SYNOPSIS| + + \c{\b{bpkg pkg-bindist}|\b{bindist} [\b{--output-root}|\b{-o} <dir>] [<options>] [<vars>] <pkg>...} + + \h|DESCRIPTION| + + The \cb{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 \l{bpkg-pkg-build(1)} or + \l{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 + \c{\b{--output-root}|\b{-o}} option. + + Underneath, this command roughly performs the following steps: First it + installs the specified packages similar to the \l{bpkg-pkg-install(1)} + command except that it may override the installation locations (via the + \cb{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 \cb{manifest} files. Finally, it invokes + the distribution-specific command to produce the binary package. Unless + overridden with the \cb{--architecture} and \cb{--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 \cb{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: + + \l{#debian DEBIAN DESCRIPTION} + + \l{#fedora FEDORA DESCRIPTION} + + \l{#archive 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 \cb{--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). + " + } + + // Place distribution-specific options into separate classes in case one day + // we want to only pass their own options to each implementation. + // + class pkg_bindist_common_options: configuration_options + { + "\h|PKG-BINDIST OPTIONS| + + See the following sections below for distribution-specific options: + + \l{#debian-options PKG-BINDIST DEBIAN OPTIONS} + + \l{#fedora-options PKG-BINDIST FEDORA OPTIONS} + + \l{#archive-options PKG-BINDIST ARCHIVE OPTIONS} + " + + string --distribution + { + "<name>", + "Alternative system/distribution package manager to generate the binary + package for. The valid <name> values are \cb{debian} (Debian and alike, + such as Ubuntu, etc), \cb{fedora} (Fedora and alike, such as RHEL, + CentOS, etc), and \cb{archive} (installation archive on any operating + system). Note that some package managers may only be supported when + running on certain host operating systems." + } + + string --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." + } + + string --recursive = "none" + { + "<mode>", + "Bundle or generate dependencies of the specified packages. The <mode> + value can be either \cb{auto}, in which case only the required files + from each dependency package are bundled, \cb{full}, in which case + all the files are bundled, or \cb{separate}, in which case a separate + binary package is generated for each non-system dependency. It can + also be \cb{none} which is equivalent to not specifying this option + (primarily useful for overriding a previously-specified value). + + Specifically, in the \cb{auto} mode any required files, such as shared + libraries, are pulled implicitly by the \cb{install} build system + operation, for example, as part of installing an executable from one of + the specified packages. In contrast, in the \cb{full} mode, each + dependency package is installed explicitly and completely, as if they + were specified as additional package on the command line. The + \cb{separate} mode is equivalent to invoking the \cb{pkg-bindist} + command on each dependency package. See also the \cb{--private} option." + } + + bool --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 \cb{/usr/}. See the + \cb{config.install.private} configuration variable documentation in the + build system manual for details. This option only makes sense together + with the \cb{--recursive} option \cb{auto} and \cb{full} modes." + } + + dir_path --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." + } + + bool --wipe-output + { + "Wipe the output root directory (either specified with \ci{--output-root} + or system package manager-specific) clean before using it to generate + the binary package." + } + + bool --keep-output + { + "Keep intermediate files in the output root directory (either specified + with \ci{--output-root} or system package manager-specific) that were + used to generate the binary package. This is primarily useful for + troubleshooting." + } + + bool --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." + } + + string --os-release-id + { + "<v>", + "Override the \cb{ID} component in \cb{os-release(5)} or equivalent. + Note that unlike the rest of the \cb{--os-release-*} options, this + option suppresses automatic detection of the host operating system + information." + } + + string --os-release-version-id + { + "<v>", + "Override the \cb{VERSION_ID} component in \cb{os-release(5)} or + equivalent." + } + + string --os-release-name + { + "<v>", + "Override the \cb{NAME} component in \cb{os-release(5)} or equivalent." + } + }; + + class pkg_bindist_debian_options + { + "\h#debian|DEBIAN DESCRIPTION| + + The Debian binary packages are generated by producing the standard + \cb{debian/control}, \cb{debian/rules}, and other package metadata files + and then invoking \cb{dpkg-buildpackage(1)} to build the binary package + from that. In particular, the \cb{debian/rules} implemenation is based on + the \cb{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 \cb{dh} targets to invoke the + \cb{build2} build system on the required packages directly in their + \cb{bpkg} configuration locations. + + The \cb{dpkg-dev} (or \cb{build-essential}) and \cb{debhelper} Debian + packages must be installed before invocation. Typical invocation: + + \ + bpkg build libhello + bpkg test libhello + bpkg bindist -o /tmp/output/ libhello + \ + + Unless the \cb{--recursive} option \cb{auto} or \cb{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 \cb{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 \l{bpkg-pkg-build(1)} for details). For + example, if our \cb{libhello} has a dependency on \cb{libsqlite3} and we + would like the binary package for \cb{libhello} to refer to + \cb{libsqlite3} from Debian (or alike), then the \cb{pkg-build} command + would need to be (\cb{--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 \cb{apt} or \cb{apt-get} + \cb{install} command. Note that the specified \cb{.deb} file must include + a directory separator (\c{/}) 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 \l{bpkg#bindist-mapping-debian-produce Debian Package Mapping for + Production} for details on \cb{bpkg} to Debian package name and version + mapping. + " + + "\h#debian-options|PKG-BINDIST DEBIAN OPTIONS|" + + bool --debian-prepare-only + { + "Prepare all the package metadata files (\cb{control}, \cb{rules}, etc) + but do not invoke \cb{dpkg-buildpackage} to generate the binary + package, printing its command line instead unless requested to be + quiet. Implies \cb{--keep-output}." + } + + string --debian-buildflags = "assign" + { + "<mode>", + "Package build flags (\cb{dpkg-buildflags}) usage mode. Valid <mode> + values are \cb{assign} (use the build flags instead of configured), + \cb{append} (use the build flags in addition to configured, putting + them last), \cb{prepend} (use the build flags in addition to + configured, putting them first), and \cb{ignore} (ignore build + flags). The default mode is \cb{assign}. Note that compiler mode + options, if any, are used as configured." + } + + strings --debian-maint-option + { + "<o>", + "Alternative options to specify in the \cb{DEB_BUILD_MAINT_OPTIONS} + variable of the \cb{rules} file. To specify multiple maintainer options + repeat this option and/or specify them as a single value separated + with spaces." + } + + strings --debian-build-option + { + "<o>", + "Additional option to pass to the \cb{dpkg-buildpackage} program. Repeat + this option to specify multiple build options." + } + + string --debian-build-meta + { + "<data>", + "Alternative or additional build metadata to include in the binary + package version. If the specified value starts/ends with \cb{+} then + the value (with \cb{+} 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 \cb{ID} and \cb{VERSION_ID} + components from \cb{os-release(5)}, for example, \cb{debian10} in + version \cb{1.2.3-0~debian10}. See also \cb{--os-release-*}." + } + + string --debian-section + { + "<v>", + "Alternative \cb{Section} \cb{control} file field value for the main + binary package. The default is either \cb{libs} or \cb{devel}, + depending on the package type." + } + + string --debian-priority + { + "<v>", + "Alternative \cb{Priority} \cb{control} file field value. The default + is \cb{optional}." + } + + string --debian-maintainer + { + "<v>", + "Alternative \cb{Maintainer} \cb{control} file field value. The + default is the \cb{package-email} value from package \cb{manifest}." + } + + string --debian-architecture + { + "<v>", + "Alternative \cb{Architecture} \cb{control} file field value for + the main binary package, normally \cb{all} (architecture-independent). + The default is \cb{any} (architecture-dependent)." + } + + string --debian-main-langdep + { + "<v>", + "Override the language runtime dependencies (such as \cb{libc6}, + \cb{libstdc++6}, etc) in the \cb{Depends} \cb{control} file field + value of the main binary package." + } + + string --debian-dev-langdep + { + "<v>", + "Override the language runtime dependencies (such as \cb{libc-dev}, + \cb{libstdc++-dev}, etc) in the \cb{Depends} \cb{control} file field + value of the development (\cb{-dev}) binary package." + } + + string --debian-main-extradep + { + "<v>", + "Extra dependencies to add to the \cb{Depends} \cb{control} file field + value of the main binary package." + } + + string --debian-dev-extradep + { + "<v>", + "Extra dependencies to add to the \cb{Depends} \cb{control} file field + value of the development (\cb{-dev}) binary package." + } + }; + + class pkg_bindist_fedora_options + { + "\h#fedora|FEDORA DESCRIPTION| + + The Fedora binary packages are generated by producing the standard RPM + spec file and then invoking \cb{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 \cb{build2} + build system on the required packages directly in their \cb{bpkg} + configuration locations. + + The \cb{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 \cb{rpmbuild} + output directory (normally \c{\b{~/rpmbuild/RPMS/}\i{arch}\b{/}}). + + Unless the \cb{--recursive} option \cb{auto} or \cb{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 \cb{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 \l{bpkg-pkg-build(1)} for details). For + example, if our \cb{libhello} has a dependency on \cb{libsqlite3} and we + would like the binary package for \cb{libhello} to refer to + \cb{sqlite-libs} from Fedora (or alike), then the \cb{pkg-build} command + would need to be (\cb{--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 \cb{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 \l{bpkg#bindist-mapping-fedora-produce Fedora Package Mapping for + Production} for details on \cb{bpkg} to Fedora package name and version + mapping. + " + + "\h#fedora-options|PKG-BINDIST FEDORA OPTIONS|" + + bool --fedora-prepare-only + { + "Prepare the RPM spec file but do not invoke \cb{rpmbuild} to generate + the binary package, printing its command line instead unless requested + to be quiet." + } + + string --fedora-buildflags = "assign" + { + "<mode>", + "Package build flags (\cb{%{build_*flags\}} macros) usage mode. Valid + <mode> values are \cb{assign} (use the build flags instead of + configured), \cb{append} (use the build flags in addition to + configured, putting them last), \cb{prepend} (use the build flags in + addition to configured, putting them first), and \cb{ignore} (ignore + build flags). The default mode is \cb{assign}. Note that compiler mode + options, if any, are used as configured." + } + + strings --fedora-build-option + { + "<o>", + "Additional option to pass to the \cb{rpmbuild} program. If specified, + these options must be consistent with the query options + (\cb{--fedora-query-option}) to result in identical macro + expansions. Repeat this option to specify multiple build options." + } + + strings --fedora-query-option + { + "<o>", + "Additional option to pass to the \cb{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 + (\cb{--fedora-build-option}) to result in identical macro expansions. + Repeat this option to specify multiple query options." + } + + string --fedora-dist-tag + { + "<tag>", + "Alternative or additional distribution tag to use in the binary package + release. If the specified value starts/ends with \cb{+} then the value + (with \cb{+} 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, \cb{fc35} for Fedora 35 or \cb{el8} for RHEL 8." + } + + string --fedora-packager + { + "<v>", + "Alternative \cb{Packager} RPM spec file directive value. The default is + the \cb{package-email} value from package \cb{manifest}. If empty value + is specified, then the \cb{Packager} directive is omitted from the spec + file." + } + + string --fedora-build-arch + { + "<v>", + "\cb{BuildArch} RPM spec file directive value for the main binary + package, normally \cb{noarch} (architecture-independent). By default + the directive is omitted, assuming that the package is + architecture-dependent." + } + + strings --fedora-main-langreq + { + "<v>", + "Override the language runtime dependencies (such as \cb{glibc}, + \cb{libstdc++}, etc) of the main binary package by replacing the + corresponding \cb{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." + } + + strings --fedora-devel-langreq + { + "<v>", + "Override the language runtime dependencies (such as \cb{glibc-devel}, + \cb{libstdc++-devel}, etc) of the development (\cb{-devel}) binary + package by replacing the corresponding \cb{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." + } + + strings --fedora-stat-langreq + { + "<v>", + "Override the language runtime dependencies (such as \cb{glibc-static}, + \cb{libstdc++-static}, etc) of the static libraries (\cb{-static}) + binary package by replacing the corresponding \cb{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." + } + + strings --fedora-main-extrareq + { + "<v>", + "Extra dependency to add to the main binary package as an additional + \cb{Requires} RPM spec file directive. Repeat this option to specify + multiple extra dependencies." + } + + strings --fedora-devel-extrareq + { + "<v>", + "Extra dependency to add to the development (\cb{-devel}) binary package + as an additional \cb{Requires} RPM spec file directive. Repeat this + option to specify multiple extra dependencies." + } + + strings --fedora-stat-extrareq + { + "<v>", + "Extra dependency to add to the static libraries (\cb{-static}) binary + package as an additional \cb{Requires} RPM spec file directive. Repeat + this option to specify multiple extra dependencies." + } + }; + + class pkg_bindist_archive_options + { + "\h#archive|ARCHIVE DESCRIPTION| + + The installation archive binary packages are generated by invoking the + \cb{build2} build system on the required packages directly in their + \cb{bpkg} configuration locations and installing them into the binary + package directory using the \cb{config.install.chroot} mechanism. Then + this directory is packaged with \cb{tar} or \cb{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 \cb{--distribution=archive} + option. The installation directory layout and the package archives to + generate can be specified with the \cb{--archive-install-*} and + \cb{--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: + + \c{\i{package}-\i{version}-\i{build_metadata}} + + Where \ci{package} is the package name and \ci{version} is the \cb{bpkg} + package version. Unless overridden with the \cb{--archive-build-meta} + option, \ci{build_metadata} has the following form: + + \c{\i{cpu}-\i{os}[-\i{langrt}...]} + + Where \ci{cpu} is the target CPU (for example, \cb{x86_64} or + \cb{aarch64}; omitted if \cb{--archive-no-cpu} is specified), \ci{os} is + the \cb{ID} and \cb{VERSION_ID} components from \cb{os-release(5)} (or + equivalent, for example, \cb{debian11} or \cb{windows10}; omitted if + \cb{--archive-no-os} is specified), and \ci{langrt} are the language + runtimes as mapped by the \cb{--archive-lang*} options (for example, + \cb{gcc12} or \cb{msvc17.4}). + + For example, given the following invocation on Debian 11 running on + \cb{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, \cb{gcc12} or \cb{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 \cb{--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 \cb{--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 + \cb{tar} or \cb{zip}. You can use the \cb{--strip-components} \cb{tar} + option to remove the top-level package directory (the same can be + achieved for \cb{zip} archives by using \cb{bsdtar} on Windows). For + example, to unpack the package contents so that they end up in + \cb{/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 (\cb{--archive-install-root}), + then it's recommended to make it relocatable by specifying the + \cb{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 + \l{b#install-reloc 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 \l{b#install-filter Installation Filtering} for details. See + also the \cb{--archive-split} option. + + The installation archive package can be generated for a target other than + the host by specifying the target triplet with the \cb{--architecture} + option. In this case the \cb{bpkg} configuration is assumed to be + appropriately configured for cross-compiling to the specified target. You + will also need to explicitly specify the \cb{--archive-install-root} + option (or \cb{--archive-install-config}) as well as the + \cb{--os-release-id} option (and likely want to specify other + \cb{--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 \ + ... + \ + " + + "\h#archive-options|PKG-BINDIST ARCHIVE OPTIONS|" + + bool --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 \cb{--keep-output}." + } + + strings --archive-type + { + "<ext>", + "Archive type to create specified as a file extension, for example, + \cb{tar.xz}, \cb{tar.gz}, \cb{tar}, \cb{zip}. Repeat this option to + generate multiple archive types. If unspecified, then a default type + appropriate for the target operating system is used, currently \cb{zip} + for Windows and \cb{tar.xz} for POSIX. Note, however, that these + defaults may change in the future." + } + + std::multimap<string, string> --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 + \cb{--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." + } + + std::multimap<string, string> --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 \cb{--archive-lang} + for background." + } + + bool --archive-no-cpu + { + "Assume the package is CPU architecture-independent and omit it from + the binary package directory name and archive file base." + } + + bool --archive-no-os + { + "Assume the package is operating system-independent and omit it from + the binary package directory name and archive file base." + } + + string --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 \cb{+} then the value (with \cb{+} 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." + } + + dir_path --archive-install-root + { + "<d>", + "Alternative installation root directory. The default is \cb{/usr/local/} + on POSIX and \c{\b{C:\\}\i{project}\b{\\}} on Windows, where + \ci{project} is the \l{bpkg#manifest-package-project \cb{project}} + package manifest value." + } + + bool --archive-install-config + { + "Use the installation directory layout (\cb{config.install.*} variables) + as configured instead of overriding them with defaults appropriate for + the target operating system. Note that this includes + \cb{config.install.private} and \cb{config.bin.rpath} if needed for a + private installation. Note also that the \cb{config.install.root} value + is still overridden with the \cb{--archive-install-root} option value + if specified." + } + + std::map<string, string> --archive-split + { + "<key>=<filt>", + "Split the installation into multiple binary packages. Specifically, + for each <key>=<filt> pair, perform the \cb{install} operation with + \c{\b{config.install.filter=}\i{filt}} and package the resulting files + as \ci{package-key-version-build_metadata} omitting the \ci{-key} part + if <key> is empty. Note that wildcard patterns in <filt> must be + quoted. See \l{b#install-filter Installation Filtering} for background." + } + }; + + " + \h|STRUCTURED RESULT| + + Instead of printing to \cb{stderr} the list of generated binary packages in + a format more suitable for human consumption, the \cb{pkg-bindist} command + can be instructed to write it to \cb{stdout} in a machine-readable form by + specifying the \cb{--structured-result} option. Currently, the only + recognized format value for this option is \cb{json} with the output being + a JSON object that is a serialized representation of the following C++ + struct \cb{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 \l{bpkg-common-options(1)} for details on + the overall properties of this format and the semantics of the \cb{struct} + serialization. + + The \cb{file::type} member is a distribution-specific value that classifies + the file. For the \cb{debian} distribution the possible values are + \cb{main.deb}, \cb{dev.deb}, \cb{doc.deb}, \cb{common.deb}, + \cb{dbgsym.deb}, \cb{changes} (\cb{.changes} file), and \cb{buildid} + (\cb{.buildid} file); see \l{bpkg#bindist-mapping-debian-produce Debian + Package Mapping for Production} for background. For the \cb{fedora} + distribution the possible values are \cb{main.rpm}, \cb{devel.rpm}, + \cb{static.rpm}, \cb{doc.rpm}, \cb{common.rpm}, and \cb{debuginfo.rpm}; see + \l{bpkg#bindist-mapping-fedora-produce Fedora Package Mapping for + Production} for background. For the \cb{archive} distribution this is the + archive type (\cb{--archive-type}), for example, \cb{tar.xz} or \cb{zip}, + potentially prefixed with \ci{key} if the \cb{--archive-split} + functionality is used, for example, \cb{dev.tar.xz}. + + The \cb{package::system_version} and/or \cb{file::system_name} members are + absent if not applicable to the distribution. The \cb{file::system_name} + member is also absent if the file is not a binary package (for example, + \cb{.changes} and \cb{.buildid} files in the \cb{debian} distribution). + " + + // NOTE: remember to add the corresponding `--class-doc ...=exclude-base` + // (both in bpkg/ and doc/) if adding a new base class. + // + class pkg_bindist_options: pkg_bindist_common_options, + pkg_bindist_debian_options, + pkg_bindist_fedora_options, + pkg_bindist_archive_options {}; + + " + \h|DEFAULT OPTIONS FILES| + + See \l{bpkg-default-options-files(1)} for an overview of the default + options files. For the \cb{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 \cb{pkg-bindist} command options cannot be specified in the + default options files: + + \ + --directory|-d + \ + " +} |