gentoo - отключить параллельную сборку для llvm
У меня установлен Gentoo на компьютере с относительно небольшим объемом оперативной памяти (1 ГБ). Когда я устанавливаю llvm
(emerge -a llvm
), компьютер всегда выходит из памяти. Все 4 cc1plus
Процессы используют около 25 % оперативной памяти, когда система не работает. Я думаю, что использование только одного процесса за раз может помочь.
Как я могу бежать llvm
построить (использует cmake
а также ninja
) только с одним процессом компилятора?
Обновить
У меня была опечатка в make.conf
:
#MAKEFAGS="-j3"
MAKEFAGS="-j1"
Я пробовал много других вариантов, но напишу через несколько дней. (Поскольку компиляция занимает несколько часов, и если нет доступной оперативной памяти, я должен перезагрузить ее, отключив питание, даже если я использую swap.)
1 ответ
Даже если ninja
не make
, его ebuild должен признавать и уважать любого -j
параметр, указанный в MAKEOPTS
переменная окружения. Это означает, что вы должны быть в состоянии форсировать максимум одну работу через MAKEOPTS=-j1
, Вы можете сделать это на разовой основе:
MAKEOPTS=-j1 emerge -a llvm
Вы также можете установить это изменение глобально / постоянно для всех пакетов в вашей системе, отредактировав MAKEOPTS=
линия в /etc/portage/make.conf
,
Однако, если вы установите MAKEOPTS=-j1
через вашу оболочку или make.conf
параметры распараллеливания будут применены ко всем пакетам, которые emerge
устанавливает. Если вы хотите применить его только к одному пакету, вы можете создать файл с именем /etc/portage/env/sys-devel/llvm
(при необходимости создайте недостающие каталоги) и поместите в них следующее содержимое:
MAKEOPTS=-j1
Это будет применять переменную только к самому пакету llvm.
Как это сделать в оболочке:
mkdir -p /etc/portage/env/sys-devel
echo MAKEOPTS=-j1>>/etc/portage/env/sys-devel/llvm
Ниндзя и MAKEOPTS
В Gentoo, потому что люди полагаются на MAKEOPTS=-j«n»
чтобы контролировать количество заданий, различные eclasses и ebuild-ы отобразят эту переменную -j
параметр, эквивалентный используемой системе сборок. Вы можете увидеть это в eclass/ninja-utils.eclass
(который используется cmake-utils.eclass
который используется llvm
). Этот фрагмент извлекает только -j
параметр и передает его ninja
так как ninja
поддерживает этот параметр, в то время как он может не поддерживать другие вещи, которые люди помещают в MAKEOPTS
,
Отказ от ответственности: я на самом деле не проверял это с последними llvm
Ебилд. Пожалуйста, прокомментируйте, если есть проблемы с этим ответом!