0

私は Makefile を使用してきましたが、いくつかのものを分けておくために、新しい共通の Makefile を含めることにしました。私が直面した問題は、最初のメイクファイルが次のようになっていることです。

ファイル名 Makefile.test

include ./Makefile.a
all: a b c
b:
    @echo "b"
c:
    @echo "c"

ファイル名 Makefile.a

a:
    @echo "a"

makefile を実行すると、make -f Makefile.test だけが出力され、終了します。

それを機能させる唯一の方法は、インクルードを (どこでも) all: ターゲットに配置することです。

これが好きなように振る舞う理由はありますか?

ありがとう!

4

1 に答える 1

10

あなたがこれを言うとき:

include ./Makefile.a

makeは、Cの場合Makefile.aと同じ方法で現在の Makefile にプルするだけです。つまり、ステートメントを置き換えるためにの内容を挿入して続行します。その結果、make は何をすべきかを考え始めるときにこれを認識します。#include <x.h>Makefile.ainclude

a:
    @echo "a"
all: a b c
b:
    @echo "b"
c:
    @echo "c"

したがって、ソース順の最初のターゲットは になりa、ターゲットを指定しなかったため、make は最初のターゲットを使用します。そこからあなたの結果が生まれます。

all必要に応じて、ターゲットを明示的に指定できます。

make -f Makefile.test all

allこれは、Makefile のどこに表示されるかに関係なく、ターゲットを使用します。

GNU Make を使用している場合は、.DEFAULT_GOAL内部でデフォルトのターゲットを指定するために使用できMakefile.test、順序を気にする必要はありません。

include ./Makefile.a
all: a b c
b:
    @echo "b"
c:
    @echo "c"

.DEFAULT_GOAL := all

これについて思い出させてくれたIdelicに感謝します。

于 2012-10-04T05:06:07.110 に答える