Before I start, I’ll admit that I’m not a real RPM packager. Maype I’m approaching this from completely the wrong direction, what do I know?
I’m in the process of packaging Varnish 3.0.2 which includes mangling the spec file. The top of the spec file reads:
%define v_rc
%define vd_rc %{?v_rc:-%{?v_rc}}
Apparently, this is not legal, since we’re trying to define v_rc as a macro with no body. It’s however not possible to directly define it as an empty string which can later be tested on, you have to do something like:
%define v_rc %{nil}
%define vd_rc %{?v_rc:-%{?v_rc}}
Now, this doesn’t work correctly either. %{?macro}
tests if macro
is defined, not whether it’s an empty string so instead of two lines,
we have to write:
%define v_rc %{nil}
%if 0%{?v_rc} != 0
%define vd_rc %{?v_rc:-%{?v_rc}}
%endif
The 0{?v_rc} != 0
workaround is there so that we don’t accidentially
end up with == 0
which would be a syntax error.
I think having four lines like that is pretty ugly, so I looked for a
workaround and figured that, ok, I’ll just rewrite every use of
%{vd_rc}
to %{?v_rc:-%{?v_rc}}
. There are only a couple, so the
damage is limited. Also, I’d then just comment out the v_rc
definition, since that makes it clear what you should uncomment to
have a release candidate version.
In my naivety, I tried:
# %define v_rc ""
#
is used as a comment character in spec files, but apparently not
for defines. The define was still processed and the build process
stopped pretty quickly.
Luckily, doing # % define ""
seems to work fine and is not
processed. I have no idea how people put up with this or if I’m doing
something very wrong. Feel free to point me at a better way of doing
this, of course.