Define custom RPM macros in a spec file

Define custom RPM macros to simplify package maintenance and make it consistent across packages, in addition to using the built-in and distribution RPM macros. RPM spec files can use either the %define and %global macros.

About this task

The differences between the %define and %global macros are the following:

  • %define has global scope, except when used in a parametric macro, where its scope is local to this macro. The body of the %define macro is expanded when used.
  • %global has global scope. The body of the %global macro is expanded at definition time.
Important

Use %global macros for the following actions:

  • To avoid multiple redundant evaluations
  • To define global macros inside parametric macros

Otherwise, use %define macros.

The %define and %global macro use the %global <name><body> or %define <name>[(opts)] <body> pattern:

  • All whitespace, the preceding and succeeding, that surrounds <body> is removed during the macro expansion.
  • The macro name might be composed of alphanumeric characters and the underscore (_) character.
  • Inclusion of the (opts) field is optional:
    • Simple macros do not contain the (opts) field. In this case, only recursive macro expansion is performed.
    • Parametric options are function-like macros that accept arguments and possible options. For more details, see the /usr/share/doc/rpm/macros.md file.
Important

Macros are evaluated and expanded everywhere in the spec file, even on lines commented by using the hash (#) and in spec file sections, such as %changelog.

To escape macro expansion, you can use the %dnl macro which comments out everything up to the next new line.

You can also escape macro expansion by placing a second percent sign (%) in front of the macro, for example %%{name}.

For more information about macros, see the /usr/share/doc/rpm/macros.md file.

Procedure

Define the macro. For example, you can include the following line in the RPM spec file.
%define date 20241114
%define upstream_version 2.5.4-pre1