目录

  • 1. makefile基本语法复习
  • 2. 命令前提目标 order-only prerequisites
  • 3. 例子

在makefile中,有时会在依赖关系中看到竖线“|”管道符,它是作用是用来指示命令前提目标 order-only prerequisites

1. makefile基本语法复习

这里,我们简单复习一下makefile基本语法。其中的[TAB]就是键盘上的Tab键,不可以用空格替代。

target : prerequisites
[TAB]command1
[TAB]command2
[TAB]...
[TAB]commandN

其中,
target,称为生成目标。可以是Object File,也可以是执行文件,还可以是一个标签(Label)。
prerequisites ,称为前提目标。
command*,是make需要执行的命令,任意的Shell命令。

2. 命令前提目标 order-only prerequisites

在makefile中,有时会在依赖关系中看到竖线“|”管道符,它是作用是用来指示命令前提目标 order-only prerequisites。

事实上make工具能理解两种类型的前提目标:
Type I: 正常前提目标(normal prerequisites)
正常前提目标能达成两个目的:
 i. 影响build command执行顺序,即:在生成目标(target)的命令被执行前,所有的需要生成的前提目标(prerequisites)的命令都需要被执行。
ii. 影响依赖关系,即:如果任何一个前提目标(prerequisites)比生成目标(target)新时,生成目标都将被认为太旧而需要被重新生成。
通常,上面的这两个目的正是你所需要的:当前提目标更新时,生成目标也需要更新。

Type II: 命令前提目标(order-only prerequisites)
偶尔的,我们会遇到这样的情况:我们需要执行某个或某些规则,但不能引起生成目标(target)被重新生成。此时你就需要使用命令前提目标。命令前提目标由一个管道符号即竖线“|”指示,位于前提目标列表中。竖线左边的目标就是正常前提目标,竖线右边的目标就是命令前提目标,形式如下:

target : normal-prerequisites | order-only-prerequisites

注1:竖线“|”左边的正常前提目标列表可以是空。
注2:如果前提目标中同时存在正常前提目标和命令前提目标,则正常前提目标(normal prerequisites)优先生成。
注3:规则依赖文件列表中如果一个文件同时出现在常规列表和“order-only”列表中,那么此文件被作为常规依赖处理。
注4:只有在生成目标文件不存在时,命令前提目标才会参与规则的执行。
         但是,当生成目标文件存在时,命令前提目标不会参与规则的执行。

3. 例子

3.1. 例子1:

LIBS = libtest.a
foo : foo.c | $(LIBS)$(CC) $(CFLAGS) $< -o $@ $(LIBS)

make在执行这个规则时,如果生成目标文件“foo”已经存在。当“foo.c”被修改以后,目标“foo”将会被重建。但是,当“libtest.a”被修改以后,将不执行规则的命令来重建目标“foo”。
就是说,规则中命令前提目标$(LIBS)只有在生成目标“foo”文件不存在的情况下,才会参与规则的执行。当目标文件存在时此依赖不会参与规则的执行过程。

3.1. 例子2:
创建如下三个文件

func.c,main.c内容随意,保证编译通过就行。
makefile内容如下:(makefile没有什么实际意义,仅仅为了演示命令前提目标的用法)

TEST_DIR=dirTest
all:main.o                                     //规则1@echo "this is all"
main.o : main.c func.o | ${TEST_DIR}           //规则2@echo "gcc process"gcc -c main.c -o $@
func.o : func.c                                //规则3@echo "func gcc process"gcc -c func.c -o $@
${TEST_DIR}:                                   //规则4@echo "creat the dirTest directory"mkdir -p dirTest

测试1:直接make all

从make命令的输出log可以看出,五个规则的执行顺序是:规则3 --> 规则4 --> 规则2 --> 规则1。这个顺序,刚刚好证明了第1节中“注2”的说明,正常前提目标(normal prerequisites)优先生成。
执行make all后,当前路径内容如下:

测试2:修改func.c的内容,然后再执行make all

因为func.o是常前提目标(normal prerequisites),则修改了func.c,规则3 --> 规则2 --> 规则1 又重新执行了一遍。

测试3:在dirTest文件夹里新建一个文件,然后再执行make all

因为dirTest是命令前提目标(order-only prerequisites),虽然修改了dirTest,但是只有规则1被执行了,规则2并没有被执行。
可以看出,dirTest的改动,并没有影响规则2的执行。

