Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3046403
  • 博文数量: 396
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4209
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(396)

文章存档

2022年(1)

2021年(2)

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: LINUX

2016-08-31 15:47:54

版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】
    上一节我们把规则单独提取出来,方便了Makefile的维护,每个模块只需要给出关于自己的一些变量,然后再使用统一的规则Makefile。这一节我 们继续改进我们的Makefile,到目前为止我们的Makefile编译链接输出的目标都在源文件同目录下或模块Makefile同一目录下,当一个项 目大了之后,这样会显得很乱,寻找编译输出的文件也比较困难。既然Makefile本身就是按照我们的的规则来编译链接程序,那么我们就可以指定其编译链 接目标的目录,这样,我们可以清楚输出文件的地方,并且在清除已编译的目标时直接删除指定目录即可,不需要一层一层的进入源代码目录进行删除,这样又提高 了效率。
    既然要统一目标输出目录,那么该目录就需要存在,所以我们可以增加一条规则来创建这些目录,包括创建可执行文件的目录、链接库文件的目录以及.o文件的目 录。并且目录还可以通过条件判断根据是否产生调试信息来区分开相应的目标文件。一般一个工程的顶层目录下都会有一个build目录来存放编译的目标文件结 果,目前我的工程目录下通过Makefile创建的目录build的目录树如下:
[html] view plain copy
  1. build/            //build根目录  
  2. ├── unix        //unix平台项目下不带调试信息输出目录  
  3. │   ├── bin    //存放可执行文件目录  
  4. │   ├── lib    //存放可文件目录  
  5. │   └── obj    //存放.o文件目录,该目录下将每个模块生成的.o文件各自的目录下面  
  6. │       ├── ipc  
  7. │       ├── main  
  8. │       └── tools  
  9. └── unix_dbg   ////unix平台项目下带调试信息输出目录  
  10.     ├── bin  
  11.     ├── lib  
  12.     └── obj  
  13.         ├── ipc  
  14.         ├── main  
  15.         └── tools  
  16.   
  17. 14 directories, 0 files  

以上目录中bin和lib目录在顶层Makefile中创建,obj及其下面模块子目录在各模块的Makefile里面创建。
顶层Makefile创建目录如下:
[html] view plain copy
  1. ifeq ($(DEBUG_SYMBOLS), TRUE)  
  2. >---BUILDDIR = ./build/$(PLATFORM)_dbg  
  3. else  
  4. >---BUILDDIR = ./build/$(PLATFORM)  
  5. endif  
  6.   
  7. all : $(BUILDDIR) $(MODULES)  
  8.   
  9. $(BUILDDIR):  
  10. >---@echo "    Create directory $@ ..."  
  11. >---mkdir -p $(BUILDDIR)/bin $(BUILDDIR)/lib  
我们在all目标里面增加了其依赖目标BUILDDIR,该目标对应的规则为创建bin目录和lib目录。这样每次编译之前都会创建目录。

各模块内部Makefile创建生成.O文件的目录,如上目录树所示。类似于顶层Makefile,各模块内部Makefile需要根据平台、编译调试信 息、以及模块名称来生成需要的目录名称,然后再增加创建该目录的规则。因为每个模块都会做这些处理,所以我们将这部分写在规则 Makefile(Makefile.rule)里面,如下:
[html] view plain copy
  1. ……  
  2. # define a root build directory base on the platform  
  3. # if without a SRC_BASE defined, just use local src directory  
  4. ifeq ($(SRC_BASE),)  
  5. >---BUILDDIR = $(MOD_SRC_DIR)  
  6. >---OBJDIR = $(MOD_SRC_DIR)  
  7. >---LIBDIR = $(MOD_SRC_DIR)                                                                                                                                  
  8. >---BINDIR = $(MOD_SRC_DIR)  
  9. else  
  10. >---ifeq ($(DEBUG_SYMBOLS), TRUE)  
  11. >--->---BUILDDIR = $(SRC_BASE)/build/$(PLATFORM)_dbg  
  12. >---else  
  13. >--->---BUILDDIR = $(SRC_BASE)/build/$(PLATFORM)  
  14. >---endif  
  15. >---OBJDIR = $(BUILDDIR)/obj/$(MODULE)  
  16. >---LIBDIR = $(BUILDDIR)/lib  
  17. >---BINDIR = $(BUILDDIR)/bin  
  18. endif  
  19. ……  
  20. ifeq ($(MAKELEVEL), 0)  
  21. all : msg  
  22. else  
  23. all : lib bin  
  24. endif  
  25.   
  26. lib : $(OBJDIR) $(SRC_LIB)  
  27.   
  28. bin : $(OBJDIR) $(SRC_BIN)                                                                                                                         
  29.   
  30. $(OBJDIR) :  
  31. >---@echo "   MKDIR $(notdir $@)..."  
  32. >---@mkdir -p $@  
  33. ……  
此时我们编译一下后查看build目录:
[html] view plain copy
  1. build/  
  2. └── unix_dbg  
  3.     ├── bin  
  4.     ├── lib  
  5.     └── obj  
  6.         ├── ipc  
  7.         ├── main  
  8.         └── tools  
  9.   
  10. 7 directories, 0 files   
    由于我们是开启了调试信息,所以创建了unix_dbg目录,并且该目录下创建了bin、lib、obj目录及其模块目录,但我们没有发现有文件存放在里面。
    到目前为止,这一节仅仅讲述如何创建统一的目标文件存放目录,但是要想将编译生成的目标文件自动生成到这些目录还没有完成。其实我们只需要给目标加上路径即可,但还是有一些详细的地方需要处理,具体的我们会在下一节中讲到,这一节暂不给出最后的Makefile。
阅读(1697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~