首页 > 其他分享 >makefile使用总结--规则

makefile使用总结--规则

时间:2023-04-18 10:26:49浏览次数:39  
标签:总结 文件 -- Makefile make makefile 目标 clean foo

本文参考《跟我一起写 Makefile》编写,并做了一些适合个人习惯的修改,稍加总结而成。   一篇文章肯定不够详细记录makefile所有的知识,所以这篇接着描述Makefile的规则。 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。

一、语法

targets : prerequisites
    command
    ...
或是这样:
targets : prerequisites ; command
    command
    ...
  • targets 是文件名,以空格分开,可以使用通配符。一般来说,我们的目标基本上是一个文件,但也有可能是多个文件。
  • command 是命令行,如果其不与“target:prerequisites”在一行,那么,必须以[Tab键]开头。如果命令太长,你可以使用反斜框(‘\’)作为换行符。
  • prerequisites 是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要新,需要重生成目标文件。
规则告诉make两件事,文件的依赖关系和如何成成目标文件。一般来说,make会以UNIX的标准Shell,也就是/bin/sh来执行命令。

二、举例

foo.o : foo.c defs.h
    cc -c -g foo.c
foo.o是目标文件,foo.c和defs.h是目标所依赖的源文件,和一个命令“cc -c -g foo.c”(以Tab键开头)。这个规则告诉我们两件事:
  1. 文件的依赖关系:foo.o依赖于foo.c和defs.h的文件,如果foo.c和defs.h的文件日期要比foo.o文件日期要新,或是foo.o不存在,那么依赖关系发生。
  2. 如果生成(或更新)foo.o文件。就需要执行cc命令,其说明了如何生成foo.o这个文件。(当然foo.c文件include了defs.h文件)

 三、规则中使用通配符

如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三各通配符:“*”,“?”和“[...]”。通配符代替了一系列的文件,如“*.c”表示所以后缀为c的文件。
print: *.c
    lpr -p $?
    touch print
上面这个例子说明了目标print依赖于所有的[.c]文件。

 四、伪目标

clean:
    -rm *.o
在工程编译过程中,会生成许多文件编译文件。上面这个例子提供了一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标) 这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后指出这个lable的名字。 为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY : clean
clean :
    -rm edit *.o
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。 当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。 这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。 伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性:
all : prog1 prog2 prog3
    .PHONY : all
prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o

prog2 : prog2.o
    cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o
Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是比“all”这个目标新。所以,其它三个目标的规则总是会被执行。  随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子:
.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
    rm program
cleanobj :
    rm *.o
cleandiff :
    rm *.diff
“make clean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make cleandiff”命令来达到清除不同种类文件的目的。

标签:总结,文件,--,Makefile,make,makefile,目标,clean,foo
From: https://www.cnblogs.com/chien/p/17328606.html

相关文章

  • VS Code 有哪些好用的插件呢?【持续更新】
    一、画图工具:vscode-drawio  功能:在VSCode中画流程图、数据流图等等。      使用方法:    创建一个后缀名为.drawio的文件,然后用VSCode打开即可。  效果如下图:  二、格式化工具:PrettyFormatter  功能:格式化文档,包括js、json、html、css、xml等......
  • Centos7开启docker checkpoint
    检查点和还原是一项实验性功能,允许您冻结正在运行的容器,通过检查点将其状态转换为文件集合在磁盘上。稍后,容器可以从冻结点恢复。#docker开启checkpoint:"experimental":true,[root@jenkins~]#cat/etc/docker/daemon.json{"experimental":true,"data-root":......
  • AD提权安装软件
    在使用ActiveDirectory域管理的虚拟桌面中,每个用户对虚拟桌面计算机是普通用户权限。如果用户需要单独安装软件,需要以管理员账户权限运行。有的软件也需要以管理员权限运行,对于这种情况下,可以使用第三方软件lsrunase.exe程序,通过指定批处理脚本的方式,以管理员权限安装软件(或运行......
  • Java实现延迟执行代码
    Java实现延迟执行代码对于Java程序在它们的操作中添加延迟或暂停是比较常见的。这对于任务暂停直到另外任务完成执行场景比较有用。本文我们提供两类方法实现延迟执行。1.基于线程(Thread)方法当Java查询运行时,它在操作系统上产生一个进程,其至少包含一个线程————主线程负责......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用Ope......
  • [oeasy]python0133_变量名_标识符_identifier_id_locals
    变量名回忆上次内容上次讲了什么是变量变量变量能变的量就是变量 各种系统、游戏就是由变量所组成的​ 添加图片注释,不超过140字(可选) 声明了变量并且定义了变量 声明就是declaration把标识符和具体值......
  • Vue2
    Vue的指令:用在dom元素的属性上。​{{}}---差值表达式​v-text:文本显示​v-html:解析html文本​v-on:绑定事件@​v-bind:绑定dom中的属性:​v-show---v-if:隐藏和显示dom元素​v-model:设置和获取表单元素的值---双向绑定​......
  • 组策略映射共享文件夹
    在编写了安装脚本之后,本节任务是将提供安装程序的共享文件夹自动映射到每个用户,为了方便每个用户,还可以在每个虚拟机的桌面自动创建快捷方式,现在介绍方法,主要内容如下。(1)在ActiveDirectory域服务器中,打开“组策略管理”程序,在“克隆链接组”组织单位中新建组策略,本示例中新建组策......
  • 测试环境治理之MYSQL索引优化篇
    作者:京东物流 李光新1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试......
  • 《Ubuntu — NetworkManager开机提示A start job is running for Network Manager wai
    轉自:https://www.cnblogs.com/zhuangquan/p/13209758.html,僅供參考學習使用1.NetworkManagerUbuntuServer:Ubuntu的Server版本只有终端界面,没有桌面GUI,且Server版本不会安装NetworkManager,所以UbuntuServer网络由配置文件进行配置。由于Server版本一般用作服务器的......