【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】

这篇具有很好参考价值的文章主要介绍了【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


请阅读【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 执行时命令的输出也能知道该命令被再次执行:

[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 差异

.PHONYforce都可以用来保证一个目标的命令总是被执行,但.PHONYGNU make的内置特性,而force则是一种约定俗成的做法。文章来源地址https://www.toymoban.com/news/detail-655194.html

到了这里,关于【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 嵌入式 编译系列 3.4 -- libgcc.a 详细介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 libgcc 是GCC的一部分。C语言不仅仅是由编译器构成,还包括了一个标准库。编译器在 GCC包里 ,标准库则位于 GNU C库里 ,即glibc包里。C编译器(cc1)肯定是要依赖 glibc库才能正常运行。 但是编译器本身还使用了一个内部

    2024年01月20日
    浏览(44)
  • 【ARM 嵌入式 编译系列 10.3 -- GNU elfutils 工具小结】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:【ARM 嵌入式 编译系列 10.2 – 符号表与可执行程序分离详细讲解】 下篇文章:【ARM 嵌入式 编译系列 11 – GCC attribute ((packed))详细介绍】 GNU elfutils是一个开源的工具集,用于处理 ELF (Executable and Linkable Format)格式的可执行文件、

    2024年02月13日
    浏览(46)
  • 【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍 下篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 在开发过程总,总是希望编译出来的可执行文件尽量小,因为这样可以节省更多的磁盘空间

    2024年02月09日
    浏览(52)
  • 【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍 下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 likely 和 unlikely 是GCC编译器提供的一种代码优化特性,这两个宏用于告诉编译器某个条件判断的结果是真还是假

    2024年02月12日
    浏览(41)
  • 【ARM 嵌入式 编译系列 3.6 -- 删除lib中的某个文件】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 比如,如果要删除 libc.a 静态库中的特定对象文件并重新使用这个静态库,在终端中可以使用 ar 命令。 ar 是一个归档工具,它可以创建、修改、提取以及列出归档库文件(如 .a 文件)的内容。 下面是删除 libc.a 中指定

    2024年01月25日
    浏览(53)
  • 【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 DISCARD 与 .ARM.exidx】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 在移植 RT-Thread 到 cortex-m33(RA4M2)上的时候,在编译的时候遇到下面问题:

    2024年01月23日
    浏览(46)
  • 【ARM 嵌入式 编译系列 4 -- linux 编译属性 __read_mostly 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:【ARM 嵌入式 编译系列 3.3 – gcc 动态库与静态库的链接方法介绍】 下篇文章:【ARM 嵌入式 编译系列 4.1 – GCC 编译属性 likely与unlikely 学习】 __read_mostly 是一个在Linux内核编程中用到的宏定义,这是一个gcc编译器的属性,用于告诉编

    2024年02月13日
    浏览(55)
  • 【ARM 嵌入式 编译系列 2.5 -- GCC 编译参数学习 --specs=nano.specs选项 】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 ARM 工具链 ( arm-none-eabi- ) 包括了一个叫作 --specs 的编译器和链接器选项,这个选项允许用户指定一个或多个 “specs” 文件,以影响编译或链接阶段的行为。Specs 文件包含一系列的命令行参数,这些参数可以是编译器选项

    2024年01月22日
    浏览(47)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(61)
  • 【ARM 嵌入式 编译系列 4.2 -- GCC 链接规范 extern “C“ 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.1 – GCC 编译属性 likely与unlikely 学习 下篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 介绍 extern “C” 是一种链接规范,它用于告诉C++编译器按照C语言的方式来链接代码。这个主要用于在C++代码

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包