summaryrefslogtreecommitdiff
path: root/doc/manual/macros
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/macros')
-rw-r--r--doc/manual/macros258
1 files changed, 258 insertions, 0 deletions
diff --git a/doc/manual/macros b/doc/manual/macros
new file mode 100644
index 0000000..fea9bf3
--- /dev/null
+++ b/doc/manual/macros
@@ -0,0 +1,258 @@
+/*! \page macros Macro syntax
+
+RPM has fully recursive spec file macros. Simple macros do straight text
+substitution. Parameterized macros include an options field, and perform
+argc/argv processing on white space separated tokens to the next newline.
+During macro expansion, both flags and arguments are available as macros
+which are deleted at the end of macro expansion. Macros can be used
+(almost) anywhere in a spec file, and, in particular, in "included file
+lists" (i.e. those read in using %files -f \<file\>). In addition, macros
+can be nested, hiding the previous definition for the duration of the
+expansion of the macro which contains nested macros.
+
+\section macros_defining Defining a Macro
+
+To define a macro use:
+
+\verbatim
+ %define <name>[(opts)] <body>
+\endverbatim
+
+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:
+
+\verbatim
+ %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)
+\endverbatim
+
+At the end of invocation of a parameterized macro, the above macros are
+(at the moment, silently) discarded.
+
+\section macros_writing Writing a Macro
+
+Within the body of a macro, there are several constructs that permit
+testing for the presence of optional parameters. The simplest construct
+is "%{-f}" which expands (literally) to "-f" if -f was mentioned when the
+macro was invoked. There are also provisions for including text if flag
+was present using "%{-f:X}". This macro expands to (the expansion of) X
+if the flag was present. The negative form, "%{!-f:Y}", expanding to (the
+expansion of) Y if -f was *not* present, is also supported.
+
+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.
+
+\section macros_builtin Builtin Macros
+
+There are several builtin macros (with reserved names) that are needed
+to perform useful operations. The current list is
+
+\verbatim
+ %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
+\endverbatim
+
+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.
+
+\section macros_example Example of a Macro
+
+Here is an example %patch definition from /usr/lib/rpm/macros:
+
+\verbatim
+ %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} \
+ ...
+\endverbatim
+
+
+The first line defines %patch with its options. The body of %patch is
+
+\verbatim
+ %{uncompress:%patch_file} | patch %{-p:-p%{-p*}} %patch_suffix %{-R} %{-E}
+\endverbatim
+
+The body contains 7 macros, which expand as follows
+
+\verbatim
+ %{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
+\endverbatim
+
+There are two "private" helper macros:
+
+\verbatim
+ %patch_file the gory details of generating the patch file name
+ %patch_suffix the gory details of overriding the (default) ".orig"
+\endverbatim
+
+\section macros_using Using a Macro
+
+To use a macro, write:
+
+\verbatim
+ %<name> ...
+\endverbatim
+
+or
+
+\verbatim
+ %{<name>}
+\endverbatim
+
+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:
+\verbatim
+ %define mymacro() (echo -n "My arg is %1" ; sleep %1 ; echo done.)
+\endverbatim
+
+Usage:
+
+\verbatim
+ %mymacro 5
+\endverbatim
+
+This expands to:
+
+\verbatim
+ (echo -n "My arg is 5" ; sleep 5 ; echo done.)
+\endverbatim
+
+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.
+
+\section macros_commandline Command Line Options
+
+When the command line option "--define 'macroname value'" allows the
+user to specify the value that a macro should have during the build.
+Note lack of leading % for the macro name. We will try to support
+users who accidentally type the leading % but this should not be
+relied upon.
+
+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
+\verbatim
+ --eval '<macro expression>'
+\endverbatim
+that will read rpm config files and print the macro expansion on stdout.
+
+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.
+
+\section macros_configuration Configuration using Macros
+
+Starting in rpm 3.0, macros rather than rpmrc lines are used to configure rpm.
+In general, all the rpmrc configuration lines documented in "Maximum RPM"
+have been converted to macros, usually with a leading underscore, and the
+same name that was used in rpmrc files. In some cases, there is no leading
+underscore. Those macros existed in rpm-2.5.x and the underscore is omitted
+in order to preserve the meaning and usage of macros that are defined during
+spec file parsing.
+
+Here's an example to illustrate configuration using macros:
+
+\verbatim
+ 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
+\endverbatim
+
+Here are 2 common FAQ for experienced users of rpm:
+
+\verbatim
+ 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
+\endverbatim
+
+\section macros_autoconf Macro Analogues of Autoconf Variables
+
+Several macro definitions provided by the default rpm macro set have uses in
+packaging similar to the autoconf variables that are used in building packages:
+
+\verbatim
+ %_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
+\endverbatim
+
+*/