2011-07-19 4 views
1

例を挙げて説明しましょう。「make: 'target'のために何もしないでください」というエラーを取得します。

mkdir test 
cd test 
touch target 
make target 

これは、になります:だからメイクを行うには何もない私に指示make: Nothing to be done for 'target'.

。これは、にすると、targetというルールが見つかりませんでしたが、targetが既に存在するため、となります。は何もしません。

今、私はそれを望んでいません。 targetが既に存在していても、targetのルールが見つからない場合は、と入力するとエラーが表示されます。

私は次のことを試してみました:

echo '.DEFAULT: 
     echo make: *** No rule to make target `[email protected]'. Stop. 
     false'> Makefile 

をしかし、これは複数のターゲットを作るときを作る停止しません。

答えて

2

あなたはそれについて考えるなら、あなたは鶏と卵の状況(または無限回帰)に終わるでしょう。あなたは「それは正当なものである前に、あなたはターゲットを作成するためのルールを持っている必要があります」、あなたがのための「はXに依存ターゲットを」というルールを持っていると言ったルールを持っているために管理と仮定その他のファイルX。それは書かれています:

target: X 
     command to build target from X 

しかし、その後、あなたは戻って出発点になるだろう:あなたは、ルールがXを作成したいと思います。どうやってそれができる?あなたは何に依存しており、魔法、それが必要とされているファイルXを作成したルールがあるとします。そのようなルールがなければ

X: 
     command to build X from nothing 

を、あなたは無限後退を持っています。

したがって、makeは、ファイルが存在し、最新であることを保証するように設計されています。ファイルが存在し、それがどのように行われるかを指定するための暗黙的または明示的なルールがない場合、ファイルは最新です。あなたがしようとしていることは不可能です。

+0

良い点ですが、私は別の問題に対処しています(私の質問にはっきりと記載されていません)。応答していただきありがとうございます。 問題を説明する簡単な例を作成したら、新しい質問を作成します。 – To1ne

+0

実際にはここに鶏肉と卵はありません。あなたはすべての卵を宣言するだけです(ほとんどの言語では変数宣言によく似ています)、非常にun-makelike、はい。 – bobbogo

+0

ダウン投票。それは、OPが望んでいたものを達成する偽のターゲットを使用しているようだ。 – iheanyi

7

問題は、ターゲット名が指定されたコマンドによってビルドされるファイルであると仮定していることです。

しかし、時にはこれは真実ではありません(たとえば、「クリーン」と考える)。 いくつかのターゲットがこのファイルをビルドしないことをmakeに伝えるには、それらを「偽」にする必要があります。あなたのMakefileに次の行を入力してください:

.PHONY: target 
0
obj -m:=smsc911x.o 
KDIR=/home/rajasekarm/Desktop/project/dvsdk/psp/linux-2.6.37-psp04.02.00.07.sdk 

対象:

make -C ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- $(KDIR) M=$(PWD) moduiles 
clean : 
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- M=$(PWD) clean 

〜の後にそれが(誤った場合;-))実は、これは完全に合理的なように聞こえるターゲット

here -->/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin is my cross compiler path 
0

のためにやるべきことは何も与えない作る入る要求。しかし、空のレシピを持つルールを使ってすべてのソースファイルを明示的にリストする必要があります。ここで

あなたが行く:

Makefile: ; 

.PHONY: dodgy 
dodgy%: dodgy; $(error You must provide a rule for $*) 
%: dodgy% ; 

プディングの証拠:ラインMakefile: ;が必要であることを

$ rm aa 
$ make aa 
Makefile:4: *** You must provide a rule for aa. Stop. 
$ touch aa 
$ make aa 
Makefile:4: *** You must provide a rule for aa. Stop. 

注意。結局のところ、最初のものをしようとするとMakefileを再構築します。

キャッチオールパターンルールは非終端記号であることにも注意してください。これは大きなパフォーマンスのヒットになる可能性があります。マニュアルはマッチについて何か言っているように、何かルールを定めています。「非常に便利ですが、makeが考えることに多くの時間がかかることがあります。

関連する問題