diff --git a/epel-rpm-macros.spec b/epel-rpm-macros.spec index 80c6781..f7cb5b3 100644 --- a/epel-rpm-macros.spec +++ b/epel-rpm-macros.spec @@ -1,6 +1,6 @@ Name: epel-rpm-macros Version: 8 -Release: 23 +Release: 24 Summary: Extra Packages for Enterprise Linux RPM macros Group: System Environment/Base @@ -72,6 +72,12 @@ install -Dpm 644 %{SOURCE150} \ %changelog +* Wed Sep 1 2021 Michel Alexandre Salim - 8-24 +- Fix macros.build-constraints' %%limit_build + - number of CPUs will never be set to less than 1 + - this now outputs build flag overrides to be used with %%make_build etc. + - add documentation + * Mon Aug 2 2021 Michel Alexandre Salim - 8-23 - Add macros.build-constraints - Refactor to use standard macros, not hard-coded paths diff --git a/macros.build-constraints b/macros.build-constraints index 1343cd8..db99418 100644 --- a/macros.build-constraints +++ b/macros.build-constraints @@ -1,10 +1,42 @@ # Macros to constrain resource use during the build process -# m: memory limit in MBs per core; default is 1024 -%limit_build(m:) \ - _mem_per_process="%{-m:%{-m*}}%{!-m:1024}" \ - _max_mem=$(awk '/MemTotal/ { print $2 }' /proc/meminfo) \ - _max_jobs="$(($_max_mem / ($_mem_per_process * 1024)))" \ - _cur_max_jobs="%{_smp_build_ncpus}" \ - test "${_cur_max_jobs}" -gt "${_max_jobs}" && _cur_max_jobs="${_max_jobs}" && echo "Warning: Reducing build parallelism to -j${_max_jobs} because of memory limits" \ - %global _smp_build_ncpus "${_cur_max_jobs}" +# outputs build flag overrides to be used in conjunction with +# %%make_build, %%cmake_build etc. +# +# if no override is needed, this macro outputs nothing +# +# - m memory limit in MBs per core; default is 1024 +# +# Usage: +# e.g. %make_build %{limit_build -m 2048} +# => /usr/bin/make -O -j16 V=1 VERBOSE=1 +# %make_build %{limit_build -m 40960} +# => /usr/bin/make -O -j16 V=1 VERBOSE=1 -j1 +# +%limit_build(m:) %{lua: + local mem_per_process=rpm.expand("%{-m*}") + if mem_per_process == "" then + mem_per_process = 1024 + else + mem_per_process = tonumber(mem_per_process) + end + local mem_total = 0 + for line in io.lines('/proc/meminfo') do + if line:sub(1, 9) == "MemTotal:" then + local tokens = {} + for token in line:gmatch("%w+") do + tokens[#tokens + 1] = token + end + mem_total = tonumber(tokens[2]) + break + end + end + local max_jobs = mem_total // (mem_per_process * 1024) + if max_jobs < 1 then + max_jobs = 1 + end + cur_max_jobs=tonumber(rpm.expand("%{_smp_build_ncpus}")) + if cur_max_jobs > max_jobs then + print("-j" .. max_jobs) + end +}