makefile定义变量 中判断一个变量有没有定义

  在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单。现在介绍如下
如果在一个十分复杂庞大的makefile文件中,有个地方用到一个变量SRC_FILE,你很想知道makefile运行到此处的时候这个变量的值为多少。那么你可以在这个变量的下面写两行东东:
 $(shell echo $(SRC_FILE) & readme.txt )
  rrrrrrrrrrrrrrrrrrr
第一行其实是调用shell命令来将这个变量的值输入到readme变量中,makefile中shell命令会比规则命令先执行,所以此处肯定可以运行的。第二行的&rrrrrrrrrrrrrrrrrrrrr&其实就是一行人为的制造错误,因为有些makefile执行时间很长,而我们只是想知道SRC_FILE这个变量的值是多少,无需再执行一次完整的makefile,于是在第二行加一个格式错误的代码,那么makefile在执行完这个shell的命令后便会错误退出。
&至此 完毕!
阅读(...) 评论()【选软件网】软件网_中国专业的企业管理软件选型及服务选购平台
加入找软件交流QQ群:一起聊聊找软件那些事
供应商动态
Loading...
他们在这里找到了软件供应商
1F热门软件
2F SAAS专区
在线进销存
3F 热门领域
进销存管理
CRM客户管理
4F 热门行业
5F 电子商务
6F 中小微管理软件
进销存管理
7F 中大型管理软件
加入找软件交流QQ群:一起聊聊找软件那些事
找软件交流群
Brand authorization
The original guarantee
招商电话:
购买咨询:400-900-1816
增值电信业务经营许可证:京100262 京ICP备号Makefile中变量如何表示空字串和空格_百度知道
Makefile中变量如何表示空字串和空格
提问者采纳
= space := $(nullstring) # end of the line[引用]先用一个Empty变量来标明变量的值开始了[变量] 值为空格的变量[写法]nullstring , 而后面采用“#”注释符来表示变量定义的终止.[说明] $(nullstring) 和 # 之间是有一个空格的
其他类似问题
为您推荐:
makefile的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁从头开始写项目Makefile(六):参数传递、条件判断、include - 推酷
从头开始写项目Makefile(六):参数传递、条件判断、include
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】
在多个Makefile嵌套调用时,有时我们需要传递一些参数给下一层Makefile。比如我们在顶层Makefile里面定义的打开调试信息变量DEBUG_SYMBOLS,我们希望在进入子目录执行子Makefile时该变量仍然有效,这是需要将该变量传递给子Makefile,那怎么传递呢?这里有两种方法:
1.&&&& 在上层Makefile中使用”export”关键字对需要传递的变量进行声明。比如:
DEBUG_SYMBOLS = TRUE
export DEBUG_SYMBOLS
当不希望将一个变量传递给子 make 时,可以使用指示符 “unexport”来声明这个变量。
export一般用法是在定义变量的同时对它进行声明。如下:
export DEBUG_SYMBOLS = TRUE
2.&&&& 在命令行上指定变量。比如:
$(MAKE) -C xxx DEBUG_SYMBOLS = TRUE
这样在进入子目录xxx执行make时该变量也有效。
像编程语言一样,Makefile也有自己的条件语句。条件语句可以根据一个变量值来控制make的执行逻辑。比较常用的条件语句是ifeq –else-endif、ifneq-else-endif、ifdef-else-endif。
ifeq关键字用来判断参数是否相等。
比如判断是否生成调试信息可以这么用:
ifeq ($(DEBUG_SYMBOLS), TRUE)
&---CFLAGS += -g -Wall -Werror -O0
&---CFLAGS += -Wall -Werror -O2
Ifneq和ifeq作用相反,此关键字是用来判断参数是否不相等。
ifdef关键字用来判断一个变量是否已经定义。
后两个关键字用法和ifeq类似。
现在我们继续改进我们上一节的Makefile,上一节的Makefile完成Makefile的嵌套调用,每一个模块都有自己的Makefile。其实每个模块的Makefile都大同小异,只需要改改最后编译成生成的目标名称或者编译链接选项,规则都差不多,那么我们是否可以考虑将规则部分提取出来,每个模块只需修改各自变量即可。这样是可行的,我们将规则单独提取出来,写一个Makefile.rule,将他放在顶层Makefile同目录下,其他模块内部的Makefile只需要include该Makefile就可以了。如下:
include $(SRC_BASE)/Makefile.rule
include类似于C语言的头文件包含,你把它理解为为本替换就什么都明白了。
这样以后规则有修改的话我们直接修改该Makefile就可以了,就不用进入每一个模块去修改,这样也便于维护。
这样我们今天顶层Makefile稍作修改:
# Top Makefile for C program
# Copyright (C) 2014 shallnew \at 163 \dot com
export DEBUG_SYMBOLS = TRUE
MODULES = $(shell ls $(DIR))
# MODULES = ipc main tools
all : $(MODULES)
$(MODULES):
&---$(MAKE) -C $(DIR)/$@
main:tools ipc
&---@for subdir in $(MODULES); \
&---do $(MAKE) -C $(DIR)/$$subdir $@; \
distclean:
&---@for subdir in $(MODULES); \
&---do $(MAKE) -C $(DIR)/$$subdir $@; \
&---ctags -R
&---@echo &===============A common Makefilefor c programs==============&
&---@echo &Copyright (C) 2014 liuy0711 \at 163\dot com&
&---@echo &The following targets aresupport:&
&---@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 &To make a target, do 'make[target]'&
&---@echo &========================= Version2.2 =======================&
.PHONY : all clean distclean tags help
目前我们顶层目录下的目录树为:
├── include
├── common.h
├── ipc
└── ipc.h
└── tools
├── base64.h
├── md5.h
└── tools.h
├── libs
├── Makefile
├── Makefile.rule
└── src
├── ipc
├──Makefile
└── ipc.c
├── main
├──Makefile
├── main.c
└── main.c~
└── tools
├── inc
├── Makefile
└── src
├── base64.c
├── md5.c
└── tools.c
14 directories, 16 files
每个子模块下的Makefile删除规则后修改为如下:
SRC_BASE = ../..
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
而处于顶层目录下的Makefile.rule专门处理各模块编译链接时需要的规则。内容如下:
# Copyright (C) 2014 shallnew \at 163 \dot com
ifeq ($(DEBUG_SYMBOLS), TRUE)
&---CFLAGS += -g -Wall -Werror -O0
&---CFLAGS += -Wall -Werror -O2
all : $(SRC_BIN) $(SRC_LIB)
ifneq ($(SRC_BIN),)
$(SRC_BIN) : $(SRC_OBJ)
&---$(CC) -o $@ $^ $(LDFLAGS)
ifneq ($(SRC_LIB),)
$(SRC_LIB) : $(SRC_OBJ)
&---$(AR) rcs $@ $^
&---cp $@ $(SRC_BASE)/libs
# clean target
&---$(RM) $(SRC_OBJ) $(SRC_LIB) $(SRC_BIN)$(SRC_BIN).exe
distclean:
&---$(RM) $(SRC_OBJ) $(SRC_LIB) $(SRC_BIN)$(SRC_BIN).exe $(SRC_BASE)/libs/* $(SRC_BASE)/tags *~
.PHONY : all clean disclean
我们将Makefile.rule放在顶层有可能会一不小心在命令行上面执行了该Makefile,如下:
# make -f Makefile.rule
make: Nothing tobe done for `all'.
由于我们没有定义变量$(SRC_BIN)和$(SRC_LIB),伪目标all没有任何依赖,所以编译是无法成功的。这里我们我们应该禁止直接执行该Makefile。
在make里面有这样一个变量:MAKELEVEL,它在多级调用的 make 执行过程中。变量代表了调用的深度。在 make 一级级的执行过程中变量MAKELEVEL的值不断的发生变化,通过它的值我们可以了解当前make 递归调用的深度。顶层的MAKELEVEL的值为“0” 、下一级时为“1” 、再下一级为“2”.......,所以我们希望一个子目录的Makefile必须被上层 make 调用才可以执行,而不允许直接执行,我们可以判断变量MAKELEVEL来控制。所以我们这一节最终的Makefile.rule为:
# Copyright (C)2014 shallnew \at 163 \dot com
ifeq ($(DEBUG_SYMBOLS),TRUE)
&---CFLAGS +=-g -Wall -Werror -O0
&---CFLAGS +=-Wall -Werror -O2
ifeq($(MAKELEVEL), 0)
all : $(SRC_BIN)$(SRC_LIB)
ifneq ($(SRC_BIN),)
$(SRC_BIN) :$(SRC_OBJ)
&---$(CC) -o $@$^ $(LDFLAGS)
ifneq($(SRC_LIB),)
$(SRC_LIB) :$(SRC_OBJ)
&---$(AR) rcs$@ $^
&---cp $@$(SRC_BASE)/libs
&---@echo&You cannot directily execute this Makefile! This Makefile should calledby toplevel Makefile.&
# clean target
&---$(RM)$(SRC_OBJ) $(SRC_LIB) $(SRC_BIN) $(SRC_BIN).exe
distclean:
&---$(RM)$(SRC_OBJ) $(SRC_LIB) $(SRC_BIN) $(SRC_BIN).exe $(SRC_BASE)/libs/*$(SRC_BASE)/tags *~
.PHONY : all cleandisclean
此时再直接执行该Makefile:
# make -f Makefile.rule
You cannot directily execute this Makefile! This Makefile should called by toplevel Makefile.
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Makefile之条件判断---任务易

我要回帖

更多关于 makefile定义变量 的文章

 

随机推荐