root@ubuntu:~/Makefile_Test# root@ubuntu:~/Makefile_Test# root@ubuntu:~/Makefile_Test# cat My_Make Target := Hello.out $(Target) : @echo "Target" test.out : $(Target) @echo "test.out"
root@ubuntu:~/Makefile_Test# ls 3.Makefile_PHONY_test2 func.c Hello.out Makefile_another_way_of_PHONY Make-f_YOUR_OWN_Makefile.txt tmp.c clean func.h main.c Makefile_PHONY_clean My_Make
ps: 这里存在一个Hello.out文件
root@ubuntu:~/Makefile_Test# root@ubuntu:~/Makefile_Test# make -f My_Make Hello.out make: ‘Hello.out‘ is up to date. root@ubuntu:~/Makefile_Test# make -f My_Make test.out test.out
解析:当前本地存在Hello.out , 所以make Hello.out 得到 make: ‘Hello.out‘ is up to date. 这一结果是合理的。 若不懂,看我前面的博客。
当前本地不存在test.out, 所以尝试make test.out有效,即会执行目标test.out所在规则内的命令(全部命令,一条或多条)。
接着操作:
root@ubuntu:~/Makefile_Test# echo "\"I am test.out\"" > test.out root@ubuntu:~/Makefile_Test# cat test.out "I am test.out" root@ubuntu:~/Makefile_Test# make -f My_Make test.out make: ‘test.out‘ is up to date.
在命令行内,先创建了一个本地的test.out, 那么此时,本地存在Hello.out和test.out, make test.out无效(即不会执行目标test.out所在规则内的命令)
接着来:
root@ubuntu:~/Makefile_Test# rm Hello.out root@ubuntu:~/Makefile_Test# make -f My_Make test.out Target test.out
在命令行内,先删除Hello.out,
回看源代码:
Target := Hello.out $(Target) : @echo "Target"
此时本地不存在Hello.out,目标Target相当于永远不是最新的目标。
那么此时去make test.out,首先一定会打印出:Target
再次回看源代码:
test.out : $(Target)
@echo "test.out"
test.out依赖于Target。也就是说test.out依赖于一个永远不是最新的目标,自然,test.out就变成了一个永远不是最新的目标,即被make,总是会生效。
于是最终又打印了出了test.out
这里要注意哦:虽然本地存在了test.out,但是鉴于上述的原因: 即当前make软件认为test.out比Target目标旧,所以make test.out是有效的。
因为make软件要力争:目标比依赖更新。
这里再来小结下make软件的工作原理:
1,目标文件不存在,make软件会将本次make该目标的操作生效(即会执行规则内的命令)。
2,目标文件存在,但是比依赖的文件旧,make软件也会将本次make该目标的操作生效(即会执行规则内的命令)。
原文:https://www.cnblogs.com/happybirthdaytoyou/p/11316782.html