1、
Makefile由一组规则(Rule)组成,每条规则的格式是:
target ... : prerequisites ...
command1
command2
...
2、
make的隐含规则数据库可以用make -p命令打印,打印出来的格式也是Makefile的格式,包括很多变量和规则。
# default
OUTPUT_OPTION = -o $@
# default
CC = cc
# default
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
%.o: %.c是一种特殊的规则,称为模式规则(Pattern Rule)
src/%.o: ../src/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
@echo 'Finished building: $<'
@echo ' '
替换后:
Building file: ../src/testc.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/testc.d" -MT"src/testc.d" -o"src/testc.o" "../src/testc.c"
Finished building: ../src/testc.c
3、
对于多目标的规则,make会拆成几条单目标的规则来处理,例如:
target1 target2: prerequisite1 prerequisite2
command $< -o $@
这样一条规则相当于:
target1: prerequisite1 prerequisite2
command prerequisite1 -o target1
target2: prerequisite1 prerequisite2
command prerequisite1 -o target2
4、变量使用
foo = $(bar)
bar = hello
all:
@echo $(foo)
当make读到foo = $(bar)时,确定foo的值是$(bar),但并不立即展开$(bar),然后读到bar = hello,确定bar的值是hello,
然后在执行规则all:的命令列表时才需要展开$(foo),得到$(bar),再展开$(bar),得到hello
x := foo
y := $(x) bar
all:
@echo "-$(y)-"
当make读到y := $(x) bar定义时,立即把$(x)展开,使变量y的取值是foo bar。
+=运算符可以给变量追加值,例如:
objects = main.o
+=保存赋值特性,=或:=。
5、常用的特殊变量有:
$@,表示规则中的目标。
$<,表示规则中的第一个条件。
$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
$^,表示规则中的所有条件,组成一个列表,以空格分隔。
6、默认变量:
AR 静态库打包命令的名字,缺省值是ar。
ARFLAGS 静态库打包命令的选项,缺省值是rv。
AS 汇编器的名字,缺省值是as。
ASFLAGS 汇编器的选项,没有定义。
CC C编译器的名字,缺省值是cc。
CFLAGS C编译器的选项,没有定义。
CXX C++编译器的名字,缺省值是g++。
CXXFLAGS C++编译器的选项,没有定义。
CPP C预处理器的名字,缺省值是$(CC) -E。
CPPFLAGS C预处理器的选项,没有定义。
LD 链接器的名字,缺省值是ld。
LDFLAGS 链接器的选项,没有定义。
TARGET_ARCH 和目标平台相关的命令行选项,没有定义。
OUTPUT_OPTION 输出的命令行选项,缺省值是-o $@。
LINK.o 把.o文件链接在一起的命令行,缺省值是$(CC) $(LDFLAGS) $(TARGET_ARCH)。
LINK.c 把.c文件链接在一起的命令行,缺省值是$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)。
LINK.cc 把.cc文件(C++源文件)链接在一起的命令行,缺省值是$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)。
COMPILE.c 编译.c文件的命令行,缺省值是$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c。
COMPILE.cc 编译.cc文件的命令行,缺省值是$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c。
RM 删除命令的名字,缺省值是rm -f。
7、gcc -M;gcc -MM
自动生存依赖条件,见2中的例子。
8、引入文件
sources = main.c file1.c file2.c
include $(sources:.c=.d),这一句相当于:
include main.d file1.d file2.d
Makefile 入门
最新推荐文章于 2023-03-20 14:59:10 发布