我想告诉您,即使我没有通过命令行指定,也应始终使用
-j4
选项。通常我会在某个配置文件中进行设置(例如 ~/.makerc
)。
GNU make 是否存在这样的文件?
请仔细阅读关于$(MAKEFLAGS)变量的说明:
export MAKEFLAGS=j4
然而,这可能会干扰递归式-make构建(不过明智的人通常也不使用递归式make!),因为它会干扰GNU make与其子make进行通信的能力。
因此,更明智的方法可能是使用包装脚本、别名或shell函数。
是的,也不完全是 --- 通常你会使用一个包含文件。将你的公共配置项放在一个文件中,比如说common.mk
,然后添加
include common.mk
function mk {
make -j4 $*
}
这个并不存在,但是你可以通过递归调用 make 函数来实现。
例如:
Makefile:
-include $(HOME)/.makerc
.DEFAULT_GOAL: all
# This will handle a default goal if make is just called without any target
all:
$(MAKE) $(MAKE_OPTIONS) -f Makefile.real $(MAKECMDGOALS)
# This handles all targets and passes it through
%:
$(MAKE) $(MAKE_OPTIONS) -f Makefile.real $(MAKECMDGOALS)
$(HOME)/.makerc:
MAKE_OPTIONS := -j4
我喜欢John Marshall提出的MAKEFLAGS
方法,而不是make
支持类似于自动 .makerc 项目配置文件的东西。然而,我不想记得事先源化一个.env或类似的环境变量(并在之后取消设置它们)。
解决这个问题的方法是将MAKEFLAGS
分配放在Makefile
的顶部:
#!/usr/bin/env make
MAKEFLAGS=s
.PHONY: foo
foo:
echo "hello, make"
运行它:
$ make foo
hello, make
与没有 MAKEFLAGS=...
行运行相比:
$ make foo
echo "hello, make"
hello, make
我想对约翰·马歇尔(John Marshall)的答案中所提示的解决方案进行进一步的扩展。
您可以在 $PATH
中更早的位置放置一个一行脚本,内容如下:
#!/bin/bash
$(type -ap make | sed -n 2p) -j4 "$@"
(脚本的名称不一定非得叫做 make
,这会让事情变得更简单,但如果是我,我觉得这样更方便。)
我认为这种方法比其他方法更好,原因如下:
MAKEFLAGS
方法不同,它不会破坏递归构建(在我的经验中,递归构建实际上相当普遍)。include .makerc
方法不同,它可以在不改变任何现有 makefile 或工作流程的情况下局部应用。
mk '*'
。这些中断很重要,因为虽然目标几乎永远不会包含空格、星号、括号或问号,但您传递给 make 的变量(“make CFLAGS ='-g -O2' target”)可能会包含这些字符。 - Fred Nurk