1

What I want is:

Given an array of names, e.g., dependency1, dependency2, .., dependencyN:

  1. Append "_DEP_DIR" to each name, to form, e.g., dependency1_DEP_DIR, .., dependencyN_DEP_DIR. (XXX_DEP_DIR is predefined as a variable which points to the local disk path of each dependency.)

  2. Invoke a particular batch file(setup.bat) of each dependency.

What I tried is:

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

Problem

The first echo can successfully display the appended name, e.g., "dependency1_DEP_DIR". However, $($$dependency) doesn't work as expected, "/installers/windows" is printed out, not to say the following call to the batch file.

Toubleshooting

I guess the problem is that the value of my loop counter($$dependency) happens to be the name of a variable that I need to use($(..)). And the form($($$dependency)) is not right(or even not supported?)

Any one got any idea?

Also, if you guys can come up with other ways to meet my requirements which bypass this issue, happy to know that;)

4

1 に答える 1

2

基本的に 2 つの可能性があります。Makefile 内ですべてを行うか、必要な変数をシェルにエクスポートして展開するかです。foreach最初のケースは(ところで、 の定義はDEP_DIRSもっと単純かもしれません:) に依存し、次のDEP_DIRS=$(DEP_NAMES:=_DEP_DIR)ようなものです

$(foreach 依存関係、$(DEP_DIRS)、\
      echo "$(依存関係) をコピー"; \
      echo "dir is $($(dependency))"; \
 )

2 番目のケースでは、関連する変数をシェルにエクスポートする必要があることを make に伝える必要があります ( http://www.gnu.org/software/make/manual/html_node/Environment.html )。

エクスポートの依存関係 1_DEP_DIR =...
エクスポートの依存関係 2_DEP_DIR =...
...

次に、forループを使用できますが、最終的な変数の値を取得するのは少し難しい場合があります (厳密な POSIX 環境では、間接的な展開はそれほど簡単ではありません。たとえば、シェル変数を名前で間接的に検索するを参照してください) 。

$(DEP_DIRS) の依存関係の場合。行う \
  echo "$$依存関係をコピー"; \
  echo "dir is `eval echo \\$$$$dependency`"; \
終わり
于 2012-10-22T10:17:08.683 に答える