次のコマンドを含めたい(次のコマンドから取得)。ここ)の中Makefile
。このコマンドを含む単純なスクリプトバージョンはMakefile
次のとおりです。
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($0,1,length(p)) != p { print $0; p = $0 }' | \
rev | \
sed 's/^\.//' > ./output_file
私が経験している問題は、次のように実行するとシンボルがmake
認識されないことです$0
。
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
私は成功せずに$0
使用を避けようとしました\$0
。解決策は何ですか?
答え1
あなたは正しい道を行っています。 Makefileでドル記号を避けてください。使用する必要があります$$
、いいえ\$
:
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > ./output_file
入力ファイルを使用して出力ファイルを構築するため、Makeに明示的に通知する必要があります。
output_file: input_file
sed 's/^/\./' $< | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > $@
output_file
この定義に従い、input_file
Makeはそのエントリが存在しない場合、または最新バージョンの場合は「再構築」します。$<
参照入力(前提条件と呼ばれる)、$@
参照出力(目標と呼ばれる)。
ターゲットが必要な場合は、copy_files
次に従属するよう宣言してくださいoutput_file
。
copy_files: output_file
Makeが偽物について知っている場合は、その内容にも言及してください。
.PHONY: copy_files
copy_files: output_file