一、自动生成依赖(同目录)
程序包含:
代码展示:
# 定义编译器
CC := gcc
# 定义编译选项
CFLAGS := -Wall -I./include
# 定义链接选项
LDFLAGS := -L./lib
# 定义目标文件的搜索路径
VPATH := ./
# 定义所有源文件
SRCS := $(wildcard $(VPATH)/*.c)
# 从源文件生成对象文件
OBJS := $(patsubst %.c,%.o,$(SRCS))
# 定义最终的可执行文件
TARGET := app
# 默认目标
all: $(TARGET)
# 链接目标
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
# 模式规则:从 .c 文件生成 .o 文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 模式规则:从 .c 文件生成 .d 文件
%.d: %.c
@set -e;
rm -f $@;
$(CC) -M $(CFLAGS) $< > $@.tmp;
# makefile的sed指令,s,g代表全局替换,逗号为分隔符,这句所有反斜杠均为转义(规范安全作用)
# $*代表%.o 的%与.o共同指代所有.o文件,[ :]*代指所有.o文件后的空格与冒号
# \1.o代指该句前面代指的第一个元素,即所有.o文件
# 这句意思为将文件main.tmp中的文本 main.o: 替换成 main.o main.d : 并放入文件main.d
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@;
rm -f $@.tmp
# 包含所有 .d 文件以获取依赖
-include $(OBJS:.o=.d)
# 清理编译生成的文件
clean:
rm -f $(OBJS) $(TARGET) $(OBJS:.o=.d)
# 伪目标,确保 make 按顺序执行
.PHONY: all clean
make后修改的依赖文件ma.d内容展示:
效果展示(修改头文件,更新机制依旧触发):
二、自动删除除了指定文件外的所有文件
代码展示(不完美):
# 定义要保留的文件
KEEP_FILE = hello.c Makefile
#sed匹配任意数量的任意字符(.)直到遇到第一个斜杠(/)
#作用是从每个行中删除从行首到第一个斜杠之前的所有内容,通常用于去除文件路径,只保留文件名
DEL_FILE = $(shell find . -type f | sed 's|.*/||' | grep -v 'hello.c' | grep -v 'Makefile')
# 默认目标
all:
@echo "This Makefile will delete all files except $(KEEP_FILE)"
@echo "$(DEL_FILE)"
# 清理所有文件,除了指定的文件
clean:
rm -f $(DEL_FILE)
# 伪目标,确保 make 按顺序执行
.PHONY: all clean
效果展示(保留hello.c和Makefile):
三、问题
如何进行多目录自动查找、自动生成依赖的编译?
为什么上述自动删除除了指定文件外的所有文件的代码没能删除'新建 'DOC Document.doc' 和 '新建 PPT Presentation.ppt' ?如何使代码完美?