如何使makefile目标依赖于与目标文件同名的文件';s目录?

如何使makefile目标依赖于与目标文件同名的文件';s目录?,makefile,Makefile,假设您具有以下项目结构: . ├── Makefile └── src └── 1.py . ├── Makefile ├── build │   └── 1 │   └── test.txt └── src └── 1.py 程序1.py在目录build/1中创建多个(0、1或更多)文件。这概括为任意数字,即程序x.py,其中x是一些自然数,将在目录build/x中创建多个文件。该项目可以由许多python(3)文件组成 上述特定场景的生成文件可能如下所示: PYT

假设您具有以下项目结构:

.
├── Makefile
└── src
    └── 1.py
.
├── Makefile
├── build
│   └── 1
│       └── test.txt
└── src
    └── 1.py
程序
1.py
在目录
build/1
中创建多个(0、1或更多)文件。这概括为任意数字,即程序
x.py
,其中
x
是一些自然数,将在目录
build/x
中创建多个文件。该项目可以由许多python(3)文件组成

上述特定场景的生成文件可能如下所示:

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
└── src
    └── 1.py
.
├── Makefile
├── build
│   └── 1
│       └── test.txt
└── src
    └── 1.py

如何通用化规则头
build/1/test.txt:src/1.py
以处理具有任意数量python程序(或等效地,构建子目录)和每个python程序任意数量输出文件的项目?

可以通用现有规则以处理src中的任何python代码。在模式规则中使用“%”,使用“$*引用操作列表中的编号

每当修改python测试时,该规则将重新运行测试。只有当python测试指示完成且没有错误时,它才会记录“success”

更新2019-11-24:将测试概括为处理N个测试,每个测试生成多个文件。重建

注1:Make需要一种方法来知道python测试是否顺利通过。该解决方案假定python代码中的退出代码为非零,或者有另一种方法来判断是否所有测试都已通过

注2:完成文件捕获文件夹中生成的测试文件列表(不包括test.done本身)。如果需要的话,这可以用来验证在一个单独的目标中是否没有删除任何输出文件,以弥补进程生成的显式文件的不足

TASK_LIST=1 2 3 4

all: ${TASK_LIST:%=build/%/task.done}

build/%/task.done: src/%.py
        mkdir -p build/$*
        touch build/$*/test.txt # emulates: python3 src/1.py
        # Run script src/%.py should return non-zero exit on failure.
        ls build/$* | grep -xv "$(@F)" > $@
        touch $@ # Mark "success!"

GNU制作文档:

谢谢,但这并不能解决问题。如果
1.py
同时生成
test1.txt
文件和
test2.txt
文件,会发生什么情况?或者,更一般地说,
n
不同的文件?然后,根据您的解决方案,您还需要
n
distinct make规则。make将无法知道应该创建多少个文件。您可以更改规则以创建一个“已完成”文件,该文件将近似于您想要的行为-如果修改了PY,请重新运行测试。我误解了模板,以为test.txt是一个标志文件,而不是一个测试结果文件。我将发布额外的说明。解决方案修改为更明确地说明test.done作为指标文件的作用,而不是结果集的一部分+关于能够知道所有测试是否通过的假设。感谢您的回答,但您误解了我的问题(或者我无法解释我的问题)。这些文件根本不是测试文件:在我的应用程序中,每个python程序生成多个绘图、矩阵和数字,然后我的LaTeX文档会自动读取这些绘图、矩阵和数字。在陈述我的问题时,我试图概括它,但也许“test.txt”是一个不好的示例名称。我要做的就是制定一条规则来构建所有输出文件。我假设这是可能的,因为每个输出文件的文件夹唯一地确定其python程序。我当然需要在makefile中的某个变量中显式列出每个输出文件,但我希望避免制定多个规则,因为构建过程(只需运行适当的python脚本)是相同的。