サブプロジェクトのためのマスターMakefileはサブプロジェクトをコンパイルしません
-
22-08-2019 - |
質問
私は私が実際に一度にコンパイルする必要があるすべては3つのサブプロジェクトを、含まれていることを解放するために働いているプロジェクトがあります。私のメイクファイルは、およそ次のようになります:
all: a b c
a:
@cd a && make
b:
@cd b && make
c:
@cd c && make
プロジェクトAとBは罰金コンパイルの両方が、第三のプロジェクトのために、それは実際にコードをコンパイルんCディレクトリと実行メイクへの切り替えが行われるためには何もない私に語っています。
もう少し具体的に説明すると:プロジェクトC上記の例では、実際にMozillaのSpiderMonkeyのです。 AとBは、私が書いたコード/ makefileのあるのに対し、Cは、MozillaのWebサイトからのSpiderMonkeyの単なる生のコピーです。そのため、実際にコンパイルのコマンドがあります:
make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
私のマスターのMakefileで、私が持っています:
spidermonkey:
@cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
出力は「SpiderMonkeyのを作る」実行「します:何が `のSpiderMonkey」のために行わないことを。」どのように私は、コマンドを実行するために作るのですか?
編集: 私は私のメイクファイルに次の行を追加しようとしました。
.PHONY: spidermonkey
と同様に、SMにSpiderMonkeyのルール、まだ変更なしの名前を変更します。
編集: 私の悪いです!私はタブを持っている必要があるとき、私はスペースを持っていました。 DOH!
解決
あなたはおそらく「SpiderMonkeyの」と呼ばれるトップレベルにあるファイルまたはディレクトリを持っています。作りはこれが何をその作成し、それがすでに存在するため、停止を行うことになっています。
であると考えてmakefileを書く際に従うべき最も重要なルールの一つは、を各ターゲットは、ターゲットのと同じ名前を持つ一つのファイルを作成する必要があります。言い換えれば、あなたが持っている場合は、
a:
<some command>
このコマンドは、 "A" と呼ばれる単一のファイルを作成する必要があります。
:ファイルを生成しますが、プレースホルダは、を偽のターゲットのと呼ばれ、彼らはこのように宣言されなければならないとしてのみ存在していないルール
.PHONY: a
作ることは、常に作り直さなければならないことを前提としています。
また、一般的なルールとしての代わりに$(MAKE)を使用します。
、再帰的に作る呼び出すために "作る" のは使用しないでください編集:変更 "擬似" から "偽"
他のヒント
ルールのターゲットと同じ名前のファイル(またはディレクトリ)のexistanceのためにのみチェックを行い、(それが依存関係よりも新しい)がある場合、ビューのメイクのポイントから行うにはより多くのものは何もありません。
だからあなたの問題は、(依存性のない)SpiderMonkeyのルールを持っているだけでなく、ディレクトリがあるSpiderMonkeyと呼ばれ、その後、作ることです「ターゲットはすでに、私が行うためには何も行われていない」と考えています。取得するには、あなたがやりたい作るSpiderMonkeyのルール(またはディレクトリ)の名前を変更します。
の方法で再帰的にメイクといえば、これは、neccessarily良いアイデアではありません 有害を考慮再帰的なメイクを参照してください。