Memoizing macro values
Panu Matilainen
pmatilai at redhat.com
Mon Jan 2 11:23:26 UTC 2023
On 1/2/23 12:05, Miro Hrončok wrote:
> On 02. 01. 23 10:13, Panu Matilainen wrote:
>> On 12/21/22 12:17, Florian Weimer wrote:
>>> In Fedora, we have this:
>>>
>>> /usr/lib/rpm/macros.d/macros.python:%python_sitelib %(RPM_BUILD_ROOT=
>>> %{__python} -Esc "import sysconfig;
>>> print(sysconfig.get_path('purelib', vars={'platbase': '%{_prefix}',
>>> 'base': '%{_prefix}'}))")
>>> /usr/lib/rpm/macros.d/macros.python3:%python3_sitelib
>>> %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig;
>>> print(sysconfig.get_path('purelib', vars={'platbase': '%{_prefix}',
>>> 'base': '%{_prefix}'}))")
>>>
>>> This is a %define-style macro, so the macro gets re-evaluated for every
>>> expansion. It can make spec file operations really, really slow.
>>>
>>> It's possible to work around this in spec files like this:
>>>
>>> %{?python3_sitearch: %global python3_sitearch %{python3_sitearch}}
>>>
>>> But this is quite ugly, and I wonder if there is a nice way to do it
>>> directly in the macros file instead. I think I know how do it with Lua,
>>> but maybe there is a better way?
>>
>> %python3_sitearch %{global python3_sitearch %(RPM_BUILD_ROOT=
>> %{__python3} -Esc "import sysconfig;
>> print(sysconfig.get_path('platlib', vars={'platbase': '%{_prefix}',
>> 'base': '%{_prefix}'}))")}%{python3_sitearch}
>>
>> Ie just push the evaluated macro on top of the original one as a
>> global on first use, re-evaluation can be forced with %undefine and no
>> helper macros needed.
>
> How does this work when Python is installed mid-build somehow? Do we
> need to care about that or can we absolutely assume that when packages
> are installed, the RPM build process is restarted?
I hope nobody is expecting to install anything during rpmbuild
execution. rpmbuild doesn't take such a thing into account at all and
the results (not just wrt macros) would be totally random: some things
would inevitably affect the output, others would not.
If you mean by something like mock which consists of multiple
independent rpmbuild runs where build-deps are installed in between, I
don't see how that would be a problem because the macros are not persistent.
- Panu -
- Panu -
More information about the Rpm-list
mailing list