2012-04-15 2 views
0

を作るには、私が作るルールがあるとします。コード生成とルールの拡張

auto1.srcauto2.srcauto3.srcなどのために、たくさんのファイルを作成します
.PHONY:gen 
gen: auto.template 
     generate-sources auto.template 

私は今、このように、*.srcファイルからターゲットをビルドするためのルールを持っている場合:

$(patsubst %.src,%.target,$(wildcard *.src)): %.target: %.src 
     build $< > [email protected] 

は、どのように私は最初genのルールを実行した後、第2のルールテンプレートの前提条件を拡大するために作る伝えることができますか? GNU拡張は大歓迎です。

:私は makeの呼び出しでそれを維持したいと思います。これに対する些細な解決策は、genが処理された後に第2のルールをMakefile.secondrunに置き換えて$(MAKE) -f Makefile.secondrunと呼ぶことです。しかし、より良い選択肢があるかどうかは疑問でした。

+0

'gen'で作成されていない他の' .src'ファイルがありますか? – Beta

+0

@Beta:おそらく、はい。 – bitmask

+0

私の答えは、あなたがそれらの他者をどのように構築するかによって、調整が必要な場合があります。 – Beta

答えて

2

は、ベータ版の答えをオフに構築、ここであなたはそれを再帰的なメイクと同じものではありませんGNUでが作るリメイクメイクファイルを使用して行うことができる方法です。代わりに、メインメイクファイルのルールを使用してインクルードされたmakefileを更新し、は元のmakeインスタンスを再起動します。これは、通常、依存ファイルが生成されて使用される方法です(*.d)。

# Get the list of auto-generated sources. If this file doesn't exist, or if it is older 
# than auto.template, it will get built using the rule defined below, according to the 
# standard behavior of GNU make. If autosrcs.mk is rebuilt, GNU make will automatically 
# restart itself after autosrcs.mk is updated. 

include autosrcs.mk 

# Once we have the list of auto-generated sources, getting the list of targets to build 
# from them is a simple pattern substitution. 

TARGETS=$(patsubst %.src,%.target,$(AUTO_SRCS)) 

all: $(TARGETS) 

# Rule describing how to build autosrcs.mk. This generates the sources, then computes 
# the list of autogenerated sources and writes that to autosrcs.mk in the form of a 
# make variable. Note that we use *shell* constructs to get the list of sources, not 
# make constructs like $(wildcard), which could be expanded at the wrong time relative 
# to when the source files are actually created. 

autosrcs.mk: auto.template 
     ./generate-sources auto.template 
     echo "AUTO_SRCS=`echo *.src`" > autosrcs.mk 

# How to build *.target files from *.src files. 

%.target: %.src 
     @echo 'build $< > [email protected]' 
+0

偉大な答え。ありがとう。しかし、私はまだ質問があります。単に 'autosrcs.mk'に触れ、' Makefile'の中に 'AUTO_SRCS:= $(wildcard * .src)'を置くだけで十分でしょうか? – bitmask

+0

@bitmask:はい、この場合も同様に動作します。私は答えがわかりました。なぜなら、それほど神秘的ではなく、何らかの理由で$(ワイルドカード)が不十分な場合、自動生成されたソースのリストを定義するために任意の複雑なことを行うことができるからです。 –

+0

この手法の欠点は、依存関係グラフを決定するためにいくつかのレシピが実行されることです。理想的にはこれらは2つの別々のフェーズにする必要があります。 (この問題が発生している自分のMakefileでは、これらのレシピは高価です) – reinierpost

1

短い回答:できません。 makeは、ルールを実行する前に実行しなければならないすべてのルールを決定します。

長い回答:多分可能です。あなたが言うように、あなたはmakefileがinclude(私はあなたを見ています、Jack Kelly)というファイルをビルドすることで、再帰的なMakeを明示的に、あるいは秘密に使うことができます。または、何とかgenが作成するファイルのリストを入手できたら、その周りにルールを書くことができます。それとも、このように信仰の飛躍を取ることができる:

%.target: %.src 
     build $< > [email protected] 

%.src: gen; 
+0

さて、私は再帰呼び出しをしなければならないと思います。たぶんそれはそれほど悪くないでしょう。しかし、おそらく誰かがそれを行う方法を思いつくので、私は彼らにチャンスを与え、質問を開いたままにしておきます。 – bitmask

関連する問題