我如何简化此Makefile使其减少重复性?

问题描述 投票:2回答:3

制造是我了解与否之间往返的技术之一。

这肯定是一个例子,我知道我一定做错了,因为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以仅安排一次测试序列,但能够针对多个版本进行测试?

makefile
3个回答
5
投票

尝试一下:

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

::是一种特殊的规则,它将目标设置为虚假(也具有其他属性)。


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
投票

[我必须承认,转向“不得已而为之”的策略总是让我感到不安:感觉好像与工具的本质背道而驰。另一方面,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正确指出的那样,GNU make不支持BSD make特有的.for之类的“点构造”。但是,此问题提出了一些其他可能适用于GNU make的循环技术:How to write loop in a Makefile?

© www.soinside.com 2019 - 2024. All rights reserved.