当前位置:网站首页>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
边栏推荐
猜你喜欢
安装IIS服务(Internet信息服务(Internet Information Services,简写IIS,互联网信息服务)
Super handy drawing tool is recommended
PotPlayer实现上班摸鱼电视自由
typescript42-readonly修饰符
Talking about GIS Data (5) - Geographic Coordinate System
【 Harmony OS 】 【 ano UI 】 lightweight data storage
idea uses @Autowired annotation to explain the reasons and solutions
第四次培训
Build your own web page on raspberry pie (1)
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
随机推荐
信息编码、存储压缩与密码学
ss-3.工程重构
Response 重写设置返回值
详解Nurbs曲线
Get the Ip tool class
Kaggle(四)Scikit-learn
-查找数-
1. 两数之和
Js学习笔记(四)
Business table analysis - balance system
第三次HarmonyOS培训
1079 延迟的回文数 (20 分)
3. 无重复字符的最长子串
13.< tag-动态规划和回文字串>lt.647. 回文子串 + lt.516.最长回文子序列
嵌入式-I2C-物理电路图
presto安装部署教程
typescript45-接口之间的兼容性
Odps temporary query can write SQL, turned out to a named?
[Fine talk] Using native js to implement todolist
Peptides mediated PEG DSPE of phospholipids, targeted functional materials - PEG - RGD/TAT/NGR/APRPG