# 伪目标
PHONY := __build
__build:

# 清空需要的变量
obj-y :=
subdir-y :=
EXTRA_CFLAGS :=

# 包含同级目录Makefile
# 这里要注意，相对路径为 执行本 Makefile.build 的路径
include Makefile

# 获取当前 Makefile 需要编译的子目录的目录名
# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y))   : c/ d/
# __subdir-y  : c d
# subdir-y    : c d
__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y	+= $(__subdir-y)

# 把子目录的目标定为以下注释
# built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)

# 获取当前目录需要编进程序的文件名作为，并写为目标
# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
# 使修改头文件 .h 后，重新make后可以重新编译（重要）
dep_files := $(foreach f,$(cur_objs),.$(f).d)
# 列出存在的文件
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
include $(dep_files)
endif


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 $@ $^

dep_file = .$@.d

# 生成 cur_objs 目标
%.o : %.cpp
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -Wp,-MMD,$(dep_file) -c -o $@ $<
#因为这里有个TAB 导致debug半个小时 望周知
.PHONY : $(PHONY)
