假设您具有以下项目结构:
.
├── Makefile
└── src
└── 1.py
程序1.py
在目录build/1
中创建多个(0、1或更多)文件。这可以归纳为任意数字,即程序x.py
(其中x
是自然数)会在目录build/x
中创建多个文件。该项目可以包含许多python(3)文件。
上面特定情况的makefile可能看起来像这样:
PYTHON_FILES := $(shell find src -name '*.py')
TXT_FILES := build/1/test.txt
.PHONY: clean all
all: $(TXT_FILES)
build/1/test.txt: src/1.py
mkdir -p build/1
touch build/1/test.txt # emulates: python3 src/1.py
echo "success!"
clean:
rm -rf build
使用上述项目结构和makefile运行make
将导致以下项目结构:
.
├── Makefile
├── build
│ └── 1
│ └── test.txt
└── src
└── 1.py
我如何概括规则头build/1/test.txt: src/1.py
以处理具有任意数量的python程序(或等效地,建立子目录)和每个python程序的任意数量的输出文件的项目?
您可以将现有规则推广到src中的任何python代码上。使用模式规则中的'%',使用'$ *引用操作列表中的数字。
只要修改python测试,该规则就会重新运行测试。仅当python测试指示完成而没有错误时,它才会记录“成功”。
更新2019-11-24:通用测试可以处理N个测试,每个测试都会生成多个文件。随着重建。
注1:需要一种方法来知道python测试是否通过而没有任何失败。该解决方案假定python代码的退出代码为非零,或者存在另一种方法来判断所有测试是否通过。
注2:完成的文件捕获在文件夹中生成的测试文件的列表(不包括test.done本身)。这可以用来验证是否在一个单独的目标中除去了没有输出文件的情况,以弥补缺少该进程生成的显式文件的问题]
TEST_LIST=1 2 3 4
all: ${L:%=build/%/test.done}
#all: build/1/test.done build/2/test.done
build/%/test.done: src/%.py
mkdir -p build/$*
touch build/$*/test.txt # emulates: python3 src/1.py
# test script src/%.py should return non-zero exit on failure.
ls build/$* | grep -xv "$(@F)" > $@
touch $@ # Mark "success!"
GNU Make文档:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html