我在内存相对较少(1 GB)的计算机上安装了 Gentoo。当我安装llvm
(emerge -a llvm
)时,计算机总是内存不足。cc1plus
当系统无法使用时,所有 4 个进程都使用了大约 25 % 的内存。我认为一次只使用一个进程可能会有所帮助。
如何仅使用一个编译器进程运行llvm
构建(使用cmake
和)?ninja
更新
我必须在以下位置做出改变make.conf
:
#MAKEFLAGS="-j3"
MAKEFLAGS="-j1"
我尝试了很多其他的变体,但我将在几天内写出来。(因为编译需要几个小时,如果没有可用的 RAM,即使我使用交换,我也必须通过断开电源重新启动它。)
答案1
即使ninja
不是make
,其 ebuild 也应该识别并尊重环境变量-j
中指定的任何参数MAKEOPTS
。这意味着您应该能够通过 强制最多执行一项作业MAKEOPTS=-j1
。您可以一次性执行此操作:
MAKEOPTS=-j1 emerge -a llvm
MAKEOPTS=
您还可以通过编辑中的行,为系统上的所有软件包全局/永久地设置此更改/etc/portage/make.conf
。
但是,如果您MAKEOPTS=-j1
通过 shell 或进行设置make.conf
,则并行化设置将应用于所有emerge
安装的包。如果您只想将其应用于一个包,您可以创建名为的文件/etc/portage/env/sys-devel/llvm
(如果需要,创建任何缺少的目录)并将以下内容放入其中:
MAKEOPTS=-j1
这将仅将变量应用于 llvm 包本身。
如何在 shell 中执行此操作:
mkdir -p /etc/portage/env/sys-devel
echo MAKEOPTS=-j1>>/etc/portage/env/sys-devel/llvm
忍者和MAKEOPTS
在 Gentoo 中,由于人们依赖于MAKEOPTS=-j«n»
控制作业数量,因此各种 eclasses 和 ebuilds 会将此变量的-j
参数映射到实际使用的构建系统的等效参数。您可以在eclass/ninja-utils.eclass
(由 所用 ,cmake-utils.eclass
由 所用llvm
)。该代码片段仅提取-j
参数并将其传递给ninja
因为ninja
支持该参数,但它可能不支持人们放入 中的其他内容MAKEOPTS
。
免责声明:我还没有用最新的llvm
ebuild 测试过。如果这个答案有问题,请评论!