获取项目中所有makefile文件

#!/bin/bash
# 说明在DIVISON目录下执行,用于获取所有makefile文件,结果会按原目录结构保存

function back_makes
{
	# 删除残留makes目录
	rm -rf makes/
	
	local MAKS=`find . -type f -name "*.mak"`
	local MAKS="${MAKS} `find . -type f -name "[mM]ake[fF]ile"`"
	for f in $MAKS
	do
		# find得到的文件可能是绝对路径,此时删头去尾得到中间路径
		tempf=${f%/*} && tempf=${tempf#*/}
		# 在本目录下新建目录保存搜索结果
		tempdir=makes/$tempf
		mkdir -p $tempdir
		cp -rf $f $tempdir/
	done
	
	return 0
}

# 调用函数
back_makes

 

<think> 我们正在讨论Makefile中如何获取文件夹的所有文件。 根据用户的问题,他需要知道在Makefile中如何获取一个文件夹下的所有文件(可能是特定模式的文件,也可能是所有文件)。 在Makefile中,常用的方法是使用通配符函数(wildcard)或者shell命令来获取文件列表。 我们可以考虑以下方法: 1. 使用Makefile内置的wildcard函数 2. 使用shell命令(通过调用shell函数) 例如,获取当前目录下所有的.c文件: SRCS := $(wildcard *.c) 或者获取某个子目录(比如src目录)下的所有.c文件: SRCS := $(wildcard src/*.c) 如果用户需要递归获取所有子目录下的文件,可以使用find命令(通过shell函数): SRCS := $(shell find src -name '*.c') 注意:使用shell命令可能会降低Makefile的解析速度,尤其是在大型项目中,因为它会展开所有匹配的文件。 另外,如果用户想要获取所有文件(不限定扩展名),则可以使用: FILES := $(wildcard *) # 当前目录所有文件(不包括隐藏文件和子目录) FILES := $(wildcard *.*) # 当前目录所有带扩展名的文件(不包括隐藏文件和子目录) # 或者递归 FILES := $(shell find . -type f) # 递归获取当前目录及子目录的所有普通文件 我们可以根据用户的具体需求提供不同的方法。 由于用户没有指定是获取当前目录还是子目录,也没有指定文件模式,我们可以提供几种常见的情况。 另外,在Makefile中使用这些文件列表时,要注意赋值时机(例如使用:=立即赋值,避免多次执行通配符展开)。 现在,我们来组织回答: </think> 在 Makefile获取文件夹的所有文件,主要通过通配符函数 `$(wildcard)` 或 Shell 命令实现。以下是具体方法和示例: ### 1. 使用 **`wildcard` 函数**(推荐) ```makefile # 获取当前目录所有文件(不包括子目录) FILES := $(wildcard *) # 获取指定目录的特定类型文件(如所有.c文件) SRC_FILES := $(wildcard src/*.c) ``` ### 2. 使用 **Shell 命令**(支持递归查找) ```makefile # 递归获取目录及子目录所有文件 ALL_FILES := $(shell find src/ -type f) # 获取当前目录所有文件(含隐藏文件) ALL_FILES := $(shell ls -a) ``` ### 完整示例 ```makefile # 获取src目录所有.c文件 SOURCES := $(wildcard src/*.c) # 将.c替换为.o生成目标文件列表 OBJECTS := $(SOURCES:.c=.o) # 编译规则 build: $(OBJECTS) @echo "构建完成" %.o: %.c $(CC) -c $< -o $@ # 打印文件列表 list: @echo "源文件: $(SOURCES)" @echo "目标文件: $(OBJECTS)" ``` ### 注意事项 1. **通配符限制** `$(wildcard)` 不支持递归查找子目录,需配合 `find` 命令实现递归 ```makefile # 错误:wildcard无法递归 $(wildcard src/**/*.c) # 正确:使用find递归 $(shell find src -name '*.c') ``` 2. **空格处理** 文件名含空格时需用引号包裹: ```makefile FILES := $(shell find . -name "*.txt" -print0 | xargs -0) ``` 3. **赋值时机** 使用 `:=` 立即展开变量,避免重复执行通配符[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值