RPM now has a supported mechanism to pass information from the rpm command line to enable/disable features during a build. Two options have been added to pass feature names from the rpm command line:
The new options are implemented using popt to add aliases to the existing rpm options --define to specify macros from the command line. The magic necessary to add the new options is (from the file /usr/lib/rpm/rpmpopt*)--with <feature> Enable <feature> --without <feature> Disable <feature>
(Note: The obscure "!#:+" popt token above says "substitute the next command line argument found here, and, additionally, mark the argument as used.")rpmb alias --with --define "_with_!#:+ --with-!#:+" rpmb alias --without --define "_without_!#:+ --without-!#:+"
For example, when rpm is invoked as
then the popt aliases will cause the options to be rewritten asrpm ... --with ldap ...
which causes a "%_with_ldap" macro to be defined with value "--with-ldap" during a build.rpm ... --define "_with_ldap --with-ldap" ...
The macro defined on the rpm command line can be used to conditionalize portions of the spec file for the package. For example, let's say you are trying to build the pine package using "--with ldap" to enable the LDAP support in the pine mailer (i.e. configuring with "--with-ldap"). So the spec file should be written
so that, if "--with ldap" was used as a build option, then confgure will be invoked (after macro expansion) as... ./configure \ %{?_with_ldap: %{_with_ldap}} \ ...
(Note: The obscure "%{?_with_ldap: ...}" rpm macro syntax above says "if the macro "_with_ldap" exists, then expand "...", else ignore.")./configure --with-ldap ...
The spec file should include a default value for the "_with_ldap" macro, and should support "--without ldap" as well. Here's a more complete example for pine:
# Default values are --without-ldap --with-ssl. # # Read: If neither macro exists, then add the default definition. %{!?_with_ldap: %{!?_without_ldap: %define _without_ldap --without-ldap}} %{!?_with_ssl: %{!?_without_ssl: %define _with_ssl --with-ssl}} ... # Add build dependencies for ssl and ldap features if enabled. # # Read: If feature is enabled, then add the build dependency. %{?_with_ssl: BuildRequires: openssl-devel}} %{?_with_ldap: BuildRequires: openldap-devel}} ... # Configure with desired features. # # Read: Add any defined feature values to the configure invocation. %configure \ %{?_with_ssl: %{_with_ssl}} \ %{?_without_ssl: %{_without_ssl}} \ %{?_with_ldap: %{_with_ldap}} \ %{?_without_ldap: %{_without_ldap}}\ ...