1.Makefile关于查找目标文件得的问题
在uImage中大量涉及到,目标的某一个依赖的标号在当前Makefile下找不到得情况。在之前的实验一直认为,在a文件下的Makefile需要子目录b下的b.o却没有关于b.o的标号定义的时候,make会自动在子目录b下的Makefile查找b.o的目标。下面验证是否正确。
1.1文件结构
主目录有a.c和Makefile以及子目录b
子目录下有b.c以及Makefile。
1.2代码
(1)a.c
voidmain(){}
(2)b.c
voidbbb(){}
(3)主目录的Makefile
all:bin
bin:a.o b/b.o
ld-o bin a.o b/b.o
a.o:a.c
gcc-c -o a.o a.c
clean:
rma.o bin
(4)b目录下的Makefile
all:
gcc-c -o b.o b.c
clean:
rm b.o
1.3执行结果
1.4结论
make在当前Makefile中未发现目标,会到相应的目录的Makefile继续查找规则。Ps:懒得搜资料,还是实验最实在。
2.make-f 与之前得make的关系
内核中大量使用了make-f ,尤其是对于makefie-f scripts/Makefile.build,这里弄清出第一步make与这个make的关系。设计如下实验。
2.1文件结构
主目录是x,有一个Makefile,另外包含一个子目录y,且y子目录也有一个Makefile。
2.2代码
(1)主目录Makefile
var1 :=100
exportvar1 from_x
.PHONY:all x abc
all:x abc
abc:
make-f ./y/Makefile
x:
@echoxxxx
from_x:
@echofrom_x
(2)子目录y下的Makefile
.PHONY:all
all:from_x
@echo$(var1)
2.3执行结果
(1)直接执行
所以,可以知道from_x是标号无法导出。
(2)把子目录下all后面的from_x去掉,再执行,如下:
可以知道export可以导出全局变量并在其他Makefile中生效。
(3)如果再把主目录Makefile中export那行话去掉,再执行,如下:
这里看到var1变量因为没有导出,就不生效了。所以可以确定的是make-f b/Makefile作为make引发的操作,不会与主make程序共享数据,当然export除外。
2.4结论
结论是make -f与引发其得make没有实际关系,不共享变量。不过,当然make可以给其子make程序传递变量参数。