2016-06-12 29 views
1

私は多くのターゲットを持つMakefileを持っており、各ターゲットのレシピはかなり似ています。同様のレシピでMakefileターゲットの重複を避けるには?

この複製をすべて避けたいと思います。私は以下のようなものを持っていたいと思います(これは有効な構文ではなく、これは私の意図を表しています)。

TARGET_NAME: 
    gcc $(TARGET_NAME).c -o $(TARGET_NAME) 
    mv $(TARGET_NAME) ~/bin 

このようなことは可能ですか?そうでなければ、私は書くことができる最高のMakefileは何ですか?それはレシピの重複を最小限に抑えることができますか?

+0

@betaで既に指摘されているように、あなたが作るファイルを移動するので、あなたの 'Makefile'は壊れてしまいます。なぜなら、必要であるかどうかにかかわらず、毎回再作成されるからです。また、 'gcc'に対する' -o'オプションは、優位にサブディレクトリを取ることができます。 'bin /%:%.c; gcc $ <-o $ @ ' – tripleee

答えて

4

あなたのターゲット(foobar、など)彼らのソースファイルに依存しない(foofoo.cなどに依存しない)ので、ソースコードを変更すると発生しませんので、あなたのメイクファイルが間違っています再建される目標。

また、メイクファイルにはfooというファイルが作成されていますが、レシピは実際には同じものではないファイル~/bin/fooを作成します。

とにかく、これはpattern rulesがためのものですまさにです:

EXES = foo bar baz 

all: $(addprefix $(HOME)/bin/,$(EXES)) 

$(HOME)/bin/%:: %.c 
     gcc $< -o [email protected] 

(元の私の思考Oを指摘してベータ版のおかげで)

+2

[自分のルール](http://make.mad-scientist.net/papers/rules-of-makefiles/)に違反していませんか? 6の2/6は正確です。ターゲットパターンはビルドされているものの実際の名前と一致する必要があります( '〜/ bin /%')。 – Beta

+0

[暗黙ルール](https://www.gnu。)を使用しないようにするには、[静的パターンルール](https://www.gnu.org/software/make/manual/html_node/Static-Usage.html)を使用する必要があります。 org/software/make/manual/html_node/Static-versus-Implicit.html)を参照してください。そのようなもの: 'foo bar baz:%:%.c' – jml

+0

あなたはそうです。私はそれが 'mv'ではなく' cp'だと思っていました。私は更新します。 "静的パターンルール"について:私はいつもあなたがそれらを使うべきであるというこのアドバイスを見ています。私は事実上それらを使用しません。実際には、通常のパターンルールを使用し、別の方法で構築する必要があるターゲットのサブセットがある場合は、静的パターンルールのみを使用します。私はそれがスタイル/意見のものだと思う。私は人々に、正当な理由なしにそれらを使うべきであると言いません。 – MadScientist

2

makeルールは、実際には複数のターゲットを一致させることができます。

foo bar baz: 
    gcc [email protected] -o [email protected] 
    mv [email protected] ~/bin 

ただし、ルールにおける依存関係を明示的に行う必要があります。

foo: foo.c 
bar: bar.c 
baz: baz.c 

foo bar baz: 
    gcc $< -o [email protected] 
    mv [email protected] ~/bin 

最初の3行は、依存関係を実際に構築するアクションがない場合にのみ指定します。 gcc:gcc -MM foo.cの助けを借りてこれらを生成すると、foo.cのルールが出力されます。

関連する問題