Makefileで$ 0をどのように使用しますか?

Makefileで$ 0をどのように使用しますか?

次のコマンドを含めたい(次のコマンドから取得)。ここ)の中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_fileMakeはそのエントリが存在しない場合、または最新バージョンの場合は「再構築」します。$<参照入力(前提条件と呼ばれる)、$@参照出力(目標と呼ばれる)。

ターゲットが必要な場合は、copy_files次に従属するよう宣言してくださいoutput_file

copy_files: output_file

Makeが偽物について知っている場合は、その内容にも言及してください。

.PHONY: copy_files
copy_files: output_file

関連情報