在其他配方中定义目标名称

时间:2017-10-02 19:34:54

标签: makefile gnu-make

它可能很丑,但我想在目标名称中使用一个宏来获取另一个食谱中指定的值。我知道如何使用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,有没有办法解决这个奇怪的问题?

2 个答案:

答案 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 thismake 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(通过将其作为命令行上的目标传递),因为您无法指定哪个版本,因为这条信息来自来自网络。所有这些都强烈暗示了结论,thatprogram-${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}