Makefile / Shell:将文本附加到名称并将该名称用作变量

时间:2012-10-22 06:46:14

标签: windows shell makefile windows-shell

我想要的是:

给定一个名称数组,例如dependency1,dependency2,..,dependencyN:

  1. 追加" _DEP_DIR"每个名称,以形成例如dependency1_DEP_DIR,..,dependencyN_DEP_DIR。 (XXX_DEP_DIR被预定义为一个变量,指向每个依赖项的本地磁盘路径。)

  2. 调用每个依赖项的特定批处理文件(setup.bat)。

  3. 我尝试的是:

    DEP_NAMES=dependency1 dependency2 dependency3 dependency4 dependency5 dependency6
    DEP_DIRS=$(foreach name,$(DEP_NAMES),$(name)_DEP_DIR)
    
    for dependency in $(DEP_DIRS); do \
        ECHO Copy $$dependency ; \
        ECHO $($$dependency)/installers/windows ; \
        "$($$dependency)/installers/windows/setup.bat" ; \
    done
    

    问题

    第一个echo可以成功显示附加名称,例如" dependency1_DEP_DIR"。但是,$($$dependency)没有按预期工作," /installers/windows"打印出来,而不是说以下调用批处理文件。

    Toubleshooting

    我想问题是我的循环计数器($$dependency)的值碰巧是我需要使用的变量的名称($(..))。表单($($$dependency))不正确(甚至不支持?)

    任何人都有任何想法?

    另外,如果你们能提出其他方法来满足我的要求,绕过这个问题,很高兴知道;)

1 个答案:

答案 0 :(得分:1)

我基本上看到了两种可能性:要么在Makefile中做所有事情,要么将所需的变量导出到shell并在那里扩展它们。第一种情况依赖于foreach(顺便说一句,DEP_DIRS的定义可能更简单:DEP_DIRS=$(DEP_NAMES:=_DEP_DIR)),类似

$(foreach dependency,$(DEP_DIRS),\
      echo "Copy $(dependency)"; \
      echo "dir is $($(dependency))"; \
 )

对于第二种情况,你必须告诉make它必须将相关变量导出到shell(http://www.gnu.org/software/make/manual/html_node/Environment.html):

export dependency1_DEP_DIR=...
export dependency2_DEP_DIR=...
...

然后你可以使用for循环,但是获取最终变量的值可能会有点棘手(在严格的POSIX环境中间接扩展并不那么容易,参见例如Lookup shell variables by name, indirectly)< / p>

for dependency in $(DEP_DIRS); do \
  echo "Copy $$dependency"; \
  echo "dir is `eval echo \\$$$$dependency`"; \
done