当前位置: 代码迷 >> 综合 >> makefile进阶(1)——两种不同的依赖类型:normal prerequisites和order-only prerequisites
  详细解决方案

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

热度:80   发布时间:2024-02-02 00:48:17.0

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

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

TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES

注意:

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

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

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

二、实例分析与验证

实例1: 

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


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

实例2: 

 

 

 

ref:

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

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

徐海兵 gnu make翻译版

  相关解决方案