一、Makefile 变量
#Makefile变量的使用
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
二、符号介绍
1、“@”
#Make 在执行的过程中会自动输出命令执行过程,在命令前面加上“@”的话就不会输出命令执行过程,
name = daliang
print:
@echo myID: $(name)
输出结果:
myID: daliang
2、“=”、“:=”、“?=”、“+=”
“=” :赋给最终的变量值,如:
name = DL
curname = $(name)
name = dalaing
print:
@echo myID: $(curname)
输出结果:
myID: daliang 而不是 myID: DL !!!
“:=”:赋给现有变量的值,如:
name = DL
curname := $(name)
name = dalaing
print:
@echo myID: $(curname)
输出结果:
myID: DL !!!
"?=":是否已被赋值,如果没有就进行赋值
name ?= Daliang
#是否name已被赋值,如果没有就赋值为Daliang
“+=”:变量追加
objects = main.o inpiut.o
objects += calcu.o
3、“%”
“%”表示长度任意的非空字符串,如:
%.c 表示所有.c文件
a.%.c表示所有以a.开头,.c结尾的文件
三、Makefile 自动化变量
1、"$@"
如果有多个目标,“$@”表示定义的目标集合。
2、"$<"
依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合。
3、"$^"
所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。
例子
例一:
objs := start.o main.o
ledc.bin:$(objs)
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
这里的 $^ 指的是所有依赖集合: start.o main.o
这里的 $@ 指的是所有目标集合:ledc.bin
例二:
%.o:%.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
这里的 $@ 指的是所有目标集合,也就是所有的 .o 文件
这里的 $< 指的是依赖文件%.s的集合
四、Makefile伪目标
.PHONY : clean
clean:
rm *.o
rm main
使用.PHONY声明 clean 为伪目标以后不管当前目录下是否存在名为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。
网友评论