Como fazer echo da variável makefile através do Make's $ (shell…)

2

Eu tenho um makefile do GNU . O makefile tem alguns testes (em torno da linha 65 do arquivo vinculado):

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")

O makefile não está conseguindo definir IS_X86 e IS_X86_64 corretamente sob MinGW e seu sh shell. Quando adiciono o seguinte após o bloco de testes:

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

E eu recebo em retorno:

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

Estou supondo que o MinGW possa corresponder i686 a i.86 , por isso acredito que há algo errado com o comando echo ou a variável em MinGW.

Eu também tentei o seguinte sem alegria:

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

Eu até tentei forçar a expansão da variável antes dos testes:

MACHINE := $(MACHINE)

Por fim, tentei usar um temporário sem alegria:

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

Os testes funcionam bem sob os BSDs, Linux, OS X e Solaris. Funciona mesmo sob o Cygwin.

Qual é o truque de usar echo em MinGW para fazer o eco de uma variável makefile?

    
por jww 25.07.2015 / 14:43

1 resposta

1

Parece que você está usando um shell estranho em seu ambiente mingw - e não bash. Ou uma versão estranha do egrep.

Você pode resolver isso substituindo as chamadas de shell do egrep com as condicionais do GNU make, por exemplo:

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

Como alternativa, você pode criar algo com base em $(findstring ...) ou outro GNU para criar funções de texto .

Além de trabalhar em torno do seu problema atual, usar esse recurso de linguagem GNU make também é mais eficiente do que forking left e right via $(shell) .

    
por 25.07.2015 / 15:10