【问题标题】:How do you make a makefile target depend on a file with the same name as the target file's directory?如何使 makefile 目标依赖于与目标文件目录同名的文件?
【发布时间】:2019-11-23 19:49:58
【问题描述】:

假设您有以下项目结构:

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

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

【问题讨论】:

    标签: makefile


    【解决方案1】:

    您可以将现有规则概括为适用于 src 中的任何 python 代码。在模式规则中使用“%”,在操作列表中使用“$*”来引用数字。

    只要修改了 python 测试,该规则就会重新运行测试。只有当python测试表明完成且没有错误时,它才会记录“成功”。

    2019 年 11 月 24 日更新:将测试推广到处理 N 个测试,每个测试生成多个文件。重建。

    注意 1:需要一种方法来了解 python 测试是否通过而没有任何失败。该解决方案假定 python 代码中的退出代码为非零,或者有另一种方法来判断是否所有测试都已通过。

    注意 2:done 文件捕获文件夹中生成的测试文件列表(不包括 test.done 本身)。这可用于验证在单独的目标中是否删除了 NO 输出文件,以补偿进程生成的显式文件的缺失

    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 Make 文档:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

    【讨论】:

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