自动生成依赖与自动删除除了指定文件外的所有文件

一、自动生成依赖(同目录)

程序包含:

代码展示:

# 定义编译器
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' ?如何使代码完美?

参考自动生成依赖 - Makefile教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值