在linux kernel与Uboot中,rules.mk 被包含到没有子目录的makefile文件中,用于产生文件依赖关系文件.depend文件,下面我们看一下uboot的rules.mk文件:
_depend: $(obj).depend
$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) $(HOSTSRCS) //描述.depend 的依赖关系
@rm -f $@ //强制删掉所有的目标文件,即*.depend文件
@touch $@ //强制更新目标文件属性,以便使文件过期
@for f in $(SRCS); do / //for循环读取子目录下的文件
g=`basename $$f | sed -e 's//(.*/)/./w//1.o/'`; /
//这一段比较难懂,我们把它分开来看,“basename $$f” 代表去变量$f的文件名,去掉路径等信息。“$f”为SRCS目录下的具体文
//件。“|”为管道描述,“sed -e 's//(.*/)/./w//1.o/'`”为一个sed命令的文本处理部分,”-e“ 命令行,"s/.../.."为替换命令,
//“/(.*/)/./w”代表匹配任意除换行符开始的任意长度的字符接着是”.“字符最后是一个匹配字母或数字或下划线或汉字,"//1.O/" /1为前
//面的.*/匹配字符串 ,".O"加上.o。简单的说,此句实现的功能为将一个源文件替换为一个.o的OBJ文件,e.g..将一个.c的问题变成.o文件.
//对于这一部分如果仍然不是很清楚,可以看一下正则表达式文档。。。
$(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; /
//产生依靠文件
done
@for f in $(HOSTSRCS); do /
g=`basename $$f | sed -e 's//(.*/)/./w//1.o/'`; /
$(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; /
done
//下面为.c编译规则
$(HOSTOBJS): $(obj)%.o: %.c
$(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c
$(NOPEDOBJS): $(obj)%.o: %.c
$(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c