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的最后才赋值 |
:= |
覆盖之前的值 会立即赋值 |
?= |
如果没有赋值过就赋值 |
+= |
添加后面的值 |
伪目标
make指令如果没有指定具体的makefile文件,就会自动寻找如下的makefile文件
GNUmakefile | makefile | Makefile |
makefile包含
makefile包含,当include过程中出现错误,不报错继续执行
make会自动include这个环境变量中的值
指定makefile文件搜寻路径
make 关键词 设置文件搜寻路径
$(subst from,to,text)
可用%(只用第一个%有用),如
$(patsubst %.c,%.o,x.c.c bar.c)
,结果‘x.c.o bar.o’
$(patsubst pattern,replacement,text)
$(strip string)
$(findstring find,in)
只保留pattern部分
$(filter pattern…,text)
不保留pattern部分
$(filter-out pattern…,text)
$(sort list)
$(word n,text)
第s(start)个到第e(end)个
$(wordlist s,e,text)
# $(words text) Returns the number of words in text. Thus, the last word of text is $(word $(words text),text).
$(firstword names…)
$(lastword names…)
$(dir names…)
但并不完全正确,注意观察,因为这个原理是已斜杠“/”为标识符的,如果文件名中包含斜杠,则返回的文件名就有误
$(notdir names…)
$(suffix names…)
包括前面的目录部分,如
$(basename src/foo.c src-1.0/bar hacks)
, 结果为src/foo src-1.0/bar hacks
$(basename names…)
example :
$(addprefix src/,foo bar)
,produces the result‘src/foo src/bar’
$(addsuffix suffix,names…)
example: ‘$(join a b,.c .o)’ produces ‘a.c b.o’.
$(join list1,list2)
表示可以使用正则表达式的符号。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
$(wildcard pattern)
$(realpath names…)
$(abspath names…)
$(foreach var,list,text)
相当于for循环函数,不过最终这里返回的是text的值,这个值是循环得到的一个list,如
find_files = $(wildcard $(dir)/*) #“=”等号是延时加载(deferred)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))
即
files := $(wildcard a/* b/* c/* d/*)
ifeq (arg1, arg2)
ifneq (arg1, arg2)
ifdef variable-name
ifndef variable-name
$(call VARIABLE,PARAM,PARAM,...)
“call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以 实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“call” 函数根据不同的参数对它进行展开来获得不同的结果。
如:reverse = $(2) $(1) foo = $(call reverse,a,b)
foo will contain ‘b a
$(value variable)
The result of this function is a string containing the value of variable, without any expansion occurring. For example, in this makefile:
FOO = $PATH
all:
@echo $(FOO)
@echo $(value FOO)
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 ../../)
获取绝对路径
根据通配符获取列表
src = $(wildcard *.c)
$(origin variable)
获取变量的属性值,如下几个
- undefined 变量“VARIABLE”没有被定义。
- default 变量“VARIABLE”是一个默认定义(内嵌变量)。如“CC”、“MAKE”、“RM”等变 量。如果在 Makefile 中重新定义这些变量,函数返回值将相应发生变化
- environment 变量“VARIABLE”是一个系统环境变量,并且 make 没有使用命令行选项“-e” (Makefile 中不存在同名的变量定义,此变量没有被替代)。
- environment override 变量“VARIABLE”是一个系统环境变量,并且 make 使用了命令行选项“-e”。 Makefile 中存在一个同名的变量定义,使用“make -e”时环境变量值替代了文 件中的变量定义。
- file 变量“VARIABLE”在某一个 makefile 文件中定义。
- command line 变量“VARIABLE”在命令行中定义。
- override 变量“VARIABLE”在 makefile 文件中定义并使用“override”指示符声明。
- automatic 变量“VARIABLE”是自动化变量。
contents := $(shell cat foo)
files := $(shell echo *.c)
$(info text) #打印log
$(warning text) #和 error 一样,但是 产生致命错误退出
$(error text) #产生致命错误,并提示“text”信息给用户,并退出 make 的执行