请阅读【ARM GCC Makefile 编译专栏导读】
Makefile 伪目标 .PHONY 学习
.PHONY是GNU make的一个特殊目标,它用来指定那些不产生文件的目标。如果一个目标被声明为.PHONY
,那么make命令会忽略这个目标的文件名,即使在文件系统中存在同名的文件,make命令也会每次都执行这个目标的命令
在 Makefile 中,目标通常是一个文件名。当该文件不存在,或者其依赖的文件有更新时,make 命令就会执行目标所对应的命令。但有时,我们定义的目标并不是一个真实的文件,而是一个执行某些命令的名称。这种目标被称为伪目标。
.PHONY
用来显示地指明一个或多个目标是伪目标。这样,无论目标文件是否存在,make 命令都会执行伪目标所对应的命令。
这是一个使用 .PHONY
的例子:
.PHONY: clean
clean:
rm -f program.o utils.o program
上述Makefile中,clean
目标被声明为.PHONY
。当我们执行 make clean 时,无论是否存在名为 clean
的文件,make 命令都会执行 rm -f program.o utils.o program
这个命令。
.PHONY
不仅可以防止与文件名冲突,还可以让 make 命令在每次调用时都执行伪目标的命令,而不是仅在伪目标的依赖文件有更新时才执行。
Makefile 伪目标 FORCE
force则通常是用户自定义的一个目标,它没有命令,也没有依赖,所以它总是被认为是需要更新的。
因此,如果一个目标依赖于force,那么这个目标的命令总是会被执行。
这在你想要强制执行某些命令时非常有用,例如清理操作或者强制重新编译。
下面是一个使用force的例子:
clean:
force rm -f *.o
force: ;
上述Makefile中,clean
目标依赖于force
,即使在文件系统中存在一个名为clean的文件,make clean
命令也会每次都尝试删除所有的.o
文件。
这样,当我们运行make clean时,无论之前是否执行过make clean,rm
命令都会被执行,从而确保.o
文件被删除。
用一个直观的例子可以清楚看到这一点,比如有 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 后,观察文件的生成时间:
[sam@sam Makefile]$ ll
total 32
-rw-rw-r--. 1 beyes beyes 129 Apr 16 19:00 file1.c
-rw-rw-r--. 1 beyes beyes 924 Apr 16 20:20 file1.o
-rw-rw-r--. 1 beyes beyes 108 Apr 16 19:01 file2.c
-rw-rw-r--. 1 beyes beyes 139 Apr 16 18:49 file2.h
-rw-rw-r--. 1 beyes beyes 880 Apr 16 20:20 file2.o
-rwxrwxr-x. 1 beyes beyes 4786 Apr 16 20:20 helloworld
-rw-rw-r--. 1 beyes beyes 246 Apr 16 20:20 Makefile
helloworld 文件的生成时间是 20:20
如果将上面的 Makefile 文件的 helloworld:file1.o file2.o
这一句后面加个 FORCE
,如下:
helloworld:file1.o file2.o FORCE #FORCE表示每次这段都要执行
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
时,再观察一下 helloworld
的生成时间,可以看到是重新生成的了,当然在 make 执行时命令的输出也能知道该命令被再次执行:文章来源:https://www.toymoban.com/news/detail-655194.html
[sam@sam Makefile]$ ll
total 32
-rw-rw-r--. 1 beyes beyes 129 Apr 16 19:00 file1.c
-rw-rw-r--. 1 beyes beyes 924 Apr 16 20:20 file1.o
-rw-rw-r--. 1 beyes beyes 108 Apr 16 19:01 file2.c
-rw-rw-r--. 1 beyes beyes 139 Apr 16 18:49 file2.h
-rw-rw-r--. 1 beyes beyes 880 Apr 16 20:20 file2.o
-rwxrwxr-x. 1 beyes beyes 4786 Apr 16 20:26 helloworld
-rw-rw-r--. 1 beyes beyes 246 Apr 16 20:20 Makefile
PHONY 与 FORCE 差异
.PHONY
和force
都可以用来保证一个目标的命令总是被执行,但.PHONY
是GNU make
的内置特性,而force
则是一种约定俗成的做法。文章来源地址https://www.toymoban.com/news/detail-655194.html
到了这里,关于【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!