2011-02-01 8 views
2

は、以下の考慮がファイルgnu make内でシェルforループを使用する際の問題?このメイクファイルを実行している間

 
all: 
    @for x in y z; \ 
    do \ 
      for a in b c; \ 
      do \ 
        echo $$x$$a >> log_$$x; \ 
      done; \ 
    done 

を行い、2つのファイルがlog_yとlog_zを作成しました。 log_yはデータ "yb"と "yc"を持っています。同様にlog_zはデータ「zb」および「zc」を有する。

実際には、4つのファイル(log_y_b、log_y_c、log_z_b、log_z_c)を作成します。このため私は上記のmakeファイルを次のように変更しました:

 
all: 
    @for x in y z; \ 
    do \ 
      for a in b c; \ 
      do \ 
        echo $$x$$a >> log_$$x_$$a; \ 
      done; \ 
    done 

しかし、そのファイルはlog_という1つしか作成されません。 4つのファイルを作成するにはどうすればよいですか。 Makefileの

答えて

4

おそらく、変数名の前後に中カッコを入れると、私のシステム上で動作します。

all: 
    @for x in y z; \ 
    do \ 
     for a in b c; \ 
     do \ 
      echo $$x$$a >> log_$${x}_$${a}; \ 
     done; \ 
    done 

あなたはまた、foreachを使用することができます。

all: 
    @$(foreach x,y z,$(foreach a,b c,echo $(x)$(a) >> log_$(x)_$(a);)) 
+0

おかげでその作業罰金... – rashok

+0

ndimが言うように下線文字が変数名を区切るていないので、それはです。また、makeマニュアルで[foreach](http://www.gnu.org/software/hello/manual/make/Foreach-Function.html#Foreach-Function)をご覧ください。あなたの例を次のように簡略化することができます: '$(foreach x、yz、$(foreach a、bc、echo $(x)$(a)>> log _ $(a);))' - わかりやすくするために、これを私の答えに入れておきます。 – Zorawar

1

log_$$x_$$alog_${x_}${a}に相当するシェルのlog_$x_$aになります。ただし、変数$x_は定義されていないため、シェルは空の文字列で置き換えます。

ソリューション:適切名(${variablename})の周りの中括弧で$x変数を書き、すなわち、一貫性のためには、log_${x}_${a}を書く(またはMakefileのスタイル:log_$${x}_$${a})。

関連する問題