makeifle之依赖的类型
来源:互联网 发布:linux打开oracle 编辑:程序博客网 时间:2024/04/28 18:27
规则中依赖(prerequisites)的分类
GNU make规则中的依赖(prerequisites)可以分为两类。
第一类:也是最常见的依赖类型,我们称之为常规依赖(normal prerequisites)。
第二类:此依赖类型比较特殊,称之为order-only依赖(order-only prerequisites)。
常规依赖
常规依赖理解起来很容易:一个规则中的常规依赖主要告诉make两件事。
第一,它决定了重建此规则目标所要执行规则(确切的说是执行命令)的顺序。换句话说,就是在更新这个规则的目标(执行此规则的命令)之前需要按照什么样的顺序来执行具体的规则(命令)来重建这些依赖文件(对所有依赖文件的重建,使用显式或者隐式规则)。
举例来说,对于这样的一个规则:A: B C,那么在重建目标A之前,首先需要完成对它的依赖B和C的重建。重建B和C的过程就是执行Makefile中以B和C为目标的规则)。
第二,它确定了一个依存关系;规则中如果依赖文件的任何一个比目标文件新,则认为规则的目标已经过期而需要重建目标文件。
order-only依赖
常规依赖在大多数情况下已经能满足我们的需求。那么什么是order-only依赖,它又什么用呢?
有时,需要定义一个这样的规则,在更新目标(目标文件已经存在)时只需要根据依赖文件中的部分来决定目标是否需要被重建,而不是在依赖文件的任何一个被修改后都重建目标。为了实现这一目的,相应的就需要对规则的依赖进行分类,一类是在这些依赖文件被更新后,需要更新规则的目标;另一类是更新这些依赖的,可不需要更新规则的目标。我们把第二类称为:order-only依赖。书写规则时,order-only依赖使用管道符号“|”开始,作为目标的一个依赖文件。规则依赖列表中管道符号“|”左边的是常规依赖,管道符号右边的就是order-only依赖。这样的规则书写格式如下:
touch prereq1
making prereq0
touch prereq0
making prereq2
touch prereq2
making target
touch target
touch target
touch prereq2
在绝大多数情况下,我们并不希望生成的文件(包括目标文件*.o、静态库*.a、共享库*.so以及可执行文件)与源码文件混合在一起。因为一旦混合在一起,单目录下的文件数量就会增倍,这不仅导致文件混乱,还大大降低了源码的结构性。如果有意将生成的文件与源码分开的话,源码结构就能保持简单,一目了然,甚至有利于最后的打包发布。
为了更好的说明问题,具体来看一个简单的例子。工程结构如下:
Assembler messages:
Fatal error: can't create objdir/foo.o: No such file or directory
Makefile:18: recipe for target 'objdir/foo.o' failed
make: *** [objdir/foo.o] Error 1
gcc -Wall -O2 -Iinclude -c -o objdir/foo.o foo.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -Wall -O2 -Iinclude -c -o objdir/bar.o bar.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -Wall -O2 -Iinclude -c -o objdir/main.o main.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -o simpletest objdir/foo.o objdir/bar.o objdir/main.o
make[1]: Entering directory '/tmp/makefile_learn'
rm -rf objdir simpletest
make[1]: Leaving directory '/tmp/makefile_learn'
make simpletest
make[1]: Entering directory '/tmp/makefile_learn'
mkdir -p objdir
gcc -Wall -O2 -Iinclude -c -o objdir/foo.o foo.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -Wall -O2 -Iinclude -c -o objdir/bar.o bar.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -Wall -O2 -Iinclude -c -o objdir/main.o main.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -o simpletest objdir/foo.o objdir/bar.o objdir/main.o
make[1]: Leaving directory '/tmp/makefile_learn'
make test
make[1]: Entering directory '/tmp/makefile_learn'
gcc -Wall -O2 -Iinclude -c -o objdir/foo.o foo.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -Wall -O2 -Iinclude -c -o objdir/bar.o bar.c objdir
gcc: warning: objdir: linker input file unused because linking not done
gcc -o simpletest objdir/foo.o objdir/bar.o objdir/main.o
./simpletest
foo
bar
make[1]: Leaving directory '/tmp/makefile_learn'
- makeifle之依赖的类型
- kconfig Makeifle
- 依赖的类型
- 依赖的类型
- Spring笔记之七(Types of Injection) Spring的三种依赖注入实现类型
- 依赖注入的几种实现类型
- 依赖注入的三种实现类型
- IoC的3种依赖注入类型
- IoC的3种依赖注入类型
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- maven3实战之坐标和依赖(依赖的配置)
- 嵌套依赖类型名
- Spring依赖注入类型
- axure模拟点击签到图标点亮
- phpExcel生成报表
- Linux无法写入权限问题 & 解决Wordpress不能自动安装主题、插件
- linux 内核模块编程之模块参数(四)
- 2016新的开始
- makeifle之依赖的类型
- ssh 公钥认证方式登录
- Qt Installer Framework的学习(二)
- tyvj p1027 木瓜地
- 最小二乘法OLS
- System.loadLibrary()使用详解
- Socket分片:基于Netty的Java实现
- pdf.js阅读pdf,并统计阅读进度
- MapReduce的矩阵乘法的原理