Makefile 入门

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值