Makefile学习笔记

  • Makefile思想:

一个简单的 Makefile 文件包含一系列的“规则”,其样式如下:
目标:依赖
tab+命令

例如:

test : main.c sub.c sub.h
gcc -o test main.c sub.c

如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目
标文件”。

命令被执行的 2 个条件:依赖文件比目标文件新,或是 目标文件还没生成

  • Makefile 两个函数

$(foreach var,list,text)
简单地说,就是 for each var in list, change it to text。
对 list 中的每一个元素,取出来赋给 var,然后把 var 改为 text 所描述
的形式。
例子:

objs := a.o b.o
dep_files := $(foreach f,$(objs), .$(f).d)
// dep_files := .a.o.d .b.o.d

$(wildcard pattern)
pattern 所列出的文件是否存在,把存在的文件都列出来。

src_files := $(wildcard *.c)
//src_files := 当前目录下所有.c 文件
  • make 命令使用:

执行 make 命令时,它会去当前目录下查找名为“Makefile”的文件,并根
据它的指示去执行操作,生成第一个目标
我们可以使用“-f”选项指定文件,不再使用名为“Makefile”的文件,比
如:

root@100ask:/home/book/01_all_series_quickstart/04_嵌入式Linux应用开发基础知识/source/04_test_Makefile# make -f Makefile.build 
gcc -Wp,-MD,.main.o.d  -c -o main.o  main.c
gcc -Wp,-MD,.sub.o.d  -c -o sub.o  sub.c
gcc -o test main.o sub.o
make -C a/ -f Makefile.build
-C 指定目录
make -C a/ -f Makefile.build other_target
指定目标,不在默认生成第一个目标
  • 即时变量,延时变量
A = xxx // 延时变量
B ?= xxx // 延时变量,只有第一次定义时赋值才成功;如果曾定义过,此赋值无效
C := xxx // 立即变量
D += yyy // 如果 D 在前面是延时变量,那么现在它还是延时变量;
  • Makefile 中使用shell命令
TOPDIR := $(shell pwd)
  • 假想目标
clean:
rm -f $(shell find -name "*.o")
rm -f $(TARGET)
如果当前目录下恰好有名为“clean”的文件,那么执行“make clean”时它
就不会执行那些删除命令。这时我们需要把“clean”这个目标,设置为“假想目
标”,这样可以确保执行“make clean”时那些删除命令肯定可以得到执行。
使用下面的语句把“clean”设置为假想目标:
.PHONY : clean
  • Makefile设计思想

在Makefile中想要确定编译文件,目录。“Makefile”文件总是被“Makefile.build”包含的

obj-y += main.o
obj-y += a/

Makefile.build 中设置编译规则,有 3 条编译规则:
怎么编译子目录? 进入子目录编译:

$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build

怎么编译当前目录中的文件?

%.o : %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -Wp,-MD,$(dep_file) -c -o $@ $<

当前目录下的.o 和子目录下的 built-in.o 要打包起来:

built-in.o : $(cur_objs) $(subdir_objs)
$(LD) -r -o $@ $^

顶层 Makefile 中把顶层目录的 built-in.o 链接成 APP:

$(TARGET) : built-in.o
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o

Mkefile编译流程
在这里插入图片描述

  • 特殊变量
$@、$^、$<称为自动变量。$@表示规则的目标文件名;$^表示
所有依赖的名字,名字之间用空格隔开;$<表示第一个依赖的文件名。‘%’是通
配符,它和一个字符串中任意个数的字符相匹配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值