1. ホーム
  2. makefile

[解決済み] メイクファイル ifeq 論理的または

2022-05-17 13:30:48

質問

makeの論理和はどのように行うのですか? ifeq 演算子を使ってどのように論理和をとるのでしょうか?

例:(簡略化)しています。

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

となっていますが、これらの行を一本化したいと思います。

(そうそう、autotools, configure, etc etc.; 現状では強引すぎるので、ここではすべてをMakefile内に収めたいと思います)

[この質問の論理的な反対。 ifeq'ステートメントで複数の条件を使用する方法 ]

どのように解決するのですか?

メーリングリストのアーカイブにある通りです。

を使用することができます。 filter という関数があります。

例えば

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

filter X, A B はA,BのうちXと等しいものを返します。 上の例では関係ないが、これはXOR演算であることに注意。つまり、代わりに以下のようなものがあるとします。

ifeq (4, $(filter 4, $(VAR1) $(VAR2)))

そして、次のようにします。 make VAR1=4 VAR2=4 とすると、フィルタは 4 4 とは等しくない 4 .

代わりにOR演算を行うバリエーションは

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

ここで、空文字列との負の比較は代わりに使われます ( filter の場合、空文字列を返します。 GCC_MINOR が引数にマッチしない場合は空文字列を返す)。を使うと VAR1 / VAR2 の例では、このようになります。

ifneq (, $(filter 4, $(VAR1) $(VAR2)))

これらのメソッドの欠点は、これらの引数が常に単一の単語であることを確認しなければならないことです。例えば、もし VAR14 foo の場合、フィルタリングの結果はまだ 4 であり ifneq の式はまだ真である。もし VAR14 5 である場合、フィルタリングの結果は 4 5 となり ifneq の式は真になります。

簡単な代替案としては、同じ操作を単に ifeqelse ifeq の分岐で、例えばこんな感じ。

ifeq ($(GCC_MINOR),4)
    @echo Supported version
else ifeq ($(GCC_MINOR),5)
    @echo Supported version
else
    @echo Unsupported version
endif