make:「すべて」に対して何もする必要はありません


97

私はメイクファイルを作成するために、例えばpgmを通過しています。

http://mrbook.org/tutorials/make/

私のフォルダeg_make_creationには、次のファイルが含まれています。

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

エラー:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

このプログラムをコンパイルするのを理解してください。


12
「make clean」を実行してから「make all」を実行してみてください
Paul R

11
これはエラーではなく、hello最新であることを意味します。予期しない動作が発生cleanするrm -f *.o hello前にに変更してから、実行して動作するmake clean allかどうかを確認してください。
Mat

1
とはファイル名ではない.phony: all cleanためall、も追加する必要cleanがあります。
Kerrek SB、2011

3
CFLAGSに-cを入れないでください。
wildplasser

回答:


121

タブの代わりにmakefileルールのコマンドの前にスペースがあると、「何も実行しない」エラーが発生する場合があります。ルール内ではスペースではなくタブを使用してください。

all:
<\t>$(CC) $(CFLAGS) ...

の代わりに

all:
    $(CC) $(CFLAGS) ...

ルール構文の説明については、GNU makeマニュアルを参照してください。https//www.gnu.org/software/make/manual/make.html#Rule-Syntax


obj-m + = hello.o all:</ t> make -C / lib / modules / $(shell uname -r)/ build M = $(PWD)modules clean:make -C / lib / modules / $( shell uname -r)/ build M = $(PWD)clean
Narendra Jaggi 2015年

上記のファイルは有効なファイルですか?
Narendra Jaggi 2015年

親子のMakefileのコンテキストでは、親のMakefileで宣言された.PHONYとして子ターゲットが誤ってマークされているため、「何も実行しない」というエラーが発生する場合があります。
donhector

私が持っていたall : src/server/mod_wsgi.la、私はそれに変更しましたall : </t> src/server/mod_wsgi.la。私は今エラーを受け取ります:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127sudo make。何か助け?
Mooncrater

@Mooncraterを参照してくださいgnu.org/software/make/manual/make.html#Rule-Syntax。レシピ行はタブ文字(または.RECIPEPREFIX変数の値の最初の文字。特殊変数を参照)で始まります。最初のレシピ行は、必須条件の後の行にタブ文字で表示される場合と、同じ行にセミコロンで表示される場合があります。どちらの方法でも、効果は同じです。したがって、前提条件は単にレシピになりました。この場合、タブは必要ありません。
VirtualVDX

31

helloフォルダーからファイルを削除して、再試行してください。

allターゲットが依存するhelloターゲット。helloターゲットは、最初のファイルシステムで対応するファイルを検索しようとします。検出され、依存ファイルが最新の場合、何もする必要はありません。


obj-m + = hello.o all:</ t> make -C / lib / modules / $(shell uname -r)/ build M = $(PWD)modules clean:make -C / lib / modules / $( shell uname -r)/ build M = $(PWD)clean
Narendra Jaggi 2015年

上記のものは有効なメイクファイルですか?
Narendra Jaggi

21

makeだけを与えると、makefileの最初のルール、つまり「すべて」が作成されます。「すべて」が「hello」に依存することを指定しました。「hello」は、main.o、factorial.o、およびhello.oに依存します。したがって、「make」はそれらのファイルが存在するかどうかを確認しようとします。

それらが存在する場合、「make」はそれらの依存関係、たとえばmain.oに依存関係main.cが変更されているかどうかを確認します。それらが変更された場合、makeはそれらを再構築します。それ以外の場合は、ルールをスキップします。同様に、変更されたファイルを再帰的に構築し、最後に最上位のコマンド「all」を実行して、実行可能ファイル「hello」を提供します。

それらが存在しない場合、makeはルールの下ですべてを盲目的に構築します。

あなたの問題に来ると、それはエラーではありませんが、「make」は、makefileのすべての依存関係が最新であり、何もする必要がないことを示しています!


16

Makeは正しく動作しています。helloはすでに存在し、.cファイルよりも古くないため、実行する必要のある作業はこれ以上ありません。makeが(再)ビルドする必要があるシナリオは4つあります。

  • .cファイルの1つを変更すると、そのファイルはより新しくなりhello、makeを実行するときに再構築する必要があります。
  • を削除するとhello、明らかにそれを再構築する必要があります
  • -Bオプションを使用して、makeにすべてを強制的に再構築させることができます。make -B all
  • make clean all削除helloして再構築が必要になります。(@Matのコメントをご覧になることをお勧めしますrm -f *.o hello

4

9行目のタブを逃したと思います。all:helloに続く行は空白のタブでなければなりません。9行目に空白のタブがあることを確認してください。これは、makefileにデフォルトのレシピを使用することをインタープリターに理解させます。


4

これはエラーではありません。UNIXのmakeコマンドはタイムスタンプに基づいて機能します。つまり、特定の変更を加えてfactorial.cppコンパイルしたmake場合、makeはcc -o factorial.cppコマンドのみが実行されたという情報を表示します。次回同じコマンドを実行した場合、つまり拡張子がmake付いたファイルを変更しない場合.cpp、コンパイラーは出力ファイルが最新であると表示します。コンパイラは、何らかの変更を加えるまでこの情報を提供しますfile.cpp

の利点は、makefile変更されたファイルのみをコンパイルし.o、未変更ファイルのオブジェクト()ファイルを直接使用することにより、再コンパイル時間を短縮できることです。


0

別の方法で、この奇妙でデバッグの難しいエラーに到達しました。ターゲットと依存関係が別々のディレクトリにある場合、ビルドステップでパターンルールを使用していたことが問題になりました。このようなもの:

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

この方法でいくつかの依存関係を設定し、それらすべてに対して1つのパターンレシピを使用しようとしました。明らかに、「%」の単一の置換はここでは機能しません。私は依存関係ごとに明確なルールを作成し、子犬とユニコーンの中に戻ってきました!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

これが誰かを助けることを願っています!

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