Conditional Builds
Rpmbuild supports conditional package builds with the command line switches
--with
and --without
.
Here is an example of how to enable gnutls and disable openssl support:
$ rpmbuild -ba newpackage.spec --with gnutls --without openssl
Creating build conditionals
Using %bcond
(new in rpm 4.17.1)
To create a build conditional in a spec file, use the %bcond
macro at the
beginning of the file, specifying the name of the conditional and its default
value:
# Create a "gnutls" build conditional, enabled by default:
%bcond gnutls 1
# Create a "bootstrap" build conditional, disabled by default:
%bcond bootstrap 0
The default can be any numeric expression.
To pass a complex expression as a single argument, you can enclose it in
%[...]
.
# Create `--with openssl` and `--without openssl` cli options, with the default
# being the inverse of the gnutls setting:
%bcond openssl %{without gnutls}
# Create `extra_tests` bcond, enabled by default if both of the other
# conditinals # are enabled:
%bcond extra_tests %[%{with gnutls} && %{with sqlite}]
Using %bcond_with
and %bcond_without
Build conditionals can also be created using the macros %bcond_with
and
%bcond_without
. These macros create command line options. When you add
an option to build with feature X, it implies that the default is to build
without.
These macros have historically confused a lot of people (which is why
%bcond
was added) but are not hard to use once you think in terms
of adding command line switches:
# Create an option to build with gnutls (`--with gnutls`), thus default to
# building without it
%bcond_with gnutls
# Create an option to build without openssl (`--without openssl`), thus default
# building with it
%bcond_without openssl
To change the default, change the command line switch from with
to without
or vice versa. The remainder of the spec file can be left unchanged.
Check whether an option is enabled or disabled
To make parts of the spec file conditional depending on the command-line
switch, you can use the %{with foo}
macro or its counterpart,
%{without foo}
:
%if %{with gnutls}
BuildRequires: gnutls-devel
%endif
%if %{with openssl}
BuildRequires: openssl-devel
%endif
Alternatively, you can test the presence (or lack thereof) of %with_foo
macros which is nicer in other situations, e.g.:
%configure \
%{?with_static:--enable-static} \
%{!?with_static:--disable-static}
Always test for the with
-condition, not the without
-counterpart!