代码简单,但测试花样多,若能回答对本博客的每个步骤的预期结果,可以说对makefile的基础掌握是扎实的。

一,当前的makefile代码

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"

二,当前的ubuntu环境

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文件

三,现在一步步(按本博客各个步骤的先后顺序理解)执行makefile,你可以在脑子里预期每一步的执行效果,我也会附上解析

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,总是会生效.//说法(1)

于是最终又打印了出了test.out
这里要注意哦:虽然本地存在了test.out,但是鉴于上述的原因: 即make软件认为当前的目标test.out比它的依赖旧,所以make test.out是有效的. / / 说法(2)

换种说法也是一样的,也就是上面的说法(1): 如果一个目标X的依赖是另一个目标Y,目标Y都被重新make了,那么目标X一定会被重新make。

因为,make软件要做到: 目标比依赖更新。

这里再来小结下make软件的工作原理

        1,目标文件不存在,make软件会将本次make该目标的操作生效(即会执行规则内的命令)。

                             2,目标文件存在,但是比依赖的文件旧,make软件也会将本次make该目标的操作生效(即会执行规则内的命令)。

接着来

root@ubuntu:~/Makefile_Test# echo "\"I am Hello.out\"" > Hello.out
root@ubuntu:~/Makefile_Test# cat Hello.out
"I am Hello.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 test.out
clean func.h main.c Makefile_PHONY_clean My_Make tmp.c
root@ubuntu:~/Makefile_Test# make -f My_Make test.out
test.out
root@ubuntu:~/Makefile_Test# make -f My_Make test.out
test.out

使用命令行,又在本地创建了一个Hello.out。

经过上面的讲解,现在可以很容易地理解 make Target,一定不会执行 Target规则内的命令(不会打印Target)。

现在本地已经有了Hello.out 和 test.out。 可是为什么还打印出了test.out呢?

难道是make软件运行错误了?!

回顾本博客上文所总结的知识点 =》make软件的工作原理

本地的Hello.out是我们刚才新建的,而test.out在这之前就有了,所以,天空一声巨响,make(有效的,会执行命令的make)闪亮登场。

最后再做一个小实验,和刚才的这个实验遥相呼应

root@ubuntu:~/Makefile_Test# rm test.out
root@ubuntu:~/Makefile_Test# echo "\"I am test.out, a newer one\"" > test.out
root@ubuntu:~/Makefile_Test#
root@ubuntu:~/Makefile_Test# make -f My_Make test.out
make: 'test.out' is up to date.
root@ubuntu:~/Makefile_Test#
root@ubuntu:~/Makefile_Test#

我们在代码内做了一个操作,删除并创建了一个test.out。该操作的目的就是让test.out比Hello.out更新。

然后make test.out,结果符合预期。

make: 'test.out' is up to date.

.

最新文章

  1. Memcached学习笔记
  2. 【JavaScript】【CSS】前端规则摘抄
  3. 邻接矩阵无向图(二)之 C++详解
  4. D3.js 做一个简单的图表(条形图)
  5. Redis数据导入工具优化过程总结
  6. equals(),hashcode()方法详解
  7. 【搜索】【并查集】Codeforces 691D Swaps in Permutation
  8. ASP.NET自定义控件组件开发 第一章 第三篇
  9. 老李分享:导出xml报告到手机
  10. 由if-else,switch代替方案引起的思考
  11. CUDA程序的调试总结【不定时更新】
  12. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例
  13. java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
  14. 电子产品使用感受之——为什么我那么喜欢2015年的11.6寸MacBook Air?
  15. 查看log日志
  16. foreach和List.Foreach 退出循环相关问题
  17. for循环查找元素怎么跳出for循环
  18. flutter 获取设备屏幕大小
  19. 两台centos之间传送文件
  20. C++中的内存区域及其性能特征

热门文章

  1. 巧用HashMap一行代码统计单词出现次数
  2. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
  3. sqlmap 的 --forms之理解
  4. 在vue项目中使用scss
  5. 关于js与jquery中的文档加载
  6. CodeForces - 505B-Mr. Kitayuta's Colorful Graph(暴力)
  7. 2申请高德地图key 初始化地图
  8. Git 实用操作:撤销 Commit 提交
  9. Java审计之SQL注入篇
  10. Linux:配置apache支持php