2015-01-08 15 views
7

言語に依存するターゲットを作成します。特に:1つのソースファイルがあり、対応する言語フォルダに追加する異なるオブジェクトを作成したい。その単一のソースファイルはC-Flagsで異なり、コンパイラが得られます。私が静的な方法で使っている限り、それはかなりうまく動作します。GNU Makefile - 1つの依存関係を持つ複数のターゲットを持つパターンルールは、最初のもの以外のすべてのターゲットを無視します。

de/info.o en/info.o es/info.o : info.c 
    $(ECHO)  (DEP) $< for [email protected] 

私は、ファイルに応じて新しい言語を追加する場合は、もう少しダイナミックであればいいと思いました。だから私は、以下のようにワイルドカードを使用しました:

de/%.o en/%.o es/%.o : %.c 
    $(ECHO)  (DEP) $< for [email protected] 

しかし、今では最初のターゲットを作成して残りを無視します。 Make-Debugは次のものを出力します。

Successfully remade target file `de/info.o'. 
Considering target file `en/info.o'. 
File `en/info.o' was considered already. 

ちょうどの場合:いいえ、オブジェクトは存在しません。したがって、ターゲットは存在しませんが、既存の依存関係が存在するため、makeはルールを実行する必要があります。

EDIT:その問題の解決策を見つけました。触発され

define FOO 

$(1)/%.o : %.c 
    $(ECHO)  $$< for $(1) 

endef 

$(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang)))) 

http://www.gnu.org/software/make/manual/make.html#Eval-Function

答えて

6

パターンルールが暗黙のルールとは異なる動作します。暗黙のルールながらなど

a b c: d 
     command 

長い表記

a: d 
     command 
b: d 
     command 
c: d 
     command 

このパターンルールに保持していないと等価です。複数ターゲットのパターンルールは、すべてのターゲットをcommandという単一呼び出しで構築するために明示的に必要です。したがって、あなたは、関連するドキュメントは、パターンに10.5.1はじめに発見された

$ cat GNUmakefile 
all: de/x.o en/x.o es/x.o 

de/%.o: %.c 
     @echo [email protected] from $< 
en/%.o: %.c 
     @echo [email protected] from $< 
es/%.o: %.c 
     @echo [email protected] from $< 
$ gmake 
de/x.o from x.c 
en/x.o from x.c 
es/x.o from x.c 

記述する必要がありますすることはGNU作るマニュアルのルール:

パターンルールは複数のターゲットを有することができます。通常のルールとは異なり、これは同じ前提条件とレシピを持つ多くの異なるルールとして機能しません。パターンルールに複数のターゲットがある場合、makeはルールのレシピがすべてのターゲットを作成する責任があることを認識します。レシピはすべてのターゲットを作成するために1回だけ実行されます。ターゲットと一致するパターンルールを検索する場合、ルールを必要とするターゲットと一致するルール以外のターゲットパターンは付随的です。問題のファイルにレシピと前提条件を与えることについてのみ心配してください。ただし、このファイルのレシピが実行されると、他のターゲットは更新されたものとしてマークされます。

+0

ああ、はい私はこれを読んで...しかし、私はこの問題のための信頼できる解決策があると思った。なぜなら、言語を追加するたびにターゲットを追加する必要があるからです。 – Mario

+2

あなたのコマンドが複数行である場合、 'commands'という名前の複数行マクロを定義し、' @ $(call commands) 'でそれを使用することを検討してください。新しい言語はそれぞれ2行追加するだけです。 – Jens

+1

マクロは良いヒントでした! '$(foreach、、)'、 '$(eval)'、 '$(call)'の組み合わせが問題を解決しました!私は最初の投稿を編集する。 – Mario

関連する問題