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