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 Ебилд. Пожалуйста, прокомментируйте, если есть проблемы с этим ответом!

Другие вопросы по тегам