0

レシピの実行時に、ファイルの個別の行にある変数のすべての単語をリストするファイルを生成したいと思います。これがルールの始まりです。$(OBJ_LIST)内のすべての単語をmake_tempに入れる必要があります。注:$(OBJ_LIST)は.oファイルのリストです。注:.RECIPEPREFIXに>を使用します。

$(MDIR)zzz.exe: $(OBJ_LIST)
>  if exist make_temp del make_temp

これらの3行をこの下に置くと、ファイルの最初の3語がファイルに含まれます。

>  echo $(word 1,$+) >> make_temp
>  echo $(word 2,$+) >> make_temp
>  echo $(word 3,$+) >> make_temp

私はこれを行うためにforeachとevalを使用しようとしました。

>  $(foreach obj,$+,$(eval > echo $(obj) >> make_temp))

これにより、エラーmakefile.min:473が発生します。*レシピは最初のターゲットの前に開始されます。止まる。これは、前にルール開始構文がない行に>を含む行を配置したときに発生するエラーと同じです。ですから、これは私がやりたいことである現在のレシピリストを継続しないように思われます。

foreachとevalに現在のレシピリストを継続させたり、別の方法を使用してファイルのリストを生成したりするにはどうすればよいですか。

4

3 に答える 3

0

やってみました

$(foreach obj,$+,$(shell echo $(obj) >> make_temp))

于 2012-07-24T15:38:48.967 に答える
0

foreachフォームでレシピを作成するために使用する{echo o1; echo o2; ...} > make_temp

make_temp : $(OBJ_LIST)
>   { $(foreach o,$+,echo '$o';) } > $@

または、シェル機能を使用します。

make_temp : $(OBJ_LIST)
>   for o in $+ do echo $$o; done > $@
于 2012-07-24T16:11:17.737 に答える
0

私はこれを次のように解決しました。

make_temp: makefile.min
>  $(shell if exist make_temp del make_temp)
>  $(foreach obj,$(OBJ_LIST),$(shell echo $(obj) >> make_temp))

ifステートメントをシェルに入れないと、不明な理由でforeachループが実行された後に実行されるため、ファイルが削除されます。

このファイルの生成には時間がかかるため、makefileが変更された場合にのみ生成するようにしました。

私はこれをWindowsで行っていると言うのを忘れました。Eldar Abusalimovによる最初のソリューションは、Windowsで同等の形式を持っているとは思いません。次のように、2番目のソリューションをWindowsに変換しました。

make_temp : $(OBJ_LIST)
>  for %%a in $(OBJ_LIST) do echo %a

$(OBJ_LIST)はWindowsのcmd.exeの制限である8192文字より長いため、これは私の場合は機能しません。そのため、このファイルを生成したいと思います。$(OBJ_LIST)を直接使用できないためです。

ご協力ありがとうございました。

于 2012-07-25T01:02:09.097 に答える