1

再帰的なmakeを使用してツリーを構築するようにmakeをセットアップします。なのでセットアップは

A/Makefile  a.c
A/B/Makefile a.c
A/B/C/Makefile a.c 

ここで、レベル A/ からコマンドを発行するmake allと、make はツリーをたどってすべてを構築してから戻ってきます。各 Makefile には、その下に構築するフォルダーのリストが含まれています。ルートに common.inc ファイルがあり、各 Makefile で読み込まれます。

これは、再帰的な make の標準的なレイアウトであり、目新しいものではありません。詳細は多くの場所で提供されています。 herehereは例です。

私の質問は次のとおりです。何度もやりたいのですmake allが、現在のフォルダーにあるものだけをビルドし、実際にツリーを下に移動しないのは、現時点で現在のフォルダーのいくつかの変更をテストしたいからかもしれません。SUBDIRS=A B Cしたがって、現在のフォルダーの Makefile を編集して、以下のすべてのフォルダーを一覧表示するか、このフォルダーのみに新しい特別なターゲットを追加してコメントアウトします。どちらもやり続けなければならない面倒なことです。

スイッチを使用して、呼び出されたときにツリーを下に移動する必要があるかどうかを伝える再帰的なメイクファイルのアイデアや小さな例はありますか? コマンドラインで make を呼び出してフラグを渡す方法があるかもしれません。このフラグはSUBDIRS=A B C .....リストを削除するために使用されるため、現在のフォルダーレベルでのみ停止しますか?

ただ明確にします。ツリー内の各 Makefile に含まれる Rules.mk で標準の SUBDIRS を使用しています。これがその部分です。昔ネットからコピペした

$(SUBDIRS)::
    @if test -d $@; then                \
        set $(EXIT_ON_ERROR);           \
        echo "cd $@; make $@";          \
        cd $@; make $@;             \
        set +e;                 \
    else                        \
        echo "Skipping non-directory $@...";    \
    fi                      \
    $(CLICK_STOPWATCH);
endif 

そして、各フォルダー Makefile に書き込みます

SUBDIRS = A B C        
include Rules.mk

all:: .......

それから私 make allはビルドするために書くだけです。LOOPが何らかのmake all LOOP=0値である場合、それまたはオプションまたは文字列などを渡し、上記のSUBDIRSロジックを変更してこの値をチェックし、値にLOOP基づいて再帰的なmakeを行うかどうかを行う方法がある場合は、問題は解決された。LOOP=1コマンドラインにない場合、デフォルトは to になります。

しかし、私はこのタイプのロジックをプログラムするのに十分な Make を知りません。

4

1 に答える 1

2

ルールの依存関係の力を使用する必要があります。「ルート Makefile」から呼び出されるルールの依存関係にソース ファイルを追加します。これらのファイルが最新の場合、ルールが「最新」であるためフォルダー内の再帰は停止し、何も実行されません。サブディレクトリ Makefile 内のすべてのルールに .PHONY を追加しないでください。そうしないと、再帰的なルールが呼び出されます。

ルールの依存関係をいじることは、再帰呼び出しを行わないための鍵となりますが、各フォルダーのソースを変更し、ルート Makfile からのみビルドしたい場合は、別のルールを作成する必要があります。ではmake all、すべてのプロジェクトをビルドするかどうか (すべてのソースが変更されている場合) は、make binary が認識できない場合があります。

EDIT:コマンドラインによる選択

あなたは答えに近づいています。呼び出し中に環境変数を設定make allし、値をテストして、再帰的に呼び出すかどうかを決定できます。

    CC=g++
    SUBDIR=a b

    all: ${SUBDIR} main.cc
          ${CC} main.cc

    ${SUBDIR}:
    ifneq ($(MK_LOOP), 0)
        @echo "trust the recursivity !"
        ${MAKE} -C $@
    endif

    .PHONY: ${SUBDIR}

var を設定しないMK_LOOPか、0 以外の値を設定すると、0 に等しくならないため、再帰的な Makefile が呼び出されます。0 に設定すると、$(SUBDIR)ルールは何もしません

    42SH $ MK_LOOP=0 make      # no recur
    42SH $ make all
    trust the recursivity !
    42SH $ make all MK_LOOP=1                # recur by default; same as : make all
    trust the recursivity !
    42SH $
于 2013-06-04T07:55:09.527 に答える