makefile实验三 理解make工作的基本原则
代码简单,但测试花样多,若能回答对本博客的每个步骤的预期结果,可以说对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.
.
makefile实验三 理解make工作的基本原则的更多相关文章
- 20145213《Java程序设计》实验三敏捷开发与XP实践
20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理
Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...
- 20145208 实验三 Java面向对象程序设计
20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- 20145215实验三 敏捷开发与XP实践
20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...
- 20162330 实验三 《敏捷开发与XP实践》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623班 ...
- 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
- 实验三 CC2530平台上CC2530平台上定时器组件的
实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...
- 20155324 《Java程序设计》实验三 敏捷开发与XP实践
20155324 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 1.XP核心实践 2.相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Developme ...
随机推荐
- 为什么网站URL需要设置为静态化
http://www.wocaoseo.com/thread-95-1-1.html 为什么网站URL需要静态化?网站url静态化的好处是什么?现在很多网站的链接都是静态规的链接,但是网站 ...
- Blazor带我重玩前端(五)
概述 本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第一篇,后续会有第二篇. 我们可以视组件是一个类,我们先看一下前文所说的Index.Razor页面生成的 ...
- 多商铺平台手机电脑自适应宣传展示平台店铺javassh项目代码线上
部署运行:eclipse 建议使用jdk 1.8 + ,Tomcat 8.0 + 系统介绍: 1.网站后台采用主流的 SSH框架 jsp JSTL,网站前台采用Angular jS框架 2.网站前端采 ...
- Mono集成中使用api获取当前mono 调用堆栈的方法
// 在mono源代码层级中加如下两个api 可以获取堆栈字符串 这两个api我新加的,原来没有.基于原来的代码改的. // add by bodong#if PLATFORM_WIN32 __dec ...
- 【转】mac上安装gradle
http://www.douban.com/note/311599602/ 首先,先download最新版本的gradle,网址如下:http://www.gradle.org/get-started ...
- PHP to .NET Compiler
官网 https://github.com/peachpiecompiler/peachpie 非官方简介 https://blog.csdn.net/sD7O95O/article/details/ ...
- sort(桶排序+hash)
题目链接:https://cn.vjudge.net/problem/HDU-1425 注意是多组输入 代码: #include<cstdio> #include<iostream& ...
- nginx模块化结构
NGINX是一个免费.开源.高性能.轻量级的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器 特点: 占有内存少,并发能力强 Nginx的优点: 模块化.事件驱动.异步.非阻 ...
- vue相关知识点及面试
### vue #### vue生命周期 beforeCreated `实例初始化,数据观察和event/watch事件配置之前被调用` created `实例创建后立即调用,数据观测,数据和方法运算 ...
- 在一张id连续的表中找出缺失的id
有这样一张表: create table tb_lostid( id number(6,0) primary key not null, name nvarchar2(20) not null ) 可 ...