一、如何使用make命令
1、make
根据缺省文件Makefile或makefile执行make命令,生成makefile中第一个定义的目标。
2、make target
根据缺省文件Makefile或makefile执行make命令,生成makefile中目标名为target的目标。
3、make target1 target2 ...
根据缺省文件Makefile或makefile执行make命令,生成makefile中目标名为target1、target2 ...的目标。(要注意次序)
4、make -f Rule.make
根据文件Rule.make执行make命令,生成Rule.make中第一个定义的目标。
二、makefile语法
1、include,-include(sinclude)
include:包含头文件,如果头文件不存在将会有错误提示。
-include(sinclude:GNU支持sinclude代替-include):包含头文件,如果头文件不存在则不会错误提示。
2、.PHONY
.PHONY : clean
申明 clean是伪目标.
主要防止如果当前目录中,正好有一个文件叫做clean,以至于执行make clean不能得到想要的动作。
3、#
注释符号
4、echo
显示
5、@
不显示当前命令行,makefile执行时如果命令前不加@,则会显示这条命令。
6、通配符
(1)、* :rm -f *.o
(2)、?
(3)、~
(4)、[...]
7、%
%.o:%.c
表示的有一系列的规则,规则的个数等于当前目录下.c文件的个数,而每个规则的
目标都是以一个.c文件的文件名去掉c加上o构成,前提条件为该.c文件名
8、$@
规则中目标的名字
9、$<
规则中第一个前提条件的名字
10、$^
规则中所有的前提条件的名字
11、变量及赋值
(1)= 变量的值在执行时赋
VARIABLE = value
(2):= 变量的值在定义时赋
VARIABLE := value
(3)?= 只有在该变量为空时才赋值
VARIABLE ?= value
(4) += 将值追加到变量的尾端
VARIABLE += value
12、export
声明变量外部可使用
13、字符串替换函数
格式:$(patsubst<pattern>,<replacement>,<text>)
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,
则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中
也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。
(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
例子:
$(patsubst %.c,%.o, test.c bar.c)
把字串”test.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是”test.o bar.o”(2)tsubst
格式:$(subst <from>,<to>,<text>)
名称:字符串替换函数——subst。
功能:把字串<text>中的<from>字符串替换成<to>。
返回:函数返回被替换过后的字符串。
例子:
$(subst hello, hi, hello world !!!)
把字串“helloworld !!!”中的”hello”替换成”hi”,返回结果是”hi world !!!”
(14)、条件
ifeq(arg1,arg2)/ifneq(arg1, arg2)
…
else
…
endif三、makefile规则
1、基本规则
target : prerequisites
[tab] recipe
target : 目标,通常是输出文件名(可以是多个),也可以是某个特定操作的名字(伪目标)。
prerequisites :前提条件,通常是文件名,是用于创建目标的输入文件,可以理解为依赖关系,也就是说这里列出的文件没有发生变化时要执行相应的动作, 不然要去找被改变的文件对应的依赖关系,然后再执行相应的动作。
recipe :动作,可以没有,可以是多条命令,前面必须加tab,另外每一行对应一个动作(一条shell命令)。
例子:
test : test1.o test2.o
[tab] gcc -o test test1.o test2.o
test1.o: test1.c test.h
[tab] gcc -c test1.c
test2.o: test2.c
[tab] gcc -c test2.c
clean:
[tab] rm -f test test1.o test2.o
2、静态模式规则
targets …: target-pattern: prereq-patterns …
[tab] recipe
[tab] …
targets :目标
target-pattern:目标的模式
prereq-patterns:前提条件的模式
recipe :命令
例子
objects = test1.o test2.o
all: $(objects)
$(objects): %.o: %.c
[tab] $(CC) -c$(CFLAGS) $< -o $@
3、隐含规则
例子:没有recipe
test.o: test.c
编译按照隐含规则来
C语言编译规则:
test.o:test.c
$(CC)$(CPPFLAGS) $(CFLAGS) -c $< -o $@
C++编译规则:
test.o:test.cc
或
test.o:test.cpp
$(CXX)$(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
当然还有很多其他语言的隐含规则,这里就不细展开了,总之看到一个规则没有相应的动作也没有看到依赖关系,就要注意隐含规则了,另外,隐含规则是和make相关的,不同版本的make是有差异的。
4、进入子目录里make
subsystem:
[tab] cd subdir&& make
或者
subsystem:
[tab] make -C subdir
例子:
SUBDIRS = $(BASEDIR)/$(SUBPDIR1) $(BASEDIR)/$(SUBPDIR2)
all: $(SUBDIRS)
[tab] @for i in$(SUBDIRS); do make -C $$i || exit; done
要注意上面必须是一行, 使用;分开多个命令