3.4. Defining custom RPM macros in a spec file
In addition to using the built-in and distribution RPM macros, you can define custom RPM macros to simplify package maintenance and make it consistent across packages. RPM spec files can use either the %define and %global macros.
The differences between the %define and %global macros are the following:
-
%definehas global scope, except when used in a parametric macro, where its scope is local to this macro. The body of the%definemacro is expanded when used. -
%globalhas global scope. The body of the%globalmacro is expanded at definition time.
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.mdfile.
-
Simple macros do not contain the
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
specfile.%define date 20241114 %define upstream_version 2.5.4-pre1