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

时间:2015-03-18 15:15:29

标签: variables makefile

我在 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

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

在运行 make 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 时, HOSTNAME和HOSTIP变量是从 build-box 目标名称转换而不是我需要转换的目标。

# 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'

请你解释一下为什么,还有,请你帮我解决一个问题吗?

非常感谢提前。

注意:如果缺少某些内容,请告诉我,我将其从更大的项目中拉出来。

1 个答案:

答案 0 :(得分:0)

发现了我的问题的解决方案,但如果你们认为有更简单的方法,我仍然愿意接受建议。

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

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