测试4:删掉main.o,然后再执行make all

删掉了main.o后,规则2被执行了。

makefile 中竖线 “|” 管道符的作用相关推荐

  1. Makefile中.PHONY伪目标的作用(完整)

    第一种情况:避免命令与目录下的文件名重复 实际上这个情况很少发生,但网上大部分博客也仅介绍了这一种情况.这里以如下Makefile简单介绍一下: clean:rm -f *.o temp 如果当前目录 ...

  2. makefile中的.PHONY和all的作用

    .PHONY(伪目标) 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签.伪目标通过PHONY来指明. PHON ...

  3. makefile中的all和.PHONY的作用

    请编写一个makefile同时编译.链接下面两个程序: main1.c: #include int main(void) { printf("main1\n"); } main2. ...

  4. 【Linux + Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别

    笔者常年在Linux环境编程,经常在项目中与Makefile打交道,最近总结了几个Makefile的小的知识点,分享给大家. 通过阅读本文,你将了解到以下知识: 1.Makefilke中的.PHONY ...

  5. makefile中.PHONY的作用是什么?

    makefile中.PHONY的作用是什么?   初学makefile的时候,有一个关键字".PHONY"搞不懂,在请教过同学之后豁然开朗,遂写下经验望帮助更多的同学能够理解. 在 ...

  6. Makefile 中all:的作用

    在Makefile中使用all:时 若直接 make 或 make all 的话,会执行$(TARGET) 和 install 对应的命令 在执行make时,若后面接all下对应的选项,则有: 1.m ...

  7. linux中|管道符的作用

    | 管道符的作用是 把 管道符左边的的输出 当做右边命令后面待处理的结果 例如 ls -lha ~ 这个是列出home目录下所有目录的显示 ls -lha ~ | more 将上面分屏显示的内容 用M ...

  8. Makefile中$的作用

    在Makefile中$一般有4种用法: 1 引用变量 VSRC = $(wildcard ./vsrc/our_OnOff.v) CSRC = $(wildcard ./csrc/main.cpp) ...

  9. Makefile中.PHONY的作用

    单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of i ...

最新文章

  1. Android定制:修改开机启动画面
  2. 互联网协议 — Non-IP 网络架构
  3. FFMPEG H264/H265 编码延迟问题
  4. list(map(list,zip(*a)))
  5. raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘
  6. epoll机制:epoll_create、epoll_ctl、epoll_wait、close
  7. win10系统excel2019单元格显示完整的年月日时分秒设置方法
  8. 天不知道地知道你不知道我知道谜底_温州这里有个7000平方米的“寻宝”地,你不知道就亏大了!...
  9. vs2015软件系统开源_特别版:2015年开源新闻
  10. 王者荣耀新英雄官宣:鲁班七号之父鲁班大师 即将上线
  11. 探秘ReSharper 8新功能——XAML编辑
  12. form表单file,select选择后自动提交
  13. 删除数组对象 相同的值 制定数组对象
  14. 选择图层_PS图层之——基本功能详细介绍
  15. 二、语音合成(TTS)
  16. BUUCTF MISC刷题
  17. 漏洞分析---SSLv3降级加密协议Padding Oracle攻击(POODLE)技术分析
  18. Google Chrome OS中文版下载 支持中文输入法
  19. 程序设计思维 A - 区间选点 II(差分约束)
  20. php 斐多纳契数列,菲波纳契数列对股市的影响

热门文章

  1. appium示例代码python_(appium+python)UI自动化_07_UI自动化实例【拼多多搜索商品为例】...
  2. 电子签名助力电子处方合规高效,实现医院管理全程电子化
  3. macos sierra_如何在macOS Sierra,优胜美地和El Capitan中更改登录屏幕背景
  4. 写给即将/正在找工作的Android攻城狮
  5. 小麦盒子cdn_高恪论坛 - Powered by Discuz!
  6. win10+pycharm 调用相机进行拍摄图片并自动进行相机标定、矫正
  7. cas 6 单点登录登出管理
  8. 链锯:基于链接的自动化工作流漏洞生成
  9. 阿里巴巴机器翻译在跨境电商场景下的应用和实践
  10. Windows 11 Office/Visio/Project 2021 下载