Makefile:如何使用随机生成文件或保持文件不变的命令

Makefile: how to use a command which randomly generates a file or leaves it unchanged

我有一个命令,有时会更新目标文件,有时会保持不变,但我不知道会发生哪一个。我想创建一个依赖项,它应该 运行 只有当第一个文件被更新时。我不能这样做。这是一个重现此问题的简单 Makefile:

all: file2.txt

file1.txt:
    @if [ ! -f file1.txt -o $(shell bash -c "expr $$RANDOM \% 2") = 1 ]; \
    then \
        echo "update" >> file1.txt; \
        echo "file1.txt overwritten"; \
    else \
        echo "file1.txt is unchanged"; \
    fi

.PHONY: file1.txt

file2.txt: file1.txt
    cp file1.txt file2.txt

file1.txt 规则中的测试将生成 file1.txt 如果它不存在或者随机数模 2 为 1。我希望看到 cp file1.txt file2.txt 执行如果并且仅当 file1.txt 被覆盖时。

通过添加 .PHONY 设置,您明确告诉 make 无论目标是什么,总是 被认为是过时的,所以您直接与您的目标相矛盾想做。

您可以使用另一种方法通过“强制目标”来处理此问题,例如:

FORCE: ;
file1.txt: FORCE
         ...

并删除 .PHONY 设置。