当前位置:网站首页>Makefile 遍历子目录模板
Makefile 遍历子目录模板
2022-08-03 05:10:00 【El mundo】
文件目录结构
Makefile_study
| Makefile
| debug
| – | Makefile
| – | bin
| – | obj
| input
| – | Makefile
| – | input.c
| – | input.h
| calcul
| – | Makefile
| – | calcul.c
| – | calcul.h
| main.c
说明:
main.c 调用了 input目录下的input.c 和calcul目录下的calcul.c的函数
主 Makefile
#定义两个伪目标: clean 和 all
.PHONY:clean all
CC=gcc
INCLUDE_DIR=
C_FLAGS=
#debug文件夹里的makefile文件需要最后执行,
#所以这里需要执行的子目录要排除debug文件夹,
#这里使用awk排除了debug文件夹,读取剩下的文件夹
#SUBDIRS = calcul input
SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "debug") if($$9 != "include") print $$9}')
#记住当前工程的根目录路径
#ROOT_DIR = /Makefile_study
ROOT_DIR=$(shell pwd)
#最终bin文件的名字,可以自行命名
BIN=MYTEST
#目标文件所在的目录
OBJS_DIR=debug/obj
#bin文件所在的目录
BIN_DIR=debug/bin
#获取当前目录下的c文件集,放在变量CUR_SOURCE中
#CUR_SOURCE = main.c
CUR_SOURCE=${wildcard *.c}
#将对应的c文件名转为o文件后放在下面的CUR_OBJS变量中
#CUR_OBJS = main.o
CUR_OBJS=$(patsubst %.c, %.o, $(CUR_SOURCE))
#将以下变量导出到子shell中,本次相当于导出到子目录下的makefile中
export CC BIN OBJS_DIR BIN_DIR ROOT_DIR
#----- 以上部分是变量的定义和声明 -----#
#----- 以下部分是操作 -----#
#注意这里的顺序,需要先执行SUBDIRS, 最后才能是DEBUG
#all 是一个伪目标,这里用于构建所有的链接关系。但实际是没有 all 这个文件的,因此是伪目标。
#展开: all: calcul input main.o DEBUG
all:$(SUBDIRS) $(CUR_OBJS) DEBUG
#递归执行子目录下的makefile文件,这是递归执行的关键
#calcul input:ECHO
# make -C calcul 进入 calcul 子目录执行make
# make -C input 进入 input 子目录执行make
$(SUBDIRS):ECHO
make -C [email protected]
#进入debug 子目录执行make
#DEBUG 依赖 ECHO
DEBUG:ECHO
make -C debug
#ECHO 打印一些信息
ECHO:
@echo $(SUBDIRS)
#将c文件编译为o文件,并放在指定放置目标文件的目录中即OBJS_DIR
#main.o
# gcc -c %.c -o /Makefile_study/obj/%.o
$(CUR_OBJS):%.o:%.c
$(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected]
#伪目标: clean
#即清空 obj 和 bin 目录下的文件
clean:
rm -rf $(OBJS_DIR)/*.o
rm -rf $(BIN_DIR)/*
各级子目录Makefile
input 目录makefile
# -I:包含其他路径的Makefile
# 这里是包含 上一级目录的include目录
# 但这个例子是没有的,所以删掉也可以
INCLUDE_DIR=-I ../include
C_FLAGS=
#当前目录的子目录的Makefile通过如下指令直接读取
# 这里因为 input目录下没有子目录
# 所以SUBDIRS = 空
SUBDIRS=$(shell ls -l | grep ^d | awk '{print $$9}')
#以下同根目录下的makefile的代码相同
# 这里 CUR_SOURCE = input.c
CUR_SOURCE=$(wildcard *.c)
# 这里 CUR_OBJS = input.o
CUR_OBJS=$(patsubst %.c, %.o, $(CUR_SOURCE))
#all: input.o
all:$(SUBDIRS) $(CUR_OBJS)
# SUBDIRS :ECHO
# make -C
# -C 的意思是去 [email protected] 所指代的目录下执行make
# [email protected] 是 目标集合,即SUBDIRS; 而 SUBDIRS 为空
# 所以 [email protected] 为空
$(SUBDIRS):ECHO
make -C [email protected]
# input.o :%.o:%.c
# gcc -I../include -c input.c -o Makefile_study/obj/input.o
# 这一条命令的意思是说
# 将input.c 生成 input.o 并放置在Makefile_study/obj/目录下
$(CUR_OBJS):%.o:%.c
$(CC) $(INCLUDE_DIR) $(C_FLAGS) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected]
ECHO:
@echo $(SUBDIRS)
calcul目录makefile
# -I:包含其他路径的Makefile
# 这里是包含 上一级目录的include目录
# 但这个例子是没有的,所以删掉也可以
INCLUDE_DIR=-I ../include
C_FLAGS=
#当前目录的子目录的Makefile通过如下指令直接读取
# 这里因为 calcul 目录下没有子目录
# 所以SUBDIRS = 空
SUBDIRS=$(shell ls -l | grep ^d | awk '{print $$9}')
#以下同根目录下的makefile的代码相同
# 这里 CUR_SOURCE = calcul.c
CUR_SOURCE=$(wildcard *.c)
# 这里 CUR_OBJS = calcul.o
CUR_OBJS=$(patsubst %.c, %.o, $(CUR_SOURCE))
#all: input.o
all:$(SUBDIRS) $(CUR_OBJS)
# SUBDIRS :ECHO
# make -C
# -C 的意思是去 [email protected] 所指代的目录下执行make
# [email protected] 是 目标集合,即SUBDIRS; 而 SUBDIRS 为空
# 所以 [email protected] 为空
$(SUBDIRS):ECHO
make -C [email protected]
# calcul.o :%.o:%.c
# gcc -I../include -c calcul.c -o Makefile_study/obj/calcul.o
# 这一条命令的意思是说
# calcul.c 生成 calcul.o 并放置在Makefile_study/obj/目录下
$(CUR_OBJS):%.o:%.c
$(CC) $(INCLUDE_DIR) $(C_FLAGS) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected]
ECHO:
@echo $(SUBDIRS)
debug目录 Makefile
OBJS=*.o
ODIR=obj
# Makefile/bin/MYAPP : obj/*.o
# gcc -o /debug/bin/MYAPP /obj/calcul.o /obj/input.o /obj/main.o ;
# [email protected]:目标文件。这里是 /debug/bin/MYAPP
# $^: 依赖文件。这里是 Makefile/obj/下的所有.o
# 即main.o input.o 和 calcul.o
$(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ODIR)/$(OBJS)
$(CC) -o [email protected] $^
make结果
黄色底纹是执行 make 之后生产的文件。
debug/bin/MYAPP是可执行文件,亦是我们的最终目标文件。
Makefile_study
| Makefile
| debug
| – | Makefile
| – | bin
| – | – | MYAPP
| – | obj
| – | – | main.o
| – | – | input.o
| – | – | calcul.o
| input
| – | Makefile
| – | input.c
| – | input.h
| calcul
| – | Makefile
| – | calcul.c
| – | calcul.h
| main.c
边栏推荐
猜你喜欢
在树莓派上搭建属于自己的网页(1)
Exception (abnormal) and Error (error) difference analysis
13.
lt.647. Palindromic substring + lt.516. Longest palindrome subsequence 嵌入式-I2C-物理电路图
13.< tag-动态规划和回文字串>lt.647. 回文子串 + lt.516.最长回文子序列
Djiango第四次培训笔记
Harmony OS Date ano UI 】 【 】 the basic operation
shell脚本循环语句
breed Web刷机升级详细教材修正编译器固件说明_itkeji.top
typescript43-类型兼容性说明
随机推荐
【特征选取】计算数据点曲率
Kaggle(四)Scikit-learn
web安全-命令执行漏洞
轨迹(形状)相似性判断与度量方法
Common fluorescent dyes to modify a variety of groups and its excitation and emission wavelength data in the data
Djiango第四次培训笔记
User password verification
背压机制
FileZilla 搭建ftp服务器
1.ROS环境搭建与基础工作
第三次HarmonyOS培训
dataframe插入一列
Peptides mediated PEG DSPE of phospholipids, targeted functional materials - PEG - RGD/TAT/NGR/APRPG
阿凡提的难题
flask 面试题 问题
Ali cloud object storage oss private barrels to generate links
typescript47-函数之间的类型兼容性
User password encryption tool
Exception (abnormal) and Error (error) difference analysis
2022暑假牛客多校联赛第一场