当前位置:网站首页>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
边栏推荐
猜你喜欢

UV decomposition of biotin - PEG2 - azide | CAS: 1192802-98-4 biotin connectors

曲线特征----曲线弯曲程度的探究

【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed

VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具

Shell conditional statement judgment

Installation of Apache DolphinScheduler version 2.0.5 distributed cluster

深度学习入门之GRU

Flask的简单介绍及使用方法简介

junit总结

嵌入式-I2C-物理电路图
随机推荐
flask 面试题 问题
Harmony OS ets ArkUI 】 【 】 the development basic page layout and data connection
UV decomposition of biotin - PEG2 - azide | CAS: 1192802-98-4 biotin connectors
typescript45-接口之间的兼容性
mysql 存储过程 动态参数 查询执行结果
Exception(异常) 和 Error(错误)区别解析
Install IIS services (Internet Information Services (Internet Information Services, abbreviated IIS, Internet Information Services)
1079 延迟的回文数 (20 分)
Talking about GIS Data (6) - Projected Coordinate System
轨迹(形状)相似性判断与度量方法
Alienware上线首个数字时装AR试穿体验
1089 狼人杀-简单版 (20 分)
数据分析 第一篇
dataframe插入一列
ss-2.子项目互相访问(order80 -> payment8001)
js implements a bind function
高效率科研神器——小软件、大能量
1095 解码PAT准考证 (25 分)(C语言)
JS学习笔记(三)
Modified BiotinDIAZO-Biotin-PEG3-DBCO|diazo-biotin-tripolyethylene glycol-diphenylcyclooctyne