Makefile 如何简化此生成文件以减少重复性?

Makefile 如何简化此生成文件以减少重复性?,makefile,Makefile,Make是一种技术,无论我是否理解它,我都会在其中来回穿梭 这当然是一个例子,我知道我一定是做错了什么,因为Make是为了减少这些任务的重复性而开发的 all: 24.1 24.2 24.3 24.1: evm install emacs-24.1-bin || true emacs --version emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit 24.2:

Make是一种技术,无论我是否理解它,我都会在其中来回穿梭

这当然是一个例子,我知道我一定是做错了什么,因为Make是为了减少这些任务的重复性而开发的

all: 24.1 24.2 24.3

24.1:
    evm install emacs-24.1-bin || true
    emacs --version
    emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit
24.2:
    evm install emacs-24.2-bin || true
    emacs --version
    emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit
24.3:
    evm install emacs-24.3-bin || true
    emacs --version
    emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit
如何编辑此Makefile,使其仅显示一次测试序列,但能够针对多个版本进行测试?

如何:

all: 24.1 24.2 24.3

%:
        evm install emacs-$@-bin || true
        emacs --version
        emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit

我必须承认,求助于“最后手段”的策略总是让我感到不安:这感觉好像违背了工具的本质。另一方面,BSD make允许显式循环构造,因此消除重复规则非常简单:

VERSIONS = 24.1 24.2 24.3
all: ${VERSIONS}

.for VERSION in ${VERSIONS}
${VERSION}:
    evm install emacs-${VERSION}-bin || true
    emacs --version
    emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit
.endfor
我很清楚,这个解决方案几乎肯定不会对你有任何帮助;切换make实现几乎肯定是不可能的。尽管BSD make的代表性严重不足,所以我认为其他人有一个替代方法来记录可能是有用的

正如MadScientist正确指出的那样,GNUMake不支持任何像
.for
这样的“点构造”,这是BSDMake所特有的。然而,这个问题提出了一些可能适用于GNU make的其他循环技术:尝试以下方法:

VERSIONS = 24.1 24.2 24.3

all :: $(VERSIONS)

$(VERSIONS) ::
    evm install emacs-$@-bin || true
    emacs --version
    emacs --batch -L . -l ert -l test/tests.el -f ert-run-tests-batch-and-exit

::
是一种特殊的规则,它将目标视为虚假的(并且还有其他属性)。

太棒了!手册页,适用于漫游者:。谢谢:)很抱歉去掉勾号,但它有一个更精确的定义。不过,这在这段时间内仍然有效!:)哦,这很好:)GNUMake可能支持这一点(Emacs突出显示了结构,但这并不意味着什么),但它抛出
Makefile:23:**缺少分隔符。停止。
位于
。for
行。GNU make显然不支持此语法。事实上,GNU make中没有一个BSD“dot命令”(如
。for
)可用。是的,我在GNU make上也得到了缺少分隔符的错误。这似乎是最干净的解决方案,并且允许我在make文件中有其他目标,仅为
版本
指定此配方。回答很好:)你有没有一个手册页面的链接来描述
?这里有一个GNU Make手册中的链接:-但它不是GNU特有的,它是“传统”语法。我不确定
代表虚假目标是什么意思,但我读不懂那句话,它是正确的:-)。双冒号规则不会创建虚假的目标,尽管双冒号规则通常也声明为虚假(单独)。