私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_64
sh
$(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が一致できると仮定するため、i686
MinGWの下のコマンドまたは変数に問題があるようですi.86
。echo
また、以下を試しましたが、満足できませんでした。
$(shell echo $(MACHINE) ...)
$(shell echo $((MACHINE)) ...)
テストする前に変数の拡張を強制しようとしました。
MACHINE := $(MACHINE)
最後に一時的に使ってみましたが、何の楽しみもありませんでした。
MTEXT ?= $(shell $(UNAME) -m)
MACHINE := $(MTEXT)
テストはBSD、Linux、OS X、およびSolarisでうまく動作します。 Cygwinでも動作します。
echo
MinGWで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)
。