技术

Android内核——Make脚本备忘

2015-03-30  本文已影响101人  nancymi

Make脚本的基本语法:
目标(target) : 条件(prerequest) (Tab键) 命令

执行Make脚本时,Make解释器会检查target和prerequest中包含的文件时间戳是否相同,如果不同的话,解释器就会执行Tab键后面的“命令”,命令可以是任意可执行程序。


一个简单的Makefile文件

#Filename Makefile
#this file is used for show how to use makefile
$(info start working)
hello: hello.c
    echo hello.c -o hello.bin

hello.bin: hello.c
    @echo "now make hello.bin"
    gcc hello.c -o hello.bin

.PHONY:he 
he: hello.c
    @echo "now make he"
    gcc hello.c -o hello.bin

变量的定义与赋值

Make解释器执行脚本的过程:

  1. 装载Makefile及Makefile中include的其他Makefile。
  1. 根据用户指定的target找出该target的全部依赖关系,并判断依赖条件中的时间戳。

条件控制语句

  1. 判断表达式是否相等 ifeq test/ifneq test
  2. 判断表达式是否被定义 ifdef var/ifndef var

宏(函数)定义

Make脚本中函数,按被调用的方式可分为三类:

  1. 内置函数 ~ Make解释器内部定义好的函数
    调用:$(fname, param...)

  2. 用户定义的、带参数的函数,使用define关键字进行调用
    调用:$(call fname, param)

  3. 用户定义的、不带参数的函数(宏)
    调用:$ (fname)
    用户函数的定义方式:
    define fname
    各种具体的命令
    endef
    举例:
    define showFirstName
    @echo $(1)
    endef

    .PHONY: name 
    name:
        $(call showFirstName, Nancymi, Yang)
    

执行结果:

$ make name
Nancymi


内置符号和变量

内置符号


模板目标(Pattern target)

使用一种“模板”来定义目标。
源脚本文件:

.PHONY: test
test: f21.o f2.o main.o
    gcc -o main.bin f1.o f2.o main.o

f1.o: f1.c
    gcc f1.c f1.o

f2.o: f2.c
    gcc f2.c f2.o

main.o: main.c
    gcc main.c -c main.o

使用模板目标后:

OBJ = f1.o f2.o main.o
.PHONY: test
test: $(OBJ)
    gcc $(OBJ) -o main.bin

%.o: %.c
    gcc -c -o $@ $<

目标特定的变量赋值(Target-specific variable)

CFLAGS = -c 
.PHONY: tar1
tar1:
    gcc $(CFLAGS) main.c

在以上脚本文件中,CFLAGS被赋为"-c",且对整个脚本文件有效。所以在执行Makefile tar1时,会执行gcc -c main.c.
如果在该脚本文件中另一目标想用自己特定的CFLAGS变量,可进行局部变量赋值:

tar2:CFLAGS = -c 
tar2:
    gcc $(CFLAGS) main.c

如果用户想在命令行中对变量进行赋值:$ make tar2 0e CFLAGS="-c -g".
如果Makefile文件不允许用户自己进行赋值,也就是必须强制使用Makefile文件中的赋值:

tar2: override CFLAGS = -c 
tar2:
    gcc $(CFLAGS) main.c

常用选项

不多说了,直接man make查看。

上一篇下一篇

猜你喜欢

热点阅读