Makefile “multiple target patterns. Stop.”解决方案

几天在帮一个同事编译Xen中的tools时,我改了一些config文件,然后就遇到了一个错误“Makefile:72: *** multiple target patterns. Stop.
花了大约半个小时才找到了这个错误是自己写错了一个配置的原因,将其过程及其根本原因说一下。

总的来讲,“mutiple target patterns”这个错误,一般是由于Makefile中target那一行有多余的冒号(:)(我们知道冒号在Makefile中的用来标识前面是一个编译的目标),如果有多余的冒号就会报错。
有一个简单有效的方法去排查这个问题,就是自己另外定义一个目标,将抱错行的信息全部打印出来看看是否有多余的冒号。

我所遇到的错误那一行如下:
roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM) ../etherboot/eb-roms.h
由于里面依赖到了4个变量,而且其中几个变量并不是在这个Makefile中直接定义的,所以找起来有点麻烦。我就在Makefile中添加了一个target将这个变量打印出来看看那,添加的Makefile代码如下:

View Code BASH
1
2
3
4
 mydebug:
          echo "/* just for debugging in Makefile */"
          echo "$(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM)" > /tmp/debug-makefile.log
          echo "/* END for debugging in Makefile */"

然后将原来出错的那一行注释掉,然后运行”make mydebug”,之后去看一下/tmp/debug-makefile.log文件,我就发现这里的$(SEABIOS_ROM)变量中含有非法的冒号字符,它的值为:git://vt-sync/seabios.git/out/bios.bin
再继续寻找,我就发现,我在一个Config.mk中写有“SEABIOS_DIR ?= git://vt-sync/seabios.git”这样的失误。

为了简单的说明,请看下面一个简单例子,Makefile如下:

View Code BASH
1
2
3
4
5
OBJ1="temp1:"
 
#build: temp $(OBJ1)
test: temp
        echo "OBJ1='$(OBJ1)'" > /tmp/debug-makefile.log

如果不注释掉“build: temp $(OBJ1)”这一样,运行“make build”就会报错“Makefile:3: *** multiple target patterns. Stop.”
然后为了查原因,我们可以注释掉build这个target,然后执行下“make test”,立马就会发现OBJ1=’temp1:’,所以是有错误的。而实际遇到的问题,并没有这个小例子这么浅显,出错的变量不一定直接定义在当前的Makefile中,为了排除错误,我们可以直接echo出一些变量的值来查看。

`missing target pattern. Stop.’
`multiple target patterns. Stop.’
`target pattern contains no `%’. Stop.’
These are generated for malformed static pattern rules. The first means there’s no pattern in the target section of the rule, the second means there are multiple patterns in the target section, and the third means the target doesn’t contain a pattern character (%).
Makefile error: http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_121.html


转自:http://smilejay.com/2012/03/makefile_multiple_target_patterns/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值