Makeを使用した「ターゲットなし」エラー


12

私は使用方法makeとメイクファイルを学習しているので、この小さなファイルを書きました:

%.markdown: %.html
    pandoc -o $< $@

しかし、実行するとmakemake: *** No targets. Stop.何が起こっているのですか?


pandocコマンドの前のスペースかタブですか。Makeは、スペースではなくタブであることで悪名高いです。
slm

@slm:タブです。WindowsのEOLは互換性がないとどこかで読んだので、ファイル全体をUnix互換のEOLに変換しました。
アーメド2014

回答:


17

問題:

あなたの問題は、それmakeがあなたのターゲットについて知らないことです。

make stackoverflow.markdownたとえば、上記のMakefileを実行して動作させることができます。

make ただし、ターゲットの作成方法を指定しただけで失敗したため、失敗します。

以下のようleiazポイントがアウトだ上記のパターンルールが呼び出された暗黙のルール

Makefile:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

説明:

SRC.htmlMakefile のすべてのソースファイル(末尾が)を取得しますwildcard

TARは代用に記載されている各ソースファイルSRCで終わるターゲットで.markdownはなく、を.html

.PHONYは、常に最新ではないため、常に実行される非物理ターゲットをリストします。これらは、多くの場合all、およびcleanです。

ターゲットはall依存関係(の右側に記載されているファイルとして持っている:)すべて*.markdownのファイルを。つまり、これらすべてのターゲットが実行されます。

%.markdown: %.html
    pandoc -o $< $@

このスニペットは言う:で終わる各ターゲット.markdownは、依存関係がで終わることを除いて、同じ名前のファイルに依存しています.htmlワイルドカードは、%と見られることである*シェルのように。%右側には、しかし、左側に一致するように比較されます。ソース

音符の空白シーケンスインフロントがそのpandocあるTABので、makeその標準として定義。

最後に、偽のcleanターゲットは、このMakefileで作成したファイルからシステムをクリーンアップする方法を示しています。この場合、すべてのターゲット(という名前のファイル)が削除され*.markdownます。


1
すばらしい答えであり、これらをさらに理解しようとしたときに見つけた他のリンクがあります。ワイルドカード関数置換参照、および偽のターゲットです。
アーメド2014

もう1つ質問してください。makefile最初からファイルを作成できますか、それとも既存のファイルのみを更新しますか?生成されたファイルを削除すると、動作が停止するためです。ばかげた質問ですが、これは私にとってニューファンドランドです^^ "
アーメド、2014

1
.markdownファイルがない場合、作成されますか?ええ、私が知る限りそれで
十分でしょう

1
よし。さらに掘り下げます。あなたの答えをありがとう、あなたのおかげで私は今正しい道にいる
:)

1
すばらしい回答をありがとうございました。あなたが説明した方法は、コマンドの背後にある理由が機能しなかった理由を理解するのが非常に簡単で、続行する方法に関する非常に詳細な指示です。再度、感謝します。
zanona

5

パターン規則は暗黙の規則です。

Makefileにターゲットが定義されていません。コマンドラインでターゲットを指定できます:make something.markdownから作成するレシピを使用something.markdownsomething.htmlます。

または、デフォルトのターゲットを指定するルールをMakefileに追加できます。

all: file1.markdown file2.markdown

またはワイルドカードを使って:

all: *.markdown

あなただけ実行するとmake最初のルールの最初の目標は、デフォルトの目標です。呼び出す必要はありませんall

上記のように、ターゲットにallは前提条件として作成するすべてのファイルがあるため、を実行make allすると、リストされたすべてのファイルが作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.