%define <name>[(opts)] <body>
All whitespace surrounding <body> is removed. Name may be composed of alphanumeric characters, and the character `_' and must be at least 3 characters in length. A macro without an (opts) field is "simple" in that only recursive macro expansion is performed. A parameterized macro contains an (opts) field. The opts (i.e. string between parentheses) is passed exactly as is to getopt(3) for argc/argv processing at the beginning of a macro invocation. While a parameterized macro is being expanded, the following shell-like macros are available:
%0 the name of the macro being invoked
%* all arguments (unlike shell, not including any processed flags)
%# the number of arguments
%{-f} if present at invocation, the flag f itself
%{-f*} if present at invocation, the argument to flag f
%1, %2 the arguments themselves (after getopt(3) processing)
At the end of invocation of a parameterized macro, the above macros are (at the moment, silently) discarded.
In addition to the "%{...}" form, shell expansion can be performed using "%(shell command)". The expansion of "%(...)" is the output of (the expansion of) ... fed to /bin/sh. For example, "%(date +%y%m%d)" expands to the string "YYMMDD" (final newline is deleted). Note the 2nd % needed to escape the arguments to /bin/date. There is currently an 8K limit on the size that this macro can expand to.
%trace toggle print of debugging information before/after
expansion
%dump print the active (i.e. non-covered) macro table
%{echo:...} print ... to stderr
%{warn:...} print ... to stderr
%{error:...} print ... to stderr and return BADSPEC
%define ... define a macro
%undefine ... undefine a macro
%global ... define a macro whose body is available in global context
%{uncompress:...} expand ... to <file> and test to see if <file> is
compressed. The expansion is
cat <file> # if not compressed
gzip -dc <file> # if gzip'ed
bzip2 -dc <file> # if bzip'ed
%{expand:...} like eval, expand ... to <body> and (re-)expand <body>
%{S:...} expand ... to <source> file name
%{P:...} expand ... to <patch> file name
%{F:...} expand ... to <file> file name
Macros may also be automatically included from /usr/lib/rpm/macros. In addition, rpm itself defines numerous macros. To display the current set, add "%dump" to the beginning of any spec file, process with rpm, and examine the output from stderr.
%patch(b:p:P:REz:) \
%define patch_file %{P:%{-P:%{-P*}}%{!-P:%%PATCH0}} \
%define patch_suffix %{!-z:%{-b:--suffix %{-b*}}}%{!-b:%{-z:--suffix %{-z*}}}%{!-z:%{!-b: }}%{-z:%{-b:%{error:Can't specify both -z(%{-z*}) and -b(%{-b*})}}} \
%{uncompress:%patch_file} | patch %{-p:-p%{-p*}} %patch_suffix %{-R} %{-E} \
...
The first line defines patch with its options. The body of patch is
%{uncompress:%patch_file} | patch %{-p:-p%{-p*}} %patch_suffix %{-R} %{-E}
The body contains 7 macros, which expand as follows
%{uncompress:...} copy uncompressed patch to stdout
%patch_file ... the name of the patch file
%{-p:...} if "-p N" was present, (re-)generate "-pN" flag
-p%{-p*} ... note patch-2.1 insists on contiguous "-pN"
%patch_suffix override (default) ".orig" suffix if desired
%{-R} supply -R (reversed) flag if desired
%{-E} supply -E (delete empty?) flag if desired
There are two "private" helper macros:
%patch_file the gory details of generating the patch file name %patch_suffix the gory details of overriding the (default) ".orig"
%<name> ...
or
%{<name>}
The %{...} form allows you to place the expansion adjacent to other text. The %<name> form, if a parameterized macro, will do argc/argv processing of the rest of the line as described above. Normally you will likely want to invoke a parameterized macro by using the %<name> form so that parameters are expanded properly.
Example:
%define mymacro() (echo -n "My arg is %1" ; sleep %1 ; echo done.)
Usage:
%mymacro 5
This expands to:
(echo -n "My arg is 5" ; sleep 5 ; echo done.)
This will cause all occurrences of 1 in the macro definition to be replaced by the first argument to the macro, but only if the macro is invoked as "%mymacro 5". Invoking as "%{mymacro} 5" will not work as desired in this case.
Evaluating a macro can be difficult outside of an rpm execution context. If you wish to see the expanded value of a macro, you may use the option
--eval '<macro expression>'
Note: This works only macros defined in rpm configuration files, not for macros defined in specfiles. You can use %{echo: %{your_macro_here}} if you wish to see the expansion of a macro defined in a spec file.
Here's an example to illustrate configuration using macros:
Old way: In /etc/rpmrc and/or ~/.rpmrc you put something: some_value New way: In /etc/rpm/macros and/or ~/.rpmmacros %_something some_value
Here are 2 common FAQ for experienced users of rpm:
1) --rcfile works differently.
Old way: rpm --rcfile whatever
New way: rpm --rcfile /usr/lib/rpm/rpmrc:whatever
2) topdir (and other rpmrc configurables) work differently.
Old way:
~/.rpmrc contains
topdir: whatever
New way:
/usr/lib/rpm/rpmrc contains
macrofiles: /usr/lib/rpm/macros: ... :~/.rpmmacros
~/.rpmmacros contains
%_topdir whatever
%_prefix /usr
%_exec_prefix %{_prefix}
%_bindir %{_exec_prefix}/bin
%_sbindir %{_exec_prefix}/sbin
%_libexecdir %{_exec_prefix}/libexec
%_datadir %{_prefix}/share
%_sysconfdir %{_prefix}/etc
%_sharedstatedir %{_prefix}/com
%_localstatedir %{_prefix}/var
%_libdir %{_exec_prefix}/lib
%_includedir %{_prefix}/include
%_oldincludedir /usr/include
%_infodir %{_prefix}/info
%_mandir %{_prefix}/man
1.5.7.1