makefile


makefile中的自动变量:

变量含义

$*

表示目标文件的名称,不包含目标文件的扩展名

$+

表示所有的依赖文件,这些依赖文件之间用空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件

$<

表示依赖项中第一个依赖文件的名称

$?

依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开

$@

目标项中目标文件的名称

$^

依赖项中,所有不重复的依赖文件,这些文件之间以空格分开

 

Makefile的函数:

1、获取匹配模式的文件名wildcard

例:$(wildcard *.c) 返回当前目录下所有扩展名为.c的文件列表

2、模式替换函数patsubst

例: $(patsubst %.c, %.o, $(wildcard *.c)) 将wildcard获取的文件列表中所有的.c文件名替换成.o的文件列表。

3、循环函数foreach

$(foreach VAR, LIST, TEXT) 将LIST字符串中的一个空格分隔的单词,先传给临时变量VAR, 然后执行TEXT表达式,TEXT表达式处理结束后输出,其返回值是空格分隔表达式TEXT的计算结果。

一个简单的makefile例子

CC = gcc
CFLAGS = -Iinclude -O2
TARGET = test
RM = rm -f

OBJS = xx1.o xx2.o dir/xx3.o

$(TARGET): $(OBJS)
	$(CC) $@ -o $^ $(CFLAGS)
$(OBJS): %.o:%.c
	$(CC) $< -c $(CFLAGS) -o $@

clean:
	-$(RM) $(TARGET) $(OBJS)
注:- 号表示当操作失败时不报错,命令继续执行



 

Makefile嵌套使用:
1、 总控Makefile

CC = gcc
CFLAGS = -O2
RM = rm -f
TARGET = test
export OBJSDIR = $(shell pwd)/.ojbs   (传递变量给下层Makefile)

$(TARGET): $(OBJSDIR) main.o
	$(MAKE) -C dir1    (在目录dir1中调用make)
	$(MAKE) -C dir2    (在目录dir2中调用make)
	$(CC) -o $(TARGET) $(OBJSDIR)/*.o

main.o: %.o:%.c
	$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iinclude

$(OBJSDIR):
	mkdir -p $(OBJSDIR)
clean:
	-$(RM) $(TARGET)
	-$(RM) $(OBJSDIR)/*.o

2、 子目录Makefile

all: $(OBJS)
$(OBJS):%.c:%.o
	$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)  (CC和OBJSDIR在总控Makefile中声明)
clean:
	$(RM) $(OBJS)


 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值