9131051920
Adds a simple macro which limits the CPU count which is used in the various build-related macro. Using this macro at the beginning of the specfile to limit the CPU count directly, or to set the CPU count based on the amount of memory in the system and a "job size". The default action if no options are provided is to limit builds to a single CPU.
85 lines
2.4 KiB
Plaintext
85 lines
2.4 KiB
Plaintext
# 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:
|
|
local mem_limit = math.tointeger(opt.m)
|
|
local cpu_limit = math.tointeger(opt.c)
|
|
local current_cpus = math.tointeger(macros._smp_build_ncpus)
|
|
local constrained_cpus = current_cpus
|
|
|
|
-- 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
|
|
|
|
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
|
|
}
|