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