export SHELL:=/bin/bash
inter_files=to_remove1.txt to_remove2.txt
.INTERMEDIATE: $(inter_files)
create_file: $(inter_files) ; @true
remove_file: ; -@rm -f $(inter_files)
$(inter_files): ; @touch $@
test: remove_file create_file test_tty
echo [var from : $(origin var)]
test_tty:
false
.PHONY: test test_tty remove_file create_file
如果Make文件中需要用到中间文件, 当然希望任务结束时删除这些中间文件, 如果把删除作为一个rm 命令来实现, 则在make失败时不会执行到这一行.
上面的借用make会自动删除 .INTERMEDIATE 目标产生的文件这一特点, 实现make无论成功失败时都会删除这些中间文件的功能:
1. 声明一个.PHONY 目标, 如remove_file, create_file
2. 把remove_file create_file依次添加到目标中, 如test
3. 为remove_file添加一个伪规则
remove_file: ; -@rm -f $(inter_files)
-@ 是必需的, 保证文件总是被删除, 不考虑权限不够等情况
4. 为create_file添加规则:
create_file: $(inter_files); @true
目的只是保证各个 $(inter_files)中的目标会被执行:
5. 为每个中间文件添加这样一个规则:
$(inter_files): ; @touch $@
touch命令是必需的, 而且必需保证中间文件是在此次make过程中新生成的, 只有这样make才会在最后删除这些它自己生成的中间文件.
通过
.INTERMEDIATE 指定的文件名, 必需作为一个目标被执行的过程中产生了该文件时, make才会删除.
上述实现保证, 即使在make之前已经存在 $(inter_files)中指定的文件, 也会将其删除, 因为make过程会先删除这些文件, 然后重新生成.
阅读(1930) | 评论(0) | 转发(0) |