Makefile编译各个⼦⽬录下的Makefile⽂件
⾸先说说本次嵌套执⾏makefile⽂件的⽬的:只需make根⽬录下的makefile⽂件,即可编译所有c⽂件,包括⼦⽬录下的。
意义:⾃动化编译⾏为,以后编译⾃⼰的c⽂件时可把这些makefile⽂件直接复制到相应⽬录即可⽅便编译出所有⽂件。这些makefile⽂件是通⽤的,只需根据⾃⼰的⼯程情况改动少许内容即可。下⾯会说。
总体思路是:把⽬标⽂件放在debug⽂件夹下的obj⽬录下,把最终的⼆进制⽂件放在debug⽂件夹下的bin⽬录下;如何递归编译所有除了debug⽬录下的makefile⽂件呢:获得当前⽬录下的所有⼦⽬录,执⾏⼦⽬录下的makefile⽂件;获取当前⽬录下的所有c⽂件,编译c⽂件并放到指定的⽬标⽂件夹下。最后再执⾏debug⽬录下的makefile⽂件⽣成bin⽂件。
注意:除了debug⽂件夹⽐较特殊外,其他的⼦⽬录下都需要有Makefile⽂件,⽽且这些Makefile是相同的,除了根⽬录下的makefile⽂件有些不同外。即除了bin和obj⽬录以外的其他⽬录都需要Makefile⽂件,即使⽬录下没有c⽂件或者其他⽬录。
makefile phony具体demo,需要审核后有链接()
先看⼀下⼤概的⽬录结构:
然后是最外层的Makefile
#设置编译器
.
PHONY:clean all
CC=gcc
INCLUDE_DIR=
C_FLAGS=
#debug⽂件夹⾥的makefile⽂件需要最后执⾏,所以这⾥需要执⾏的⼦⽬录要排除debug⽂件夹,这⾥使⽤awk排除了debug⽂件夹,读取剩下的⽂件夹SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "debug") if($$9 != "include") print $$9}')
#⽆需下⼀⾏的注释代码,因为我们已经知道debug⾥的makefile是最后执⾏的,所以最后直接去debug⽬录下执⾏指定的makefile⽂件就⾏,具体下⾯有注释#DEBUG=$(shell ls -l | grep ^d | awk '{if($$9 == "debug") print $$9}')
#记住当前⼯程的根⽬录路径
ROOT_DIR=$(shell pwd)
#最终bin⽂件的名字,可以更改为⾃⼰需要的
BIN=myapp
#⽬标⽂件所在的⽬录
OBJS_DIR=debug/obj
#bin⽂件所在的⽬录
BIN_DIR=debug/bin
#获取当前⽬录下的c⽂件集,放在变量CUR_SOURCE中
CUR_SOURCE=${wildcard *.c}
#将对应的c⽂件名转为o⽂件后放在下⾯的CUR_OBJS变量中
CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}
#将以下变量导出到⼦shell中,本次相当于导出到⼦⽬录下的makefile中
export CC BIN OBJS_DIR BIN_DIR ROOT_DIR
#注意这⾥的顺序,需要先执⾏SUBDIRS最后才能是DEBUG
all:$(SUBDIRS) $(CUR_OBJS) DEBUG
#递归执⾏⼦⽬录下的makefile⽂件,这是递归执⾏的关键
$(SUBDIRS):ECHO
make -C $@
DEBUG:ECHO
#直接去debug⽬录下执⾏makefile⽂件
make -C debug
ECHO:
@echo $(SUBDIRS)
#将c⽂件编译为o⽂件,并放在指定放置⽬标⽂件的⽬录中即OBJS_DIR
$(CUR_OBJS):%.o:%.c
$(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
clean:
rm -rf $(OBJS_DIR)/*.o
rm -rf $(BIN_DIR)/*
debug⽬录下的Makefile⽂件如下:
OBJS=*.o
ODIR=obj
$(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ODIR)/$(OBJS)
$(CC) -o $@ $^
其余的是⼦⽬录的Makefile,我这⾥是⼀个通⽤的,具体看各位同学的实际情况添加内容:
INCLUDE_DIR=-I../include
C_FLAGS=
#⼦⽬录的Makefile直接读取其⼦⽬录就⾏
SUBDIRS=$(shell ls -l | grep ^d | awk '{print $$9}')
#以下同根⽬录下的makefile的相同代码的解释
CUR_SOURCE=${wildcard *.c}
CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}
all:$(SUBDIRS) $(CUR_OBJS)
$(SUBDIRS):ECHO
make -C $@
$(CUR_OBJS):%.o:%.c
$(CC) $(INCLUDE_DIR) $(C_FLAGS) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@ ECHO:
@echo $(SUBDIRS)
最后给看⼀下编译的效果:
看⼀下执⾏的结果:
程序正常执⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论