2016-08-06 8 views
7

変数が空の場合は変数を設定します。私は、このようにしてみました:変数が空の場合、Makefileが設定されます

.... 
TEST := $(something) 
... 
TEST ?= $(something else) 

最初$(something)が空の文字列、ただし条件付きの割り当てを返すことがあり=空の場合は、前の変数が、ないように設定されていない場合にのみ機能します?。

空であれば変数を設定するための優雅なソリューションはありますか?


EDIT 私は、このソリューションが見つかりました:

.... 
TEST := $(something) 
... 
TEST += $(something else) 
TEST := $(word 1, $(TEST)) 

を私はもっとエレガントなものがあるだろうと思います。

+0

多くの 'make'プログラムには条件があり、変数をテストする機能もあります。 GNU Makeについては、ドキュメントを読んでください(https://www.gnu.org/software/make/manual/make.html)。 –

+0

'何か'が何であるかによって 'ifeq(、$(TEST))'を使うことができます。もし 'something'がシェルコマンドなら' something ||何か他の。 – tripleee

+1

これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)である可能性があります。故意の例は使用しないでください。 – user657267

答えて

26

空であれば変数を設定するための洗練されたソリューションはありますか?

GNU makeは、洗練されたソリューションとしてはほとんど知られていません。トラップドアと地雷がエレガントであることが分かっていない限り。私はあなたが望むものを達成するために二つの方法を知っている:

  1. ifeq/endif標準溶液:

    ifeq ($(TEST),) 
    TEST := $(something else) 
    endif 
    
  2. $(if)機能を使用します。

    TEST := $(if $(TEST),$(TEST),$(something else)) 
    

    一つは試すことができますその構造体を関数にパッケージ化することもできますが、これはお勧めできません。この関数には,が含まれていると、時には$(something else)が壊れてしまうという隠れた落とし穴があります(これには回避策がありません)。 ($(if)のような組み込み関数は,バグの影響を受けている。)

エレガンステストは、あなた次第です。 GNU makeから

0

、章7.2、条件文の構文:変数と関数の複雑な展開、拡張からの値の結果は、あなたが検討するとき

は「多くの場合、あなたは変数が空でない値を持っているかどうかをテストしたいです空、実際に空白文字を含めることができ、したがって、空と見られていないただし、あなたは空でない値として空白の解釈を避けるために、ストリップの機能を使用することができますたとえば、:。。

ifeq ($(strip $(foo)),) 
text-if-empty 
endif 

テキスト-IFを評価しますたとえexpansio $(foo)のnは空白文字を含んでいます。 "

関連する問題