从头开始写项目Makefile(六):参数传递、条件判断、include .

在多个Makefile嵌套调用时,有时我们需要传递一些参数给下一层Makefile。比如我们在顶层Makefile里面定义的打开调试信息变量DEBUG_SYMBOLS,我们希望在进入子目录执行子Makefile时该变量仍然有效,这是需要将该变量传递给子Makefile,那怎么传递呢?这里有两种方法:
1.     在上层Makefile中使用”export”关键字对需要传递的变量进行声明。比如:
  1. DEBUG_SYMBOLS = TRUE  
  2. export DEBUG_SYMBOLS  
DEBUG_SYMBOLS = TRUE
export DEBUG_SYMBOLS
当不希望将一个变量传递给子 make 时,可以使用指示符 “unexport”来声明这个变量。
export一般用法是在定义变量的同时对它进行声明。如下:
  1. export DEBUG_SYMBOLS = TRUE  
export DEBUG_SYMBOLS = TRUE
2.     在命令行上指定变量。比如:
  1. $(MAKE) -C xxx DEBUG_SYMBOLS = TRUE  
$(MAKE) -C xxx DEBUG_SYMBOLS = TRUE
这样在进入子目录xxx执行make时该变量也有效。
 
像编程语言一样,Makefile也有自己的条件语句。条件语句可以根据一个变量值来控制make的执行逻辑。比较常用的条件语句是ifeq –else-endif、ifneq-else-endif、ifdef-else-endif。
ifeq关键字用来判断参数是否相等。
比如判断是否生成调试信息可以这么用:
  1. ifeq ($(DEBUG_SYMBOLS), TRUE)  
  2. >---CFLAGS += -g -Wall -Werror -O0  
  3. else  
  4. >---CFLAGS += -Wall -Werror -O2  
  5. endif  
  6.    
ifeq ($(DEBUG_SYMBOLS), TRUE)
>---CFLAGS += -g -Wall -Werror -O0
else
>---CFLAGS += -Wall -Werror -O2
endif
 
Ifneq和ifeq作用相反,此关键字是用来判断参数是否不相等。
ifdef关键字用来判断一个变量是否已经定义。
后两个关键字用法和ifeq类似。
 
现在我们继续改进我们上一节的Makefile,上一节的Makefile完成Makefile的嵌套调用,每一个模块都有自己的Makefile。其实每个模块的Makefile都大同小异,只需要改改最后编译成生成的目标名称或者编译链接选项,规则都差不多,那么我们是否可以考虑将规则部分提取出来,每个模块只需修改各自变量即可。这样是可行的,我们将规则单独提取出来,写一个Makefile.rule,将他放在顶层Makefile同目录下,其他模块内部的Makefile只需要include该Makefile就可以了。如下:
  1. include $(SRC_BASE)/Makefile.rule  
include $(SRC_BASE)/Makefile.rule
include类似于C语言的头文件包含,你把它理解为为本替换就什么都明白了。
这样以后规则有修改的话我们直接修改该Makefile就可以了,就不用进入每一个模块去修改,这样也便于维护。
这样我们今天顶层Makefile稍作修改:
  1. # Top Makefile for C program                                                                                                                                                               
  2. # Copyright (C) 2014 shallnew \at 163 \dot com  
  3.    
  4. export DEBUG_SYMBOLS = TRUE  
  5.    
  6. DIR = src  
  7. MODULES = $(shell ls $(DIR))  
  8. MODULES = ipc main tools  
  9.    
  10. all : $(MODULES)  
  11.    
  12. $(MODULES):  
  13. >---$(MAKE) -C $(DIR)/$@  
  14.    
  15. main:tools ipc  
  16.    
  17. clean :  
  18. >---@for subdir in $(MODULES); \  
  19. >---do $(MAKE) -C $(DIR)/$$subdir $@; \  
  20. >---done  
  21.    
  22. distclean:  
  23. >---@for subdir in $(MODULES); \  
  24. >---do $(MAKE) -C $(DIR)/$$subdir $@; \  
  25. >---done  
  26.    
  27. tags:  
  28. >---ctags -R  
  29.    
  30. help:  
  31. >---@echo "===============A common Makefilefor c programs=============="  
  32. >---@echo "Copyright (C) 2014 liuy0711 \at 163\dot com"  
  33. >---@echo "The following targets aresupport:"  
  34. >---@echo  
  35. >---@echo " all              - (==make) compile and link"  
  36. >---@echo " clean            - clean target"  
  37. >---@echo " distclean        - clean target and otherinformation"  
  38. >---@echo " tags             - create ctags for vimeditor"  
  39. >---@echo " help             - print help information"  
  40. >---@echo  
  41. >---@echo "To make a target, do 'make[target]'"  
  42. >---@echo "========================= Version2.2 ======================="  
  43.    
  44. .PHONY : all clean distclean tags help  
  45.    
# Top Makefile for C program                                                                                                                                                             
# Copyright (C) 2014 shallnew \at 163 \dot com
 
export DEBUG_SYMBOLS = TRUE
 
DIR = src
MODULES = $(shell ls $(DIR))
# MODULES = ipc main tools
 
all : $(MODULES)
 
$(MODULES):
>---$(MAKE) -C $(DIR)/$@
 
main:tools ipc
 
clean :
>---@for subdir in $(MODULES); \
>---do $(MAKE) -C $(DIR)/$$subdir $@; \
>---done
 
distclean:
>---@for subdir in $(MODULES); \
>---do $(MAKE) -C $(DIR)/$$subdir $@; \
>---done
 
tags:
>---ctags -R
 
help:
>---@echo "===============A common Makefilefor c programs=============="
>---@echo "Copyright (C) 2014 liuy0711 \at 163\dot com"
>---@echo "The following targets aresupport:"
>---@echo
>---@echo " all              - (==make) compile and link"
>---@echo " clean            - clean target"
>---@echo " distclean        - clean target and otherinformation"
>---@echo " tags             - create ctags for vimeditor"
>---@echo " help             - print help information"
>---@echo
>---@echo "To make a target, do 'make[target]'"
>---@echo "========================= Version2.2 ======================="
 
.PHONY : all clean distclean tags help
 
目前我们顶层目录下的目录树为:
  1. .  
  2. ├── include  
  3. │   ├── common.h  
  4. │   ├── ipc  
  5. │   │   └── ipc.h  
  6. │   └── tools  
  7. │       ├── base64.h  
  8. │       ├── md5.h  
  9. │       └── tools.h  
  10. ├── libs  
  11. ├── Makefile  
  12. ├── Makefile.rule  
  13. └── src  
  14.     ├── ipc  
  15.     │  ├──inc  
  16.     │  ├──Makefile  
  17.     │  └──src  
  18.     │       └── ipc.c  
  19.     ├── main  
  20.     │  ├──inc  
  21.     │  ├──Makefile  
  22.     │  └──src  
  23.     │       ├── main.c  
  24.     │       └── main.c~  
  25.     └── tools  
  26.         ├── inc  
  27.         ├── Makefile  
  28.         └── src  
  29.             ├── base64.c  
  30.             ├── md5.c  
  31.             └── tools.c  
  32.    
  33. 14 directories, 16 files  
  34.    
.
├── include
│   ├── common.h
│   ├── ipc
│   │   └── ipc.h
│   └── tools
│       ├── base64.h
│       ├── md5.h
│       └── tools.h
├── libs
├── Makefile
├── Makefile.rule
└── src
    ├── ipc
    │  ├──inc
    │  ├──Makefile
    │  └──src
    │       └── ipc.c
    ├── main
    │  ├──inc
    │  ├──Makefile
    │  └──src
    │       ├── main.c
    │       └── main.c~
    └── tools
        ├── inc
        ├── Makefile
        └── src
            ├── base64.c
            ├── md5.c
            └── tools.c
 
14 directories, 16 files
 
每个子模块下的Makefile删除规则后修改为如下:
 
  1. SRC_BASE = ../..  
  2.    
  3. CFLAGS +=  
  4. CPPFLAGS += -I. -I./inc -I$(SRC_BASE)/include  
  5.    
  6. SRC_OBJ = $(patsubst %.c, %.o, $(wildcard *.c))  
  7. SRC_FILES = $(wildcard src/*.c)  
  8. SRC_OBJ = $(SRC_FILES:.c=.o)  
  9. SRC_LIB = libtools.a  
  10.    
  11. include $(SRC_BASE)/Makefile.rule  
SRC_BASE = ../..
 
CFLAGS +=
CPPFLAGS += -I. -I./inc -I$(SRC_BASE)/include
 
# SRC_OBJ = $(patsubst %.c, %.o, $(wildcard *.c))
SRC_FILES = $(wildcard src/*.c)
SRC_OBJ = $(SRC_FILES:.c=.o)
SRC_LIB = libtools.a
 
include $(SRC_BASE)/Makefile.rule
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值