2017-10-29 14 views
0

はこの短いMakefileを考えてみてください:選択引数

ARGS  := -foo 
my_ARGS := -bar 
their_ARGS := 

all: your.foo my.foo their.foo 

%.foo: 
    @echo $*: $(call _choose_,ARGS,$*) 

_isndef_ = $(findstring undefined,$(origin $1)) 
_choose_ = $(value $(if $(call _isndef_,$2_$1),$1,$2_$1)) 

をそれが正しく出力:

your: -foo 
my: -bar 
their: 

私の質問:

  • が、これはautomakeはそれをしないという方法ですか? (LDADDおよびrmt_LDADD
  • これを行う方法はこれよりも短く、
+0

:あなたは「空と上書き」する場合は、target-specific variablesを使用することができますhttp://make.mad-scientist.net/constructed-macro-names/

:例えば、ここ

ARGS := -foo my_ARGS := -bar their_ARGS := all: your.foo my.foo their.foo %.foo: @echo $*: $(or $($*_ARGS),$(ARGS)) 

詳細情報:それはただ単にだろう構成管理で中心的な質問(明確な回答なし)を中心にしているので、[softwareengineering.stackexchange.com](http://softwareengineering.stackexchange.com)にもっと適しています。 – Vroomfondel

答えて

1

なぜ変数名の構成を使用しないのですか?私はあなたの2番目の質問があると思い

ARGS := -foo 

my.foo: ARGS := -bar 
their.foo: ARGS := 

all: your.foo my.foo their.foo 

%.foo: 
     @echo $*: $(ARGS) 
+0

私が正しいとすれば、あなたのバージョンでは、argsが空の文字列に展開されるので最後の行に 'their:-foo'が生成されます。したがって、定義チェック – arfbtwn

+0

非常にうれしく、ターゲット固有の変数をパターンルールの具体的な例 - なぜLDADD変数がそのように機能しないのか疑問に思う? – arfbtwn

+1

あなたはautomakeを意味しますか? automakeは、少なくともこの構文を使って、make、しかしターゲット固有の変数で動作するPOSIX準拠のmakefileを生成するので、GNU makeに固有のものです。 – MadScientist

関連する問題