ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

makefile进阶(1)——两种不同的依赖类型:normal prerequisites和order-only prerequisites

2020-11-30 10:35:19  阅读:228  来源: 互联网

标签:文件 依赖 进阶 normal prerequisites only dirTest 规则 main


https://blog.csdn.net/wwwlyj123321/article/details/107634687

 

一、normal prerequisites和order-only prerequisites的区别

通常,如果规则中依赖文件中的任何一个被更新,则规则的目标相应地也应该被更新。有时,需要定义一个这样的规则,在更新目标(目标文件已经存在)时只需要根据依赖文件中的部分来决定目标是否需要被重建,而不是在依赖文件的任何一个被修改后都重建目标。为了实现这一目的,相应的就需要对规则的依赖进行分类,一类是在这些依赖文件被更新后,需要更新规则的目标;另一类是更新这些依赖的,可不需要更新规则的目标。我们把第二类称为:“order-only”依赖。书写规则时,“order-only”依赖使用管道符号“|”开始,作为目标的一个依赖文件。规则依赖列表中管道符号“|”左边的是常规依赖,管道符号右边的就是“order-only”依赖。这样的规则书写格式如下:

TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES

注意:

1、竖线左边的常规依赖文件可以是空;

2、如果前提目标中同时存在正常前提目标和命令前提目标,则正常前提目标优先生成。

3、规则依赖文件列表中如果一个文件同时出现在常规列表和“order-only”列表中,那么此文件被作为常规依赖处理

二、实例分析与验证

实例1: 

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


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

实例2: 

在当前文件夹下存在文件main.c和makefile文件,

其中makefile文件内容如下:包含三条规则,为了方便后续分析,分别将其表示为规则1、2、3。

  1.   TEST_DIR=dirTest
  2.    
  3.   all:main.o
  4.   @echo "this is all"
  5.    
  6.   main.o : main.c | ${TEST_DIR}
  7.   @echo "gcc process"
  8.   gcc -c main.c -o $@
  9.    
  10.   ${TEST_DIR}:
  11.   @echo "creat the dirTest directory"
  12.   mkdir -p dirTest

步骤一、执行make命令

通过输出的打印信息可以发现,三条规则的执行顺序分别是:规则3->2->1。此时,文件夹中的内容如下:

步骤二、在上述步骤的基础上修改dirTest文件夹的内容,我这里是在文件夹中添加了一个文件。然后执行make

通过打印可以发现,虽然更新了dirTest的内容,但是第二条规则依旧没有执行(因为dirTest已经存在),这就是order-only依赖的作用。

步骤三、在上述步骤的基础上,将order-only依赖转换为常规依赖,即将makefile修改成如下:

  1.   TEST_DIR=dirTest
  2.    
  3.   all:main.o
  4.   @echo "this is all"
  5.    
  6.   main.o : main.c ${TEST_DIR}
  7.   @echo "gcc process"
  8.   gcc -c main.c -o $@
  9.    
  10.   ${TEST_DIR}:
  11.   @echo "creat the dirTest directory"
  12.   mkdir -p dirTest

再次执行make

通过打印信息可以看出执行了规则2、1,符合常规依赖的执行规则。

 

 

ref:

https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types

https://blog.csdn.net/npjocj/article/details/8025378

徐海兵 gnu make翻译版

标签:文件,依赖,进阶,normal,prerequisites,only,dirTest,规则,main
来源: https://www.cnblogs.com/idyllcheung/p/14059912.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有