给定一个名称数组,例如dependency1,dependency2,..,dependencyN:
追加" _DEP_DIR"每个名称,以形成例如dependency1_DEP_DIR,..,dependencyN_DEP_DIR。 (XXX_DEP_DIR被预定义为一个变量,指向每个依赖项的本地磁盘路径。)
调用每个依赖项的特定批处理文件(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
第一个echo可以成功显示附加名称,例如" dependency1_DEP_DIR
"。但是,$($$dependency)
没有按预期工作," /installers/windows
"打印出来,而不是说以下调用批处理文件。
我想问题是我的循环计数器($$dependency
)的值碰巧是我需要使用的变量的名称($(..)
)。表单($($$dependency)
)不正确(甚至不支持?)
任何人都有任何想法?
另外,如果你们能提出其他方法来满足我的要求,绕过这个问题,很高兴知道;)
答案 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