博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile 10——打造更专业的编译环境-huge项目
阅读量:7104 次
发布时间:2019-06-28

本文共 4208 字,大约阅读时间需要 14 分钟。

先手工创建几个文件目录:

接下来先创建code/foo/src目录下的Makefile:

 

1 .PHONY: all clean 2  3 MKDIR = mkdir 4 RM = rm 5 RMFLAGS = -rf 6  7 CC =gcc 8 AR =ar 9 ARFLAGS =crs10 11 DIR_OBJS=objs12 DIR_EXES=../../../build/exes13 DIR_DEPS=deps14 DIR_LIBS=../../../build/libs15 DIRS =$(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS) $(DIR_LIBS)16 RMS=$(DIR_OBJS) $(DIR_DEPS)17 18 EXE=19 ifneq ("$(EXE)","")20 EXE :=$(addprefix $(DIR_EXES)/,$(EXE))21 RMS +=$(EXE)22 endif23 24 LIB=libfoo.a25 ifneq ("$(LIB)","")26 LIB :=$(addprefix $(DIR_LIBS)/,$(LIB))27 RM +=$(LIB)28 endif29 30 SRCS=$(wildcard *.c)31 OBJS=$(SRCS:.c=.o)32 OBJS:=$(addprefix $(DIR_OBJS)/,$(OBJS))33 DEPS=$(SRCS:.c=.dep)34 DEPS:=$(addprefix $(DIR_DEPS)/,$(DEPS))35 36 ifeq ("$(wildcard $(DIR_OBJS))","")37 DEP_DIR_OBJS :=$(DIR_OBJS)38 endif#dir_objs39 ifeq ("$(wildcard $(DIR_EXES))","")40 DEP_DIR_EXES :=$(DIR_EXES)41 endif#dir_exes42 ifeq ("$(wildcard $(DIR_DEPS))","")43 DEP_DIR_DEPS :=$(DIR_DEPS)44 endif#dir_deps45 ifeq ("$(wildcard $(DIR_LIBS))","")46 DEP_DIR_LIBS :=$(DIR_LIBS)47 endif#dir_libs48 49 all: $(EXE) $(LIB)50 ifneq ($(MAKECMDGOALS),clean)51 include $(DEPS)52 endif#clean53 54 $(DIRS):55     $(MKDIR) $@56 $(EXE):$(DEP_DIR_EXES) $(OBJS)57     $(CC) -o $@ $(filter %.o,$^)58 $(LIB):$(DEP_DIR_LIBS) $(OBJS)59     $(AR) $(ARFLAGS) $@ $(filter %.o,$^)60 $(DIR_OBJS)/%.o:$(DEP_DIR_OBJS) %.c 61     $(CC) -o $@ -c $(filter %.c,$^)62 $(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c63     @echo "Creating $@ ..."64     @set -e;\65     $(RM) $(RMFLAGS) $@.tmp;\66     $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\67     sed 's,\(.*\)\.o[:]*,objs/\1.o $@:,g' <$@.tmp >$@;\68     $(RM) $(RMFLAGS) $@.tmp69 70 clean:71     $(RM) $(RMFLAGS) $(RMS)

 

 

 

具体和complicated项目的差别可以看书或者上篇随笔。

 

 

第一个提示没有那个目录,可以在include的时候加上'-'就可以忽略这个,因为这里对我们的项目没有实质影响,但是新手对于报错或者警告总是不放心,故再次提示一下。

从运行结果来看,的确在build/libs目录下生成了一个libfoo.a库文件。运行make clean之后,也没有删除build/libs这个目录,而只是删除库文件libfoo.a 

下面要做的就是将这个Makefile运用到code/huge/src目录。

增进复用性:

可以将公用部分放入一个独立的文件中——这就是bulid目录下make.rule文件的作用。这需要我们却别哪些是公用哪些是不能公用的变量。

在考虑复用的情况下,foo模块的Makefile有两部分组成,分别是bulid目录中的make.rule和code/foo/src目录中的Makefile。

foo模块中的Makefile比较简单,因为大部分代码移植道理make.rule中:

 

EXE=
LIB =libfoo.a
include $(ROOT)/build/make.rule

 

make.rule如下:

1 .PHONY: all clean 2  3 MKDIR = mkdir 4 RM = rm 5 RMFLAGS = -rf 6  7 CC =gcc 8 AR =ar 9 ARFLAGS =crs10 11 DIR_OBJS=objs12 DIR_EXES=$(ROOT)/build/exes13 DIR_DEPS=deps14 DIR_LIBS=$(ROOT)/build/libs15 DIRS =$(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS) $(DIR_LIBS)16 RMS=$(DIR_OBJS) $(DIR_DEPS)17 18 19 ifneq ("$(EXE)","")20 EXE :=$(addprefix $(DIR_EXES)/,$(EXE))21 RMS +=$(EXE)22 endif23 24 25 ifneq ("$(LIB)","")26 LIB :=$(addprefix $(DIR_LIBS)/,$(LIB))27 RM +=$(LIB)28 endif29 30 SRCS=$(wildcard *.c)31 OBJS=$(SRCS:.c=.o)32 OBJS:=$(addprefix $(DIR_OBJS)/,$(OBJS))33 DEPS=$(SRCS:.c=.dep)34 DEPS:=$(addprefix $(DIR_DEPS)/,$(DEPS))35 36 ifeq ("$(wildcard $(DIR_OBJS))","")37 DEP_DIR_OBJS :=$(DIR_OBJS)38 endif#dir_objs39 ifeq ("$(wildcard $(DIR_EXES))","")40 DEP_DIR_EXES :=$(DIR_EXES)41 endif#dir_exes42 ifeq ("$(wildcard $(DIR_DEPS))","")43 DEP_DIR_DEPS :=$(DIR_DEPS)44 endif#dir_deps45 ifeq ("$(wildcard $(DIR_LIBS))","")46 DEP_DIR_LIBS :=$(DIR_LIBS)47 endif#dir_libs48 49 all: $(EXE) $(LIB)50 ifneq ($(MAKECMDGOALS),clean)51 include $(DEPS)52 endif#clean53 54 $(DIRS):55     $(MKDIR) $@56 $(EXE):$(DEP_DIR_EXES) $(OBJS)57     $(CC) -o $@ $(filter %.o,$^)58 $(LIB):$(DEP_DIR_LIBS) $(OBJS)59     $(AR) $(ARFLAGS) $@ $(filter %.o,$^)60 $(DIR_OBJS)/%.o:$(DEP_DIR_OBJS) %.c 61     $(CC) -o $@ -c $(filter %.c,$^)62 $(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c63     @echo "Creating $@ ..."64     @set -e;\65     $(RM) $(RMFLAGS) $@.tmp;\66     $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\67     sed 's,\(.*\)\.o[:]*,objs/\1.o $@:,g' <$@.tmp >$@;\68     $(RM) $(RMFLAGS) $@.tmp69 70 clean:71     $(RM) $(RMFLAGS) $(RMS)

如果想运行foo模块中的Makefile,先要在shell上导出所需的ROOT变量:

 

期间出现了一个问题,我检查了很久Makefile并没有发现问题,但是就是显示没有规则创建目标,最后,用vim重新输入了一下include后面的路径,就解决了,用vscode输入莫名奇妙不行,又没有出现TAB建这样字符,可能是文本编辑器本身的差异吧,但是vim是肯定不会出现格式不兼容问题的。所以以后还是用vim写Makefile把。

完成上面的之后,我们需要考虑把code/huge/src目录中的Makefile了,我们希望这个目录中存放的程序能生成一个可执行文件。在测试Makefile之前,我们现在该目录中放一个main.c文件,内容如下:

 

1 int main(void)2 {3     return 0;4 }

 

Makefile如下所示:

1 EXE =huge_app2 3 LIB =4 5 include $(ROOT)/build/make.rule

从结果看huge_app已经成功生成了。

 

转载地址:http://fuchl.baihongyu.com/

你可能感兴趣的文章
函数的调用过程(栈帧)
查看>>
QUARTZ CRON表达式
查看>>
suite integration toolkit executable 已停止工作
查看>>
sed- 文本流编辑器
查看>>
在加州考驾照
查看>>
在Ubuntu 10.10下安装JDK配置Eclipse及Tomcat
查看>>
微信支付大盗--黑色产业链
查看>>
查看SQLSERVER当前正在运行的sql信息
查看>>
打印左下三角形
查看>>
关于学术诚信与职业道德的承诺
查看>>
Windows Server 2008搭建域控制器《转载51CTO.com》
查看>>
配置本地yum源的方法
查看>>
linux下android开发环境搭建及NDK安装(转)
查看>>
C++构造函数
查看>>
Apache Hive 安装文档
查看>>
Raspberry Pi(树莓派)国内软件源
查看>>
dev 中 字符串转中文拼音缩写,对grid列表进行模糊匹配,grid获取焦点行,gridlookupedit控件用拼音模糊匹配下拉选项...
查看>>
转.Buffer Management by the Camera Driver (Windows Embedded CE 6.0)
查看>>
仿金蝶-记账凭证
查看>>
jquery自动焦点图
查看>>