代码简单,但测试花样多,若能回答对本博客的每个步骤的预期结果,可以说对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工作的基本原则的更多相关文章

  1. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  2. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  3. Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

    Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...

  4. 20145208 实验三 Java面向对象程序设计

    20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  5. 20145215实验三 敏捷开发与XP实践

    20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...

  6. 20162330 实验三 《敏捷开发与XP实践》 实验报告

    2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623班 ...

  7. 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告

    2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  8. 实验三 CC2530平台上CC2530平台上定时器组件的

    实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...

  9. 20155324 《Java程序设计》实验三 敏捷开发与XP实践

    20155324 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 1.XP核心实践 2.相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Developme ...

随机推荐

  1. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

  2. 一篇文章高效定位iframe

    今天跟大家分享的是如何高效的定位iframe.我们来看一段最早的代码: # coding: utf-8from selenium import webdriverfrom time import sl ...

  3. npm install @wepy/cli -g 出错

    npm install @wepy/cli -g 出错:npm ERR! Unexpected end of JSON input while parsing near '...1.0.0" ...

  4. jq cdn地址

    百度CDN支持版本2.0.3, 2.0.2, 2.0.1, 2.0.0,1.11.1, 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.3, 1.8.2, 1.8. ...

  5. oeasy教您玩转linux010109clear清屏

     回忆上次内容 上次讲了灵魂三问 whatis whereis which 通过这三个问题,可以对命令基本了解,我们来试一下!!

  6. 启用和禁用warning

    #pragma warning 启用和禁用warning https://www.cnblogs.com/Free-Thinker/p/5897678.html

  7. cg语言学习&&阳春白雪GPU编程入门学习

    虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...

  8. 深入了解Netty【三】Netty概述

    1.简介 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,它支持快速.简单地开发协议服务器和客户端等网络应用程序 ...

  9. docker部署code-server实现在线开发

    1.前言 本文记录了通过docker.docker-compose部署code-server.mysql,搭建在线开发环境的过程,综合体验很爽,适合小规模开发团队使用. 安装环境: vmware hy ...

  10. 转载:SQL语句执行顺序

    转载地址:https://database.51cto.com/art/202001/609727.htm