它可能很丑,但我想在目标名称中使用一个宏来获取另一个食谱中指定的值。我知道如何使用eval函数在其他配方中定义宏/变量,如下所示:
read :
$(eval TEXT := $(shell cat somefile.txt))
say : read
echo ${TEXT}
这将导致:
$ make say
what ever's in this file
没关系。也可以使用宏来定义目标名称。现在让我们说我有一个文件,例如一个tar球,其名称始终以' program - '并且结束了。' .bar'并且在它们之间是位于单独文件中的版本,例如, '节目1.2.3.tar' 。所以原则上我可以用以下方法定义这个文件的目标:
VERSION = $(shell cat version.txt)
program-${VERSION}.tar :
tar cf program-${VERSION}.tar program-${VERSION}
好吧,这也行得很好。但实际上我只想在目标中读取此文件,例如:
.PHONY : getversion
getversion :
$(eval VERSION := $(shell cat version.txt))
program-${VERSION}.tar : gerversion
tar cf program-${VERSION}.tar program-${VERSION}
但当然这不起作用,因为make已经通过首先调用make来确定目标名称。如果没有额外的makefile,有没有办法解决这个奇怪的问题?
答案 0 :(得分:0)
我建议您在目标之外评估 VERSION 和 TAR_VERSION 。要将TAR_VERSION
设置为目标名称,您还应将其添加到.PHONY
目标。整件事情可能就是这样,
.PHONY : getversion $(TAR_VERSION)
VERSION := $(shell cat version.txt)
TAR_VERSION := $(addprefix program-, $(addsuffix .tar, ${VERSION}))
getversion :
echo ${VERSION}
$(TAR_VERSION) :
tar cf ${TAR_VERSION} program-${VERSION}
答案 1 :(得分:0)
我不知道我是否理解你所有细微差别的问题,但我认为你看到这个问题比实际情况更复杂。至于您的描述可以被理解,您有以下makefile,用于make this
和make that
,其中前者是一个不依赖于program-xyztar的目标,只有后者询问你实际处理的版本是否缓慢连接:
.PHONY : this that getversion
this:
@echo etc....
that: program-${VERSION}.tar
@echo done with program-${VERSION}
getversion :
$(eval VERSION := $(shell cat version.txt))
program-${VERSION}.tar : getversion
tar cf program-${VERSION}.tar program-${VERSION}
如果我可以这样说,那么你的依赖性会被误解。 that
的构建永远不依赖于特定版本,仅依赖于访问version.txt的纯粹行为。您也无法合理地构建一个特定的程序 - $ {VERSION} .tar(通过将其作为命令行上的目标传递),因为您无法指定哪个版本,因为这条信息来自来自网络。所有这些都强烈暗示了结论,that
和program-${VERSION}
之间没有涉及依赖关系,这简化了makefile:
.PHONY : this that getversion
this:
@echo etc....
that: getversion
@echo done with program-${VERSION}
getversion:
$(eval VERSION := $(file < version.txt))
tar cf program-${VERSION}.tar program-${VERSION}