您的位置:首页 > 其它

变量与函数的综合示例

2018-02-28 17:27 344 查看

1、实战需求

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

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

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

(4)考虑代码的扩展性。

2、工具原料

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

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

3、关键技巧

1、 自动获取当前目录下的源文件列表(函数调用) ;

2、根据源文件列表生成目标文件列表(变量的值替换) ;

3、对每一个目标文件列表加上路径前缀(函数调用) 。

4、编译规则的依赖(important!)



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
# main.c const.c func.c
SRCS := $(wildcard *.c)
# main.o const.o func.o
OBJS := $(SRCS:.c=.o)
# objs/main.o objs/const.o objs/func.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实战时不可或缺的部分;

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

- 可以使用命令行变量编译特殊的目标版本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: