Kar*_*ine 59 parallel-processing makefile build-script
我在一台拥有大量核心的机器上有一个Makefile,但是-jX在编译我的项目时我似乎总是忘记编写它需要的时间比它应该的长.
有没有什么方法可以-j通过环境变量或其他一些持久性配置文件设置标志,以便make在这台机器上自动并行执行多个作业?
Sam*_*ler 39
我假设你正在使用Linux.这是来自我的~/.bashrc
# parallel make
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
alias pmake='time nice make -j$NUMCPUS --load-average=$NUMCPUS'
Run Code Online (Sandbox Code Playgroud)
样品用法
samm@host src> echo $NUMCPUS
8
samm@host src> pmake
Run Code Online (Sandbox Code Playgroud)
成为time nice make -j8 --load-average=8.
为了回答你关于这个问题的具体问题Makefile,我觉得在我的Makefiles中散布这个逻辑是不切实际的.把它放到顶级Makefile也不是一个很好的解决方案,因为我经常从子目录构建并希望并行构建它们.但是,如果您有一个相当平坦的源层次结构,它可能适合您.
Jer*_*ock 34
MAKEFLAGS环境变量似乎可以传递属于每次make运行的标志(至少对于GNU make).我自己并没有太多运气,但可能会使用-l而不是-j自动运行适合您可用核心数量的多个作业.
jco*_*and 28
正如Jeremiah Willcock所说,使用MAKEFLAGS,但这里是如何做到的:
export MAKEFLAGS="-j $(grep -c ^processor /proc/cpuinfo)"
Run Code Online (Sandbox Code Playgroud)
或者您可以像这样设置一个固定值:
export MAKEFLAGS="-j 8"
Run Code Online (Sandbox Code Playgroud)
如果你真的想要提高性能,你应该ccache通过添加如下内容来使用Makefile:
CCACHE_EXISTS := $(shell ccache -V)
ifdef CCACHE_EXISTS
CC := ccache $(CC)
CXX := ccache $(CXX)
endif
Run Code Online (Sandbox Code Playgroud)
您可以在Makefile中添加一行,类似于以下内容:
NUMJOBS=${NUMJOBS:-" -j4 "}
Run Code Online (Sandbox Code Playgroud)
然后${NUMJOBS}在规则中添加一行,或将其添加到另一个Makefilevar(如MAKEFLAGS)中.这将使用NUMJOBS envvar(如果存在); 如果没有,自动使用-j4.您可以根据自己的喜好调整或重命名.
(注:就个人而言,我更喜欢默认的是-j1或"",尤其是如果它要分发给其他人,因为虽然我有多个内核还,我编译在许多不同的平台,并经常忘记DIS -able的-jX设置. )
别名不会在脚本内扩展.最好创建一个单独的make脚本并将其放入其中一个$PATH目录中:
#!/bin/sh
if [ -f /proc/cpuinfo ]; then
CPUS=`grep processor /proc/cpuinfo | wc -l`
else
CPUS=1
fi
/usr/bin/make -j`expr $CPUS + 1` "$@"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36642 次 |
| 最近记录: |