makefile文件编写总结

最近打算自己编译一个android源码,放模拟器上跑,发现有几个难点android整个的架构,运行机制,以及build,而build中最为重要的一些内容就是makefile文件,shell及pathon脚本等,只有这些内容掌握了,才可能搞清楚真个android的编译原理,本文就针对makefile的学习做一个简短的总结,总共花了一天时间系统看完。

makefile文件最为重要的几个内容点:书写规则,书写命令,条件语句,函数,变量使用,模式以及隐含规则。下面就针对以上几点内容展开介绍。

Makefile 里主要包含了五个东西:显示规则(书写规则、命令、条件语句、函数、模式)、隐晦规则、变量定义、文件指示和注释。

  1. 显示规则。显示规则说明了,如何生成一个或多个的目标文件。这是由 Makefile 的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
  2. 隐晦规则。由于我们的 make 有自动推导的功能,所以隐晦的规则可以让我们比较粗糙 地简略地书写 Makefile,这是由 make所支持的。
  3. 变量的定义。在 Makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有 点像 C 语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。
  4. 文件指示。其包括了三个部分,一个是在一个 Makefile 中引用另一个 Makefile,就 像 C 语言中的 include 一样;另一个是指根据某些情况指定 Makefile 中的有效部分,就 像 C 语言中的预编译#if 一样;还有就是定义一个多行的命令。
  5. 注释。Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符, 这个就像 C/C++中的“//”一样。如果你要在你的 Makefile 中使用“#”字符,可以用反斜杠进行转义,如:“\#”。
  6. 最后,还值得一提的是,在 Makefile 中的命令,必须要以[Tab]键开始。

GNU 的 make 工作时的执行步骤入下:(其它的 make 也是类似)

    1、读入所有的 Makefile。

    2、读入被 include 的其它 Makefile。

    3、初始化文件中的变量。

    4、推导隐晦规则,并分析所有规则。

    5、为所有的目标文件创建依赖关系链。

    6、根据依赖关系,决定哪些目标要重新生成。

    7、执行生成命令。

 

下面拿一个实例具体分析:

# 同上面,加载Make.defines文件,该文件记录了各个目录下都要用到的一次额公用变量,如CC,CFLAGS等。
include ../Make.defines
# 程序的名称
PROGS=demo
# all是伪目标
all:$(PROGS)
# *.o依赖于*.c,将*.c-->*.o,这里的*的代表的东西是一致的
%.o:    %.c
    $(CC) $(CFLAGS) -c $< -o $@
# 下面指示如何生成demo程序
demo:   demo.o $(LIBS)
    $(CC) $(CFLAGS) -o $@ demo.o $(LIBS)
clean:
    rm -rf *.o ${PROGS}

include 将上级目录中的Make.defines引入进来,声明all为伪目标并且依赖demo文件,作为默认生成目标文件,伪目标好处是可以一次依赖多个文件,文件的生成可以放在下面依次生成;

%.o:%.c表示模式规则,将所有源文件名称依次对应到obj文件的文件名称,即最后生成的obj文件名(去除后缀)跟源文件名称一致。

CC表示编译器的一个变量,采用哪种类型编译器

CFLAGS表示编译器参数变量

-o表示生成目标文件

$@表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,“$@”就是匹配于 目标中模式定义的集合。

$<表示依赖目标中的第一个目标名字。如果依赖目标是以模式(即“%”)定义的,那么“$<” 将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

clean表示伪目标,由于没有依赖任何东西,因此需要通过make clean才能完成删除操作

此makefile文件最后生成demo可执行文件

未完待续。。。

你可能感兴趣的:(脚本)