Makefile 中会在多处地方看到 FORCE
转载:http://blog.csdn.net/wzw88486969/article/details/11739737
在内核的 Makefile 中会在多处地方看到 FORCE ,比如:
# vmlinux image - including updated kernel symbols
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
实际上它是一个伪目标:
PHONY +=FORCE
FORCE: # Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)
从上面看到,FORCE 既没有依赖的规则,其底下也没有可执行的命令。
如果一个规则没有命令或者依赖,而且它的目标不是一个存在的文件名,在执行此规则时,目标总会被认为是最新的。也就是说,这个规则一旦被执 行,make 就认为它所表示的目标已经被更新过。当将这样的目标(FORCE)作为一个规则的依赖时(如上的 vmlinux: ),由于依赖总被认为是被更新过的,所以作为依赖所在的规则定义的命令总会被执行。
比如上面的 vmlinux: 在每次 make 时,它下面的这些命令总会被执行:
ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE)-f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_SAMPLES
$(Q)$(MAKE) $(build)=samples
endif
ifdef CONFIG_BUILD_DOCSRC
$(Q)$(MAKE) $(build)=Documentation
endif
$(call vmlinux-modpost)
$(call if_changed_rule,vmlinux__)
$(Q)rm -f .old_version
用一个直观的例子可以清楚看到这一点,比如有 1 Makefile 文件:
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld file1.o:file1.c file2.h
gcc -c file1.c -o file1.o file2.o:file2.c file2.h
gcc -c file2.c -o file2.o clean:
rm -rf *.o helloworld PHONY +=FORCE
FORCE: .PHONY: $(PHONY)
在执行 make 后,观察文件的生成时间:
[beyes@SLinux Makefile]$ ll
total
-rw-rw-r--. beyes beyes Apr : file1.c
-rw-rw-r--. beyes beyes Apr : file1.o
-rw-rw-r--. beyes beyes Apr : file2.c
-rw-rw-r--. beyes beyes Apr : file2.h
-rw-rw-r--. beyes beyes Apr : file2.o
-rwxrwxr-x. beyes beyes Apr : helloworld
-rw-rw-r--. beyes beyes Apr : Makefile
helloworld 文件的生成时间是 20:20
如果将上面的 Makefile 文件的 helloworld:file1.o file2.o 这一句后面加个 FORCE,那么再过几分钟后再
make 时,再观察一下 helloworld 的生成时间,可以看到是重新生成的了,当然在 make 执行时命令的输出也能知道该命令被再次执行:
[beyes@SLinux Makefile]$ ll
total
-rw-rw-r--. beyes beyes Apr : file1.c
-rw-rw-r--. beyes beyes Apr : file1.o
-rw-rw-r--. beyes beyes Apr : file2.c
-rw-rw-r--. beyes beyes Apr : file2.h
-rw-rw-r--. beyes beyes Apr : file2.o
-rwxrwxr-x. beyes beyes Apr : helloworld
-rw-rw-r--. beyes beyes Apr : Makefile
Makefile 中会在多处地方看到 FORCE的更多相关文章
- makefile中的shell语法
在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...
- makefile中使用变量
makefile里的变量就像一个变量,变量的作用主要如下: (1)保存文件名列表. (2)保存编译器的参数. makefile中的变量是用一个字符串在makefile中定义的,这个文本串就是变量的值. ...
- [转] Makefile中调用Shell
1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的.比如如下代码就是没有任何输出: VAR="Hello" echo "$(VAR)&q ...
- Makefile 中:= ?= += =的差别 和条件运行
一:在Makefile中常常看到obj-m := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...
- Makefile中的%标记和系统通配符*的区别
Makefile中的%标记和系统通配符*的区别在于,*是应用在系统中的,%是应用在这个Makefile文件中的. (本文的测试环境是Windows7下使用MinGW提供的make.exe) 例如,如果 ...
- makefile中的shell编程注意点
参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是 ...
- Makefile调用shell应该注意的地方
转载:http://blog.csdn.net/ninlei0115/article/details/9732191 1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出 ...
- [转] Makefile 基础 (7) —— Makefile 中 make 的运行
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- js中console强大之处体现在哪
js中console强大之处体现在哪 一.总结 一句话总结:在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏览器有过之而无不及的地方.可能大家对conso ...
随机推荐
- (phpmyadmin error)Login without a password is forbidden by configuration (see AllowNoPassword) in ubuntu
1.Go to /etc/phpmyadmin/config.inc.php and open it your favorite editor. 2.Search for below line of ...
- Collection Operators
[Collection Operators] Collection operators are specialized key paths that are passed as the paramet ...
- 配置超级用户口令(Cisco IOS系统)
命令一共有以下几条: (1)enable secret enable secret 0 密码明文 enable secret 5 密码密文(MD5加密) (2)enable password enab ...
- oracle学习 七 拼接变量+日期函数(持续更)
select count(KEYCODE) from STHSGDOC.ZJSJJL where ysrq=to_date(to_char(sysdate,'yyyy')||'/1','yyyy/MM ...
- 使用SQLCOMMAND以及SQLADAPERT 调用存储过程
使用SQLCommand调用的基本方法如下: SqlCommand comm = new SqlCommand("P_GetCompanyInfo", conn); comm.Co ...
- login placeholder
$(function(){ function isPlaceholder(){ var input = document.createElement('input'); return 'placeho ...
- C#与C++对应的类型
//c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byte(unsigned char) ---- c ...
- 编译安装-Nginx
安装Nginx 1.环境准备 2.创建nginx用户 3.安装pcre-8.33.tar.gz 4.安装nginx-1.5.4.tar.gz 6.开机自启动 安装Nginx 1.环境准备 系统:Cen ...
- 【转】google推出的SwipeRefreshLayout下拉刷新用法
SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便. 使用如下: 1.先下载android-support ...
- flash 定义主舞台窗口大小
1:[SWF(width=100 height=100)] 写在主类上面2:设置stageScaleMode属性为false;