Wie kann ich $0 im Makefile verwenden?

Wie kann ich $0 im Makefile verwenden?

Ich möchte den folgenden Befehl einfügen (entnommen ausHier) in einer Makefile. Eine einfache Version meines MakefileSkripts mit dem Befehl lautet:

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

Mein Problem besteht darin, dass das Symbol makenicht erkannt wird, wenn ich es mit ausführe:$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

Ich habe erfolglos versucht, der $0Verwendung zu entkommen. Was ist die Lösung?\$0

Antwort1

Sie waren auf dem richtigen Weg. Um das Dollarzeichen in einem Makefile zu umgehen,Sie müssen verwenden$$, nicht \$:

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

Da Sie eine Ausgabedatei unter Verwendung einer Eingabedatei erstellen, sollten Sie Make dies explizit mitteilen:

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/^\.//' > $@

Mit dieser Definition wird Make „neu erstellt“, output_filewenn es fehlt oder input_fileneuer ist. $<verweist auf die Eingabe(n) (bekannt als Voraussetzungen), $@verweist auf die Ausgabe (bekannt als Ziel).

Wenn Sie ein copy_filesZiel möchten, deklarieren Sie es als abhängig von output_file:

copy_files: output_file

Wenn Ihr Make von falschen Zielen weiß, erwähnen Sie das ebenfalls:

.PHONY: copy_files
copy_files: output_file

verwandte Informationen