GNU Make有配置文件吗?

12
我想告诉您,即使我没有通过命令行指定,也应始终使用 -j4 选项。通常我会在某个配置文件中进行设置(例如 ~/.makerc)。

GNU make 是否存在这样的文件?

5个回答

10

请仔细阅读关于$(MAKEFLAGS)变量的说明:

export MAKEFLAGS=j4

然而,这可能会干扰递归式-make构建(不过明智的人通常也不使用递归式make!),因为它会干扰GNU make与其子make进行通信的能力。

因此,更明智的方法可能是使用包装脚本、别名或shell函数。


4

是的,也不完全是 --- 通常你会使用一个包含文件。将你的公共配置项放在一个文件中,比如说common.mk,然后添加

include common.mk

在您的Makefile顶部添加该标志。如果该标志没有相应的方式可以从Makefile内部进行配置,则可以使用一个函数。
function mk {
    make -j4 $*
}

就这一点而言,别名make="make -j4"。但是别名相对不够灵活,而shell函数则非常简单直接,所以我几乎总是使用函数。 - Charlie Martin
3
它们到底有多简单?您甚至在此处犯了一个错误:如果您的参数中包含空格,则$*会出错;请改用"$@"。 - Fred Nurk
1
未加引号的 $* 会以另一种方式中断:它会进行路径名扩展;例如 mk '*'。这些中断很重要,因为虽然目标几乎永远不会包含空格、星号、括号或问号,但您传递给 make 的变量(“make CFLAGS ='-g -O2' target”)可能会包含这些字符。 - Fred Nurk

0

这个并不存在,但是你可以通过递归调用 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


0

我喜欢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

0

我想对约翰·马歇尔(John Marshall)的答案中所提示的解决方案进行进一步的扩展。

您可以在 $PATH 中更早的位置放置一个一行脚本,内容如下:

#!/bin/bash
$(type -ap make | sed -n 2p) -j4 "$@"

(脚本的名称不一定非得叫做 make,这会让事情变得更简单,但如果是我,我觉得这样更方便。)

我认为这种方法比其他方法更好,原因如下:

  • MAKEFLAGS 方法不同,它不会破坏递归构建(在我的经验中,递归构建实际上相当普遍)。
  • include .makerc 方法不同,它可以在不改变任何现有 makefile 或工作流程的情况下局部应用。
  • 与 shell 别名或函数方法不同,它是与 shell 无关的(不限制您使用特定的 shell),并且在任何您可能必须使用的其他构建脚本中也能正常工作,只要您在同一环境中启动它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接