Makeの$(shell ...)を介してmakefile変数をエコーする方法

Makeの$(shell ...)を介してmakefile変数をエコーする方法

GNUメイクファイル。 makefileにはいくつかのテストがあります(リンクされたファイルの約65行目)。

UNAME = uname

MACHINE ?= $(shell $(UNAME) -m)
SYSTEM ?= $(shell $(UNAME) -s)

IS_X86 = $(shell echo $MACHINE | $(EGREP) -c "i.86|x86|i86|amd64")
IS_X86_64 = $(shell echo $MACHINE | $(EGREP) -c "_64|d64")

MinGWとそのシェルではmakefileを正しく設定できませんIS_X86。テストブロックの後に以下を追加すると:IS_X86_64sh

$(info MACHINE: $(MACHINE))
$(info SYSTEM: $(SYSTEM))
$(info IS_X86: $(IS_X86))
$(info IS_X86_64: $(IS_X86_64))

その代価として私が得ることは次のとおりです。

$ make
MACHINE: i686
SYSTEM: MINGW32_NT-6.1
IS_X86: 0
IS_X86_64: 0

MinGWが一致できると仮定するため、i686MinGWの下のコマンドまたは変数に問題があるようですi.86echo

また、以下を試しましたが、満足できませんでした。

$(shell echo $(MACHINE) ...)
$(shell echo $((MACHINE)) ...)

テストする前に変数の拡張を強制しようとしました。

MACHINE := $(MACHINE)

最後に一時的に使ってみましたが、何の楽しみもありませんでした。

MTEXT ?= $(shell $(UNAME) -m)
MACHINE := $(MTEXT)

テストはBSD、Linux、OS X、およびSolarisでうまく動作します。 Cygwinでも動作します。

echoMinGWでecho makefile変数を使用するためのヒントは何ですか?

答え1

bashではなくmingw環境で奇妙なシェルを使用しているようです。それともegrepの奇妙なバージョンです。

これらのegrepシェル呼び出しをGNU make条件文に置き換えることで、この問題を解決できます。たとえば、次のようになります。

ifeq (,$(filter %686 %x86 %i86 %amd64,$(MACHINE)))
  IS_X86 = 0
else
  IS_X86 = 1
endif

または、以下に基づいて何かを作成することもできます。$(findstring ...)または他のGNU make text関数

現在の問題を解決することに加えて、これらのGNU make言語機能を使用することは、左と右を分岐するよりも効率的です$(shell)

関連情報