如何调试makefile变量

转载自:http://coolshell.cn/articles/3790.html

六、七年前写过一篇《跟我一起写Makefile》,直到今天,还有一些朋友问我一些Makefile的问题,老实说,我有一段时间没有用Makefile了,生疏了。回顾,这几年来大家问题我的问题,其实很多时候是makefile的调试问题。所以,就像我在之前的那篇关于GDB的技巧的文章中做的一样,在这里向大家介绍一个小小的调试变量的技巧。相信一定对你有用。

对于Makefile中的各种变量,可能是我们比较头痛的事了。我们要查看他们并不是很方便,需要修改makefile加入echo命令。这有时候很不方便。其实我们可以制作下面一个专门用来输出变量的makefile(假设名字叫:vars.mk)

vars.mk


%:

@echo ‘$*=$($*)‘

d-%:

@echo ‘$*=$($*)‘

@echo ‘  origin = $(origin $*)‘

@echo ‘   value = $(value  $*)‘

@echo ‘  flavor = $(flavor $*)‘

这样一来,我们可以使用make命令的-f参数来查看makefile中的相关变量(包括make的内建变量,比如:COMPILE.c或MAKE_VERSION之类的)。注意:第二个以“d-”为前缀的目标可以用来打印关于这个变量更为详细的东西(后面有详细说明)

假设我们的makefile是这个样子(test.mk)

test.mk


OBJDIR := objdir

OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

foo = $(bar)bar = $(ugh)ugh = Huh?

CFLAGS = $(include_dirs) -O

include_dirs = -Ifoo -Ibar

CFLAGS := $(CFLAGS) -Wall

MYOBJ := a.o b.o c.o

MYSRC := $(MYOBJ:.o=.c)

那么,我们可以这样进行调试:

演示


[[email protected]]$ make -f test.mk -f var.mk OBJS

OBJS=objdir/foo.o objdir/bar.o objdir/baz.o

[[email protected]]$ make -f test.mk -f var.mk d-foo

foo=Huh?

origin = file

value = $(bar)

flavor = recursive

[[email protected]]$ make -f test.mk -f var.mk d-CFLAGS

CFLAGS=-Ifoo -Ibar -O -O

origin = file

value = -Ifoo -Ibar -O -O

flavor = simple

[[email protected]]$  make -f test.mk -f var.mk d-COMPILE.c

COMPILE.c=cc -Ifoo -Ibar -O -Wall   -c

origin = default

flavor = recursive

value = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

我们可以看到:

  • make的第一个-f后是要测试的makefile,第二个是我们的debug makefile。
  • 后面直接跟变量名,如果在变量名前加”d-“,则输出更为详细的东西。

说一说”d-” 前缀(其意为details),其中调用了下面三个参数。

  • $(origin):告诉你这个变量是来自哪儿,file表示文件,environment表示环境变量,还有environment override,command line,override,automatic等。
  • $(value):打出这个变量没有被展开的样子。比如上述示例中的 foo 变量。
  • $(flavor):有两个值,simple表示是一般展开的变量,recursive表示递归展开的变量。
时间: 2024-10-01 21:32:03

如何调试makefile变量的相关文章

<转>如何调试makefile

makefile 的调试有点像魔法.可惜,并不存在makefile 调试器之类的东西可用来查看特定规则是如何被求值的,或某个变量是如何被扩展的.相反,大部分的调试过程只是在执 行输出的动作以及查看makefile.事实上,GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 用来调试makefile 的一个最好方法就是加入调试挂钩以及使用具保护的编程技术,让你能够在事情出错时恢复原状.我将会介绍若干基本的调试技术以及我所发现的最有用的具保 护能力的编码习惯. 1.make 的调试功

xcode调试查看变量的值

对于IPhone开发/XCode的初学者,如何在调试时查看变量的值是很头痛的事情.因为Xcode的expression 经常无法正确显示变量的值.但是强大的GDB可以很方便的帮我们查看变量的值. 当执行到某断点时,在GDB窗口中使用po就可以查看变量.(po = print object) 1)查看String 或其它变量. po 变量名 2)查看某个Property.比如要查看item变量的name属性. po [item name]    注意,po item.name是不工作的. 3)查看

jni调试3(线程调试env变量问题)

jni层调试线程死机原因 一,导致死机原因: jni层中  线程函数中  只要添加调用env 的函数 ,,就会死机 二,解决方法 第一我们应该理解: ①(独立性) JNIEnv 是一个与线程相关的变量,即线程A有一个 JNIEnv变量, 线程B也有一个JNIEnv变量,由于线程相关,所以A线程不能使用B线程的 JNIEnv 结构体变量.那么如何保证了每个线程JNIEnv的独立性呢? 一个java对象通过JNI调用DLL中一个send()函数向服务器发送消息,不等服务器消息到来就立即返回,同时把J

makefile变量赋值

在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值. 先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值.如: foo = $(bar)bar = $(ugh)ugh = Huh? all:echo $(foo) 我们执行“make all”将会打出变量$(foo)的值是“Huh?”( $(foo)的值是

调试makefile—subst函数

操作系统:ubuntu10.04 Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数格式:    $(subst ;,;,;)名称:字符串替换函数——subst.功能:把字串;中的;字符串替换成;.返回:函数返回被替换过后的字符串. 示例:$(subst a,the,There is a big tree),把“There is a big tree”中的“a”替换成“the”,返回结果是“T

微信小程序里面的单步调试和变量查看

http://blog.csdn.net/bright789/article/details/54709594 mark一下

Linux下服务器端开发流程及相关工具介绍(C++)

原文:Linux下服务器端开发流程及相关工具介绍(C++) 去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路线图,帮助新人尽快上手. 本文介绍的是阿里妈妈搜索直通车这边的一些开发流程及相关工具.做为新人入门手册,其中某些工具可能只有直通车这边在用,但对于其他公司的新人来说,一样是具有指导意义的. 简单介绍一下直通车这边的开发背景:直通车业务对外是

Makefile 调试

一.简介 GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 用来调试makefile 的一个最好方法就是加入调试挂钩以及使用具保护的编程技术,让你能够在事情出错时恢复原状. 二.make调试功能 1)warning函数:可以放在makefile 中的任何地方,将输出string $(warning string) 2)使make读进makefile并且输出它更新工作目标时将会执行的命令,不会真的执行,但在立即的语境中,它会对shell函数调用进行求值动作 --just-prin

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发