Makefile编程

Makefile规则

Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,

格式:

1
2
3
4
target... : prerequisites...	#目标……: 依赖文件集合……				
command #命令 1
... #命令 2
... #命令 3

1️⃣target就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。

2️⃣prerequisites就是,要生成那个target所需要的文件或是目标。target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command

3️⃣command也就是make需要执行的命令。(任意的Shell命令)

4️⃣==命令列表中的每条命令必须以TAB键开始,不能使用空格==,否则会报错!!!

例子:

1

**注释:**注释用“#”字符,如需使用

**换行:**反斜杠(\)是换行符的意思

Makefile变量

命名规则:

  • 变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不能包括“:”、“#”、“=”或是空字符(空格、回车等)

  • 变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。

变量的定义:

  • 使用“:=”操作符
    • 特点:这个定义方法只能使用该变量定义之前已经定义好的变量,但是不能使用之后定义的变量。
    • 例子:x := foo/ y := $(x) bar/ x := later

变量的使用:

  • ==变量在声明时需要给予初值==
  • 使用时,需要给在变量名前加上“$”符号,但最好**用小括号“()”**或是大括号“{}”把变量给包括起来,例如:$(FOO)

追加变量值:

  • +=”操作符给变量追加值

    1
    2
    3
    objects = main.o foo.o bar.o utils.o
    objects += another.o
    #$(objects)值变成:“main.o foo.o bar.o utils.o another.o”(

i.mx6ull开发板Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
KERNELDIR := /home/arm-linux/MX6U/linux-core
CURRENT_PATH := $(shell pwd)
INSTALL_PATH := /home/arm-linux/MX6U/nfs/rootfs/lib/modules/4.1.15
obj-m := keydrv.o

build: kernel_modules

kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
install:
sudo cp *.ko keyapp $(INSTALL_PATH)
help:
@echo "可用目标:"
@echo " build - 编译模块(默认)"
@echo " clean - 清理编译文件"
@echo " install - 安装模块到目标系统"