【问题标题】:Makefile/Shell: Append text to a name and use that name as a variableMakefile/Shell:将文本附加到名称并将该名称用作变量
【发布时间】:2012-10-22 06:46:14
【问题描述】:

我想要的是:

给定一个名称数组,例如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)的值恰好是我需要使用的变量的名称($(..))。并且表单($($$dependency)) 不正确(甚至不支持?)

有人知道吗?

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

【问题讨论】:

  • 不正确 并且不支持,因为 make 无权访问 shell 变量。
  • 好的。有没有其他方法可以实现我的要求,例如,不使用 shell?

标签: windows shell makefile windows-shell


【解决方案1】:

我基本上看到了两种可能性:要么在 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`"; \ 完毕

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 2013-04-28
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多