目录¶
简单的makefile¶
CROSS_COMPILE=/opt/4.5.1/bin/arm-linux-
CC=$(CROSS_COMPILE)gcc
AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
CFLAGS=-g -Wall
LIBS=-lpthread
all:main
main:main.o gsm_gprs.o socket.o telosb.o wifi.o
$(CC) $(CFLAGS) $(LIBS) $^ -o $@
main.o: main.c gsm_gprs.h option.h telosb.h
$(CC) $(CFLAGS) -c $<
gsm_gprs.o:gsm_gprs.c gsm_gprs.h socket.h
$(CC) $(CFLAGS) -c $<
socket.o:socket.c socket.h option.h
$(CC) $(CFLAGS) -c $<
telosb.o: telosb.c telosb.h option.h
$(CC) $(CFLAGS) -c $<
wifi.o: wifi.c wifi.h option.h
$(CC) $(CFLAGS) -c $<
clean:
-rm main -f *\.o *\*~ *~
makefile赋值¶
赋值 | 说明 |
---|---|
= | 基本的赋值 会在makefile的最后才赋值 |
:= | 覆盖之前的值 会立即赋值 |
?= | 如果没有赋值过就赋值 |
+= | 添加后面的值 |
.PHONY : clean¶
伪目标
make命令默认支持的文件名¶
make指令如果没有指定具体的makefile文件,就会自动寻找如下的makefile文件
GNUmakefile | makefile | Makefile |
include¶
makefile包含
-include¶
makefile包含,当include过程中出现错误,不报错继续执行
MAKEFILES¶
make会自动include这个环境变量中的值
VPATH¶
指定makefile文件搜寻路径
vpath¶
make 关键词 设置文件搜寻路径
Makefile内建函数¶
文本处理和分析函数¶
替换¶
模式替换¶
可用%(只用第一个%有用),如
$(patsubst %.c,%.o,x.c.c bar.c)
,结果‘x.c.o bar.o’
去掉文本两端空格,以及把2个和2个以上的空格换成一个¶
查找¶
过滤¶
只保留pattern部分
过滤掉¶
不保留pattern部分
排序¶
取字符串¶
取字符串列表¶
第s(start)个到第e(end)个
取第一个¶
取最后一个¶
文件名处理函数¶
取目录¶
取文件¶
但并不完全正确,注意观察,因为这个原理是已斜杠“/”为标识符的,如果文件名中包含斜杠,则返回的文件名就有误
取文件后缀¶
取文件名¶
包括前面的目录部分,如
$(basename src/foo.c src-1.0/bar hacks)
, 结果为src/foo src-1.0/bar hacks
添加后缀¶
example :
$(addprefix src/,foo bar)
,produces the result‘src/foo src/bar’
连接函数¶
example: ‘$(join a b,.c .o)’ produces ‘a.c b.o’.
通配符函数¶
表示可以使用正则表达式的符号。The argument pattern is a file name pattern, typically containing wildcard characters (as in shell file name patterns). The result of wildcard is a space-separated list of the names of existing files that match the pattern
真实路径¶
绝对路径¶
foreach函数¶
$(foreach var,list,text)
相当于for循环函数,不过最终这里返回的是text的值,这个值是循环得到的一个list,如
find_files = $(wildcard $(dir)/*) #“=”等号是延时加载(deferred)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))
if函数¶
call函数¶
“call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以 实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“call” 函数根据不同的参数对它进行展开来获得不同的结果。如:reverse = $(2) $(1) foo = $(call reverse,a,b)
foo will contain ‘b a
value函数¶
The result of this function is a string containing the value of variable, without any expansion occurring. For example, in this makefile: The first output line would be ATH, since the$P
would be expanded as a make variable, while the second output line would be the current value of your $PATH environment variable, since the value function avoided the expansion. realpath¶
获取绝对路径wildcard¶
根据通配符获取列表