Variables Makefile,根据目标名称生成变量

Variables Makefile,根据目标名称生成变量,variables,makefile,Variables,Makefile,我在生成文件中有以下场景 METIS_A2_PHP5_FPM = metis-a2-php5-fpm-11 # metis-a2-php5-fpm-12 all: ganymede metis-a2 box-build: @echo ${@} :: $(HOSTNAME) :: $(HOSTIP) @echo bash bin/vagrant.sh init $(HOSTNAME) $(HOSTIP) ganymede: @make ganymede-build

我在生成文件中有以下场景

METIS_A2_PHP5_FPM = metis-a2-php5-fpm-11 # metis-a2-php5-fpm-12 

all: ganymede metis-a2

box-build:
    @echo ${@} :: $(HOSTNAME) :: $(HOSTIP)
    @echo bash bin/vagrant.sh init $(HOSTNAME) $(HOSTIP)

ganymede:
    @make ganymede-build

ganymede-build: HOSTNAME = "ganymede"
ganymede-build: HOSTIP = "10.0.3.2"
ganymede-build: box-build nis-server.sh syslog-ng-server.sh

metis-a2: metis-a2-php5-fpm # metis-a2-php5

metis-a2-php5-fpm:
    @make metis-a2-php5-fpm-build

metis-a2-php5-fpm-build: $(METIS_A2_PHP5_FPM)

$(METIS_A2_PHP5_FPM):
    @make ${@}-build

metis-a2-php5-fpm-11-build: HOSTNAME = "$(subst -build-host,,${@})"
metis-a2-php5-fpm-11-build: HOSTIP = "10.0.3.$(subst metis-a2-php5-fpm-,,$(HOSTNAME))"
metis-a2-php5-fpm-11-build: box-build apache2-php5-fpm.sh
运行时,让ganymede运行良好,我得到以下结果:

# make ganymede
make[1]: Entering directory `/home/dragosc/Workspace/a1/jupiter'
box-build :: ganymede :: 10.0.3.2
bash bin/vagrant.sh init ganymede 10.0.3.2
ganymede
不幸的是(这实际上是我的问题),当我运行make metis-a2或(更具体的指令)make metis-a2-php5-fpm时,主机名和主机IP变量是从构建框目标名转换的,而不是我需要从中转换的目标

# make metis-a2
make[1]: Entering directory `/home/dragosc/Workspace/a1/jupiter'
make[2]: Entering directory `/home/dragosc/Workspace/a1/jupiter'
box-build :: box-build :: 10.0.3.box-build
bash bin/vagrant.sh init box-build 10.0.3.box-build
make[2]: Leaving directory `/home/dragosc/Workspace/a1/jupiter'
make[1]: Leaving directory `/home/dragosc/Workspace/a1/jupiter'
你能给我解释一下原因吗?还有,你能给我一个解决办法吗

非常感谢


注意:如果缺少什么,请告诉我,我是从一个更大的项目中提取的。

为我的问题找到了修复方法,但如果你们认为有更简单的方法,我仍然愿意接受建议

我不是将变量传递给每个目标,而是将变量传递给递归make调用。这对我来说(现在)是可行的;我仍然遇到另一个问题(使目标递归运行),这也可能在这里产生问题(如果我放弃递归make调用)


为什么在这里使用递归make?目前唯一需要的目标是
$(METIS_A2_PHP5_FPM):
一个,您可以通过再次使用先决条件列表中的变量来避免这种情况。(另外,`#…`变量末尾的注释包括变量值中
前面的任何空格,仅供记录。)这里的问题是计算顺序问题。特定于目标的分配会立即完成,因此
${@}
$(subst)
会立即展开,并留下一个空的
主机名和一个“断开的”
主机IP
。还有
$(subst)
调用使用
-build host
,但您不在其他任何地方使用
-host
。@EtanReisner为
-build host
感到抱歉。我对Makefile的内容做了很多更改,在复制问题内容时没有注意到。如果您能告诉我如何在没有递归的情况下完成这项工作,我将非常感激@创建一些其他目标
您可以将其替换为
tgt:some other target
(对于某些目标,您已经有了此功能。但实际上,在这里这样做将意味着您不能在同一个make运行中运行多个目标(因为make每次运行只执行一次
box build
,或任何其他目标).您的递归正在使这成为可能。
METIS_A2_PHP5_FPM = metis-a2-php5-fpm-11 # metis-a2-php5-fpm-12 

all: ganymede metis-a2

box-build:
    @echo ${@} :: $(HOSTNAME) :: $(HOSTIP)
    @echo bash bin/vagrant.sh init $(HOSTNAME) $(HOSTIP)

ganymede:
    @make ganymede-build HOSTNAME="ganymede" HOSTIP="10.0.3.2"

ganymede-build: box-build nis-server.sh syslog-ng-server.sh

metis-a2: metis-a2-php5-fpm # metis-a2-php5

metis-a2-php5-fpm:
    @make metis-a2-php5-fpm-build

metis-a2-php5-fpm-build: $(METIS_A2_PHP5_FPM)

$(METIS_A2_PHP5_FPM):
    @make ${@}-build HOSTNAME="${@}" HOSTIP="10.0.3.$(subst metis-a2-php5-fpm-,,$(@))"

metis-a2-php5-fpm-11-build: box-build apache2-php5-fpm.sh