言語に依存するターゲットを作成します。特に: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
ああ、はい私はこれを読んで...しかし、私はこの問題のための信頼できる解決策があると思った。なぜなら、言語を追加するたびにターゲットを追加する必要があるからです。 – Mario
あなたのコマンドが複数行である場合、 'commands'という名前の複数行マクロを定義し、' @ $(call commands) 'でそれを使用することを検討してください。新しい言語はそれぞれ2行追加するだけです。 – Jens
マクロは良いヒントでした! '$(foreach、、)'、 '$(eval)'、 '$(call)'の組み合わせが問題を解決しました!私は最初の投稿を編集する。 – Mario