如何简化此Makefile以减少重复次数?

时间:2014-11-08 21:00:01

标签: 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:
    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以仅布置测试序列一次但能够针对多个版本进行测试?

3 个答案:

答案 0 :(得分:4)

试试这个:

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

::代表虚假目标(以及将目标放在多个规则中的可能性,这里你不需要)。

答案 1 :(得分:2)

怎么样:

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

答案 2 :(得分:2)

我不得不承认,转向“最后的手段”策略总是让我感到不安:感觉好像违背了工具的细节。另一方面,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

我很清楚这个解决方案几乎肯定不会对你有所帮助;切换使实现几乎肯定是不可能的。但是BSD make的代表性很差,所以我认为其他人可能会记录一种替代方法。

正如MadScientist正确指出的那样,GNU make不支持像.for那样的任何“点构造”,它们对BSD make都是特殊的。但是,这个问题提出了一些可能适用于GNU make的其他循环技术: How to write loop in a Makefile?