web-dev-qa-db-ja.com

サブディレクトリでの再帰的なmake

Makefileのmakeコマンドを順序付けして、すべてのサブディレクトリmakeコマンド(サブディレクトリのMakefileで定義)で再帰的に実行するにはどうすればよいですか?

17
Alberto
  1. Makeの再帰的な使用GNU Makeマニュアルの章を参照してください。
  2. Peter Millerの有害と見なされる再帰的な作成の記事をご覧ください。
  3. ...
  4. 利益!!!

追伸 my answer から別の関連する質問へのコードスニペットは、おおよその概算として使用できます。

20

@ eldar-abusalimov、投稿した最初のリンクは、makefile knowsがサブフォルダーであると想定しています。これは常に正しいとは限りません。@ tyranitarが知りたいのはそれだと思います。その場合、そのような解決策は仕事をすることができます:(しばらく時間をかけましたが、私もそれを必要としました)

Shell=/bin/bash

all:
    @for a in $$(ls); do \
        if [ -d $$a ]; then \
            echo "processing folder $$a"; \
            $(MAKE) -C $$a; \
        fi; \
    done;
    @echo "Done!"
8
kebs

ここに私の特定のソリューションを送信します。多くのサブディレクトリを持つディレクトリがあり、そのすべてに独自のmakefileがあるとします。

root-dir\
    +----subdir1
    +----subdir2
    ...
    +----subdirn

次に、このMakefileをroot-dirにコピーします。

SUBDIRS = $(Shell ls -d */)
all:
    for dir in $(SUBDIRS) ; do \
        make -C  $$dir ; \
    done
3

上記の回答は、すべてのサブディレクトリにMakefileがある場合にうまく機能します。 Makefileを含むディレクトリでのみmakeを実行することも、再帰するレベルの数を制限することも難しくありません。私のサンプルコードでは、メイクファイルの検索を親ディレクトリのすぐ下のサブディレクトリに制限しています。 filter-outステートメント(2行目)は、このMakefileが再帰的なmakeに含まれないようにします。

MAKEFILES = $(Shell find . -maxdepth 2 -type f -name Makefile)
SUBDIRS   = $(filter-out ./,$(dir $(MAKEFILES)))

all:
    for dir in $(SUBDIRS); do \
        make -C $$dir all; \
    done
2
WiiBopp