GNU make - シェルコマンドの結果(GCCバージョン)に基づいて変数に接続する方法は?

GNU make - シェルコマンドの結果(GCCバージョン)に基づいて変数に接続する方法は?

makefileの「設定」セクションのレシピの外で実行したいシェルコマンドの結果に応じて、CFLAGS make変数に別のオプションを追加したいと思います。これが私が思いついたものです:

GCC_VERSION := $(shell gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
    CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi

まず、上記のようにシェルmake関数を使用してコマンドを実行します。上記のコードを実行すると、この定義フラグは追加されません。これを行うには、特にLinuxでGCCバージョン5.4.0を使用しています。条件文を実行するには新しいシェルを作成する必要があるため、これは間違っているようです。新しいシェルにはGCC_VERSION変数は存在しません。しかし、私は間違っているかもしれません。

私がこれが好きなら(すべて1つのシェルで):

$(shell GCC_VERSION=$(gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
    CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi)

エラーが発生します。

*** recipe commences before first target.  Stop.

はい、とても混乱しています。

誰でも助けることができれば幸いです。ありがとうございます。

答え1

このソリューションを含む多くのソリューションがあります。 Makefileで使用

VERSION5 := $(shell \
 GCC_VERSION=$$(gcc -dumpversion); \
 [[ $$GCC_VERSION > 5.0 ]]; \
 echo $$? )

ifeq (${VERSION5}, 0)
  CFLAGS += -D _POSIX_C_SOURCE=199309L
endif

特に、シェルスクリプトのすべての項目に使用する必要があります$$$文字列比較が5.0trueの場合、シェルは0をエコーし​​、そうでない場合は1をエコーし​​てmake変数に保存しますVERSION5

その後、Makefileのテストはifeq変数を0と比較し、CFLAGS一致する場合は変数を編集します。

関連情報