我:
make不需要编译器?没有arm-linux-make之类的东西? uboot里面也有shell脚本,没有arm-linux-shell之类的东西? 平台通用?
五号:make只是一个脚本工具.
gcc与clang才是编译器.
我们使用脚本,调用编译器.进行编译。
我对makefile和shell的通俗理解:
make和shell是基于操作系统的脚本语言,所以其代码跨平台通用,不需要交叉编译。
我可以把makefile理解为keil这种IDE,去负责编译过程(keil帮我们管理了头文件包含、各文件的依赖关系等事情)。
而bash等shell,我的理解是:
在平台上(shell中可以使用linux命令,这就意味着shell代码可以操作linux系统,
并且shell也支持逻辑操作等常规计算机语言的功能,
这就意味着shell可以让linux系统以组合+先后等等的形式来干各种各样的活)自动化操作keil IDE干活。
综上 makefile shell 结合起来,可以更好得指导如何(“如何”这个特征,就意味着存在组合+先后等等的逻辑关系)编译,以及提示编译错误(windows下的IDE编译后肯定都有编译信息,linux下也不例外,只不过这个过程由我们掌控。shell本身能够掌控linux系统,当然也能在帮助makefile如何编译代码这件事情上,根据shell代码来决定输出哪些信息,这些信息,作为编译信息提示给程序员观看。如果不想看任何编译信息,可以加上@前缀进行静默编译) 。
-------------------------------------------------------------------------
Makefile有三个非常有用的变量。分别是$@,$^,$<, 代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
代码片段:
%.o : %.S
arm-linux-gcc -o $@ $< -c
理解:这里$<是 %.S,所以这句makefile的意思就是把所有的S文件编译成目标($@,即%.o,
因为这里又使用了%通配符,
所以这句代码的意思是把相对应的S文件经过gcc -c 编译成 相对应的.o文件.
因为具有相对应的关系,又使用了-o, 最终得到多个不同名字的.o文件)
----------------------------------------------------------------------------
使用.PHONY修饰的目标,是伪目标, 对于伪目标,伪目标一般没有依赖, 统一都会再执行一遍伪目标下面的命令。