1

我想要的是:

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

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

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

我尝试的是:

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

问题

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

故障排除

我想问题是我的循环计数器($$dependency)的值恰好是我需要使用的变量的名称($(..))。并且 form( $($$dependency)) 不正确(甚至不支持?)

有人知道吗?

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

4

1 回答 1

2

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

$(foreach 依赖,$(DEP_DIRS),\
      echo "复制$(依赖)"; \
      echo "dir 是 $($(dependency))"; \
 )

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

导出依赖1_DEP_DIR=...
导出依赖 2_DEP_DIR=...
...

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

$(DEP_DIRS) 中的依赖项;做 \
  echo "复制$$依赖"; \
  echo "dir 是 `eval echo \\$$$$dependency`"; \
完毕
于 2012-10-22T10:17:08.683 回答