web-dev-qa-db-ja.com

各サブディレクトリでmakeを実行します

いくつかのサブディレクトリ(root_dir)を含むディレクトリ(subdir1, subdir2, ...)があります。

Makefileを使用して、root_dirの各ディレクトリでmakeを実行します。 (明らかに、subdir...のそれぞれが独自のMakefile内にあると想定されていました)。

したがって、本質的に2つの質問があります。

  1. Makefileでディレクトリのリストを取得する方法(自動)
  2. Makeファイル内の各ディレクトリに対してmakeを実行する方法は?

特定のディレクトリでmakeを実行するために知っているので、次のことを行うことに注意してください。

$(MAKE) -C subdir
35
Alex

単一のレシピでforループ内でサブメイクを実行すると、さまざまな問題が発生します。複数のサブディレクトリを作成する最良の方法は次のとおりです。

SUBDIRS := $(wildcard */.)

all: $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@

.PHONY: all $(SUBDIRS)

(これを指摘するためにGNU make specific;使用しているmakeのバージョンに関する制限について言及していませんでした)。

[〜#〜] eta [〜#〜]これは、複数のトップレベルのターゲットをサポートするバージョンです。

TOPTARGETS := all clean

SUBDIRS := $(wildcard */.)

$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@ $(MAKECMDGOALS)

.PHONY: $(TOPTARGETS) $(SUBDIRS)
73
MadScientist

これを試して :

SUBDIRS = foo bar baz

subdirs:
    for dir in $(SUBDIRS); do \
        $(MAKE) -C $$dir; \
    done

これはあなたを助けるかもしれません link

編集:あなたも行うことができます:

最も簡単な方法は次のとおりです。

CODE_DIR = code

.PHONY: project_code

project_code:
       $(MAKE) -C $(CODE_DIR)

.PHONYルールは、project_codeがビルドする必要のあるファイルではないことを意味し、-Cフラグはディレクトリの変更を示します(makeを呼び出す前にcdコードを実行するのと同じです)。コードMakefileで他のターゲットを呼び出すために同じアプローチを使用できます。

例えば:

clean:
   $(MAKE) -C $(CODE_DIR) clean

ソース

5
avignat

私はMAKECMDGOALS変数を知らず、MadScientistが複数のトップレベルターゲットの独自の実装を持っていることを見落としていたため、別の実装を作成しました。誰かが役に立つと思うかもしれません。

SUBDIRS := $(wildcard */.)

define submake
        for d in $(SUBDIRS);                  \
        do                                    \
                $(MAKE) $(1) --directory=$$d; \
        done
endef

all:
        $(call submake,$@)

install:
        $(call submake,$@)

.PHONY: all install $(SUBDIRS)
1
robertm.tum

prorabというライブラリがあります。GNU makeは、サブディレクトリにスタンドアロンのメイクファイルを含めることをサポートします。

Githubに関するいくつかの情報: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md

基本的に、prorabを使用してサブディレクトリ内のすべてのmakefileを呼び出すと、次のようになります。

include prorab.mk

$(eval $(prorab-build-subdirs))
1
igagis