From 39d8d33db46c585f83246b34b329a7feebebdfca Mon Sep 17 00:00:00 2001 From: desert-sailor Date: Wed, 4 Jun 2025 10:08:25 +0800 Subject: [PATCH] Add macros.build-constraints %%limit_build(m) --- macros.build-constraints | 103 ++++++++++++++++++++++++++++++++++++++ openEuler-rpm-config.spec | 10 ++-- 2 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 macros.build-constraints diff --git a/macros.build-constraints b/macros.build-constraints new file mode 100644 index 0000000..00835da --- /dev/null +++ b/macros.build-constraints @@ -0,0 +1,103 @@ +# Macros to constrain resource use during the build process + +# Changes _smp_build_ncpus depending on various factors +# +# -c cpus constrains the CPU count to "cpus" +# -m mem constrains the CPU count to the total amount of memory in the system +# (in megabytes) divided by "mem", rounded down +# +# If no options are passed, sets _smp_build_ncpus to 1. +# _smp_build_ncpus will never be raised, only lowered. +%constrain_build(c:m:) %{lua: + + -- Check a value and clamp it to at least 1 + local function check_and_clamp(v, string) + if v == nil then return nil end + + i = math.tointeger(v) + if i == nil then + macros.error({"%%%0: invalid "..string.." value "..v}) + return nil + end + + local clamp = math.max(1, math.floor(i)) + if i ~= clamp then + macros.error({"%%%0: invalid "..string.." value "..v}) + return nil + end + return clamp + end + + -- Parse meminfo to find the total amount of memory in the system + local function getmem() + local mem = 0 + for l in io.lines('/proc/meminfo') do + if l:sub(1, 9) == "MemTotal:" then + mem = math.tointeger(string.match(l, "MemTotal:%s+(%d+)")) + break + end + end + return mem + end + + local mem_limit = check_and_clamp(opt.m, "mem limit") + local cpu_limit = check_and_clamp(opt.c, "cpu limit") + local current_cpus = math.tointeger(macros._smp_build_ncpus) + local constrained_cpus = current_cpus + + if (not cpu_limit and not mem_limit) then + cpu_limit = 1 + end + + if cpu_limit ~= nil then + constrained_cpus = math.min(cpu_limit, constrained_cpus) + end + if mem_limit ~= nil then + local mem_total = getmem(verbose) + local limit = math.max(1, mem_total // (mem_limit * 1024)) + constrained_cpus = math.min(constrained_cpus, limit) + end + + macros._smp_build_ncpus = constrained_cpus +} + +# 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 +} diff --git a/openEuler-rpm-config.spec b/openEuler-rpm-config.spec index d32f6c3..3a86d83 100644 --- a/openEuler-rpm-config.spec +++ b/openEuler-rpm-config.spec @@ -3,7 +3,7 @@ Name: %{vendor}-rpm-config Version: 31 -Release: 27 +Release: 28 License: GPL+ AND MIT Summary: specific rpm configuration files URL: https://gitee.com/src-openeuler/openEuler-rpm-config @@ -33,6 +33,7 @@ Source104: macros.kmp Source105: macros.shell-completions Source106: macros.package-notes-srpm Source107: macros.valgrind-srpm +Source108: macros.build-constraints # Dependency generator scripts Source200: find-requires.ksyms @@ -211,9 +212,12 @@ sed -i "s|@OSCPE@|$(cat /etc/system-release-cpe)|" %{buildroot}%{rpmvdir}/%{vend %{rpmvdir}/find-requires.ksyms %changelog +* Wed Jun 04 2025 Dongxing Wang - 31-28 +- Add macros.build-constraints %%limit_build(m) + * Fri May 30 2025 Dongxing Wang - 31-27 -- Fix %python_extras_subpkg with underscores in extras names - Allow commas as argument separator for extras names in %python_extras_subpkg +- Fix %%python_extras_subpkg with underscores in extras names + Allow commas as argument separator for extras names in %%python_extras_subpkg * Fri May 30 2025 Dongxing Wang - 31-26 - Introduce %%python_extras_subpkg -- Gitee