2

以下の GNU makefile の例について質問があります。

.PHONY: $(subdirs) build x y

subdirs =  a b c

build: x y

x: target=prepare
x: $(subdirs)

y: target=build
y: $(subdirs)

$(subdirs):
    $(make) -f $@/makefile $(target)

make を実行すると、サブディレクトリごとにターゲット 'prepare' を指定してからターゲット 'build' を指定して make が呼び出されることを期待しています。残念ながら、$(subdirs) ターゲットは 1 回実行されます ('prepare' ターゲットを作成します) が、'build' ターゲットに対して再度実行されることはありません。

ルール x の場合、make は $(subdirs) ターゲットを実行する必要があると判断しますが、ルール y の場合、$(subdirs) ターゲットは最新です。

これを修正する方法はありますか?

ありがとう!

4

2 に答える 2

4

あなたが投稿したmakefileは、ターゲットのコマンドが2回実行されることを想定しているようです$(subdirs).1回x目と2回目y. 残念ながら、makefile と依存関係はそうではありません。ターゲットのコマンドは、make の呼び出しごとに最大 1 回実行されます (make の実行中に makefile が変更された場合などの異常な状況を除きます)。

以下は、UNIX スタイルのシステムで動作します。サブディレクトリ make をループで次々に実行するだけです。

subdirs = a b c

.PHONY: build
build:
    for dir in $(subdirs); do \
      $(MAKE) -f $$dir/makefile prepare; \
      $(MAKE) -f $$dir/makefile build; \
    done

サブディレクトリを並行して構築する必要がある場合は、次を使用できます。

subdirs = a b c

.PHONY: build
build: $(addprefix build-,$(subdirs))

define submake-rule
  .PHONY: build-$(1)
  build-$(1):
    $(MAKE) -f $(1)/makefile prepare
    $(MAKE) -f $(1)/makefile build
endef

$(foreach dir,$(subdirs),$(eval $(call submake-rule,$(dir))))

build-<dirname>これにより、の各アイテムのルールが定義され$(subdirs)buildターゲットがそれらすべてに依存するようになります。追加のボーナスとして、これは Windows にも移植可能で、Cygwin の bash シェルなどを使用する必要はありません。難点は、少しわかりにくいところです。

于 2009-08-02T17:11:44.870 に答える
1

Villeはあなたの試みよりもの方法を好みます。
さまざまな引数を使用して複数回実行するには、一般に 2 つの方法があります。

  1. 外側のスクリプトを作成します (または、Ville外側の Makefile 内でのアイデアの反復のように)
    • all実行する各サブ Makefile にルールを記述し、その後preparebuild
    • prepare+buildこれにより、サブ Makefile 内の組み合わせが統合され、外側の Makefile から
      実行するだけで、allよりモジュール化されます。

これは、不必要に複雑な問題を簡単に解決できる一例です。Makefile

于 2009-08-02T17:26:39.063 に答える