关于Makfile中PHONY的理解问题

时行居正 2015-11-20 10:12:31
1 背景
最近分析linux内核中的Makefile以及Makefile.build文件,在网上搜了一篇makefile.build,说是根据内核的改编,但是有关PHONY的理解不清楚。
2 问题描述
Makefile中通过如下代码转换到makefile.build文件
-----------------------------------------------------------------------------------
all :
make -C ./ -f $(TOPDIR)/Makefile.build
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o
-----------------------------------------------------------------------------------
makefile.build代码部分截取如下
-----------------------------------------------------------------------------------
PHONY := __build
__build:
PHONY += $(subdir-y)
__build : $(subdir-y) built-in.o

$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build

built-in.o : $(cur_objs) $(subdir_objs)
$(LD) -r -o $@ $^

%.o : %.c
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<

.PHONY : $(PHONY)
----------------------------------------------------------------------------------------
subdir-y 变量声明为PHONY可以理解,是想让它每次编译时必定执行,访问下级目录 。
可是__build为什么也要声明为PHONY,它是.build文件中第一个目标,应该肯定会被执行的啊。
我自己的理解会不会是因为Makfile中已经存在目标了all的原因,
如果是这样,make -C ./ -f $(TOPDIR)/Makefile.build 这句到底怎么理解 ?
...全文
491 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2015-12-02
  • 打赏
  • 举报
回复
即使built-in.o变化了,如果同名的build文件在此之后(被人为)更新了,则不会。 .PHONY: build2 all: build1: aaa; echo build1 build2: aaa; echo build2 aaa: ; echo aaa 比较以下两个命令的差异 touch build1 build2; sleep 1; touch aaa; make build1 build2 touch aaa; sleep 1; touch build1 build2; make build1 build2
时行居正 2015-12-01
  • 打赏
  • 举报
回复
但是从生成的makefile.build文件中有“__build : $(subdir-y) built-in.o”,可以看出它是有依赖的啊,所以即便你不加PHONY,如果built-in.o发生变化,也是需要执行的吧
nswcfd 2015-11-25
  • 打赏
  • 举报
回复
就算是第一个,假如目录下碰巧有个文件叫__build,就不会无条件执行了。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