私はMakefileの問題を解決しました。<<<
エラーメッセージでどこを見てください。
/bin/sh: 1: Syntax error: redirection unexpected
理由を知りたいです。 (私はBashを使用していますSHELL
)
現在のプロジェクトでは、私は多くのレシピを試しました。
target:
read FOO <<< "XXX"; \
read BAR <<< "YYY"; \
read BAZ <<< "ZZZ"; \
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
<<<
これを試みると、最初に説明したようにすべてのエラーが発生します。私の解決策は
target.dep:
echo "XXX YYY ZZZ" >$@
target: %: %.dep
read FOO BAR BAZ < $<;\
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
これは私の内容を一時ファイルに入れてからreadを使用することを意味します<
。これは素晴らしい動作します。 make出力を通常のbashプロンプトにコピーして貼り付けると<<<
。<<<
なぜこれが起こるのですか?この文字列をMakefileで動作させる方法はありますか?
PS:はい、時々私はautotoolsがmakeよりも優れていると思います。
答え1
/bin/sh: 1: Syntax error: redirection unexpected
あなたは意味いいえ反対の期待にもかかわらず、bashをシェルとして使用してください。 bashはsh
ここで文字列をよく認識していますが(Makefile
Fedoraで作業できるように)、たとえばdashはsh
そうではありません。特に指定しない限り、Makeはデフォルトの/bin/sh
ユーザーシェルを無視します。
環境
SHELL=/bin/bash
あなたはMakefile
あなたのために問題を解決しなければなりません。少なくともあなたと同じ症状を示すシステムでは私に役立ちました。
PS:はい、時々私はautotoolsがmakeよりも優れていると思います。
AutotoolsとMakeは同じ問題を解決せず、Autotoolsを使用することはまだMakeを使用していることを意味します。
答え2
エラーメッセージが示すように、呼び出しシェル make
はbash
。通常、ここでは文字列を理解していません。/bin/sh
sh
make
変数を(またはシステムの対応するシェルへのパス)SHELL
に設定した場合。/bin/bash
bash
sh
関連するGNUmake
ドキュメントも参照してください。https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html