2011-10-05 6 views
75

makeのifeq演算子を使用して論理ORを実行するにはどうすればよいですか?Makefile ifeq logicalまたは

ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

が、これらの行を統合したいと思います:

は、例えば、私は(簡体字)があります。

(はい、はい、autotoolsの、設定、などなど、あまりにも重い利きの現在の状況について、ここでのMakefile内のすべてのものを維持したいと思います)

[この質問の論理的な反対:How to Use of Multiple condition in 'ifeq' statement]

+0

可能重複[複合条件Makefileのチェック](http://stackoverflow.com/questions/ 5584872 /複合条件チェックインメークファイル)*。 –

+0

それは詐欺だとは思わない、リンクされた質問は 'ifdef'演算子を連鎖させることに関連している。この質問は' ifeq'演算子を連鎖させることに関連しているが、答えは全く異なる。 – Pat

+0

に似ています[ifneq'のための論理 'OR'演算子がありますか?](http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

答えて

68

メーリングリストのアーカイブに見られるような、

1はフィルタ機能を使用することができます。例えば

ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5)) 

フィルタX、ABはAのものが返され、等しいX.あるB

この変化は

ifneq (,$(filter $(GCC_MINOR),4 5)) 

負であります代わりに空の文字列との比較が使用されます(フィルタはGCC_MINOR d引数と一致しません)

これらの方法の欠点は、引数が単一の単語でなければならないことです。

+5

遅れているノート:上記の2つのバリエーションでは、$(GCC_MINOR)が空白の場合は最初のものが真となりますが、2番目のものは空白になります(したがって、2番目が一般的に言えばより良い解決法です)。 – John

+1

実際には、 'ifneq(、$(filter 4 5、$(GCC_MINOR)))')でなければなりません。 – Tuxdude

+2

シンプルさのためにそのまま残す方が良いでしょうか? – Jason

20

別の変数を導入することができます。これは、両方のチェックを統合doesntのが、それは、少なくとも2回に分けて、本体を置くために必要がなくなり:

do_it = 
ifeq ($(GCC_MINOR), 4) 
    do_it = yes 
endif 
ifeq ($(GCC_MINOR), 5) 
    do_it = yes 
endif 
ifdef do_it 
    CFLAGS += -fno-strict-overflow 
endif 
+4

このスケールでの保守性はあまり良くありません。/ また、私たちは規模を話し始めると、私たちはautotoolsを話していると思います。 – Pat

+0

@Pat:私は、Makefile内の1つの場所で割り当てを分けて、ifeq/else ifeq/elseを使用するのではなく、フィルタ関数を使用して行を読みにくくすることができます。 – jcarballo

12

私はそれを行うための簡潔な、賢明な方法はないと思うが、冗長な、賢明な方法がある(例えばFooのフンさん)と簡潔な、病理学的な方法は、そのような文字列4-5)の内側に表示されます(コマンドは、文字列$(GCC_MINORがいることを提供する実行されます)

ifneq (,$(findstring $(GCC_MINOR),4-5)) 
    CFLAGS += -fno-strict-overflow 
endif 

ほど。

+2

良い(悪い)おそらく、私が探していたちょっとした汚れたハックのために。ありがとう – Pat

+1

私はこれが病理学的なものではないと思っていますが、Makefileの* everything *は病理学的なものです。とてもエレガントです。私はこれを達成するために4つまたは5つの異なる方法を読んできました。あなたのことははるかに理解しやすいものです。 –

0
ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

あなたは、この場合に使用することを検討することができますもう一つは、次のとおりです。私は別のconfigまたはConfigureを維持したくないので

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") 

# -Wstrict-overflow: http://www.airs.com/blog/archives/120 
ifeq ($(GCC42_OR_LATER),1) 
    CFLAGS += -Wstrict-overflow 
endif 

私は実際に私のコードで同じを使用しています。

しかし、GNU make(gmake)と同様に、移植性のある非貧血性のmakeを使用し、Posixのmakeは使用しないでください。

そして、論理的な問題ANDORは扱いません。

3

ここで、より柔軟な変異体は、外部シェルを使用するが、任意の条件を確認することを可能にする:*の

ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ 
        ".$(GCC_MINOR)" = .5 -o \ 
        ".$(TODAY)"  = .Friday && printf "true"), true) 
    CFLAGS += -fno-strict-overflow 
endif