您的位置:首页 > 其它

makefile专题:变量与函数的综合示例

2018-02-08 22:17 441 查看

1. 实战需求

1)自动生成target文件夹存放可执行文件

2)自动生成objs文件夹存放编译生成的目标文件(* .o)

3)支持调试版本的编译选项

4)考虑代码的扩展性

2. 工具原料

$(wildcard_parrern)
获取当前工作目录中满足
_pattern
的文件或目录列表


$(addprefix _prefix, _names)
给名字列表
_names
中的每一个名字增加前缀
_prefix


3. 关键技巧

自动获取当前目录下的源文件列表(函数调用):
SRCS := $(wildcard *.c)


根据源文件列表生成目标文件列表(变量的值替换):
OBJS := $(SRCS:.c=.o)


对每一个目标文件列表加上路径前缀(函数调用):
OBJS := $(addprefix path/, $(OBJS))


4. 规则中的模式替换(目录结构)



### 5. 编译规则的依赖



CC := gcc
MKDIR := mkdir
RM := rm -fr

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))

.PHONY : rebuild clean all

$(TARGET) : $(DIRS) $(OBJS)
$(CC) -o $@ $(OBJS)
@echo "Target File ==> $@"

$(DIRS) :
$(MKDIR) $@

$(DIR_OBJS)/%.o : %.c
ifeq ($(DEBUG),true)
$(CC) -o $@ -g -c $^
else
$(CC) -o $@ -c $^
endif

rebuild : clean all

all : $(TARGET)

clean :
$(RM) $(DIRS)


6. 小结

目录可以成为目标的依赖,在规则中创建目录

预定义函数是makefile实战时不可或缺的部分

规则中的模式匹配可以直接针对目录中的文件

可以使用命令行变量编译特殊的目标版本(如DEBUG版)

声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件《专业嵌入式软件开发》所有!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: