GNU make - Como concatenar a variável dependendo do resultado do comando do shell (versão do GCC)?

1

Eu quero adicionar outra opção para a variável make CFLAGS, dependendo do resultado de um comando shell que eu quero executar fora de uma receita na minha seção "configuração" do makefile. Foi isso que eu criei:

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

No começo eu executo o comando com a função shell make como você vê acima. Se eu executar o acima, ele não adicionará este sinalizador de definição. Eu intencionalmente faço isso no Linux com o GCC Versão 5.4.0. Eu acredito que isso está errado porque então eu tenho que criar um novo shell para executar a instrução condicional. Nesse novo shell, a variável GCC_VERSION não existirá. Eu posso estar errado.

Se eu fizer isso, então (tudo em um shell):

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

recebo erro:

*** recipe commences before first target.  Stop.

Sim, muito confuso.

Se alguém puder ajudar, eu agradeceria. Obrigado.

    
por Nik-Lz 20.09.2017 / 20:30

1 resposta

3

Existem muitas soluções, incluindo esta. Em seu Makefile use

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

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

Observe, em particular, que você precisa usar $$ para cada $ em seu script de shell. Este shell ecoa 0 se a comparação da string com 5.0 for verdadeira, senão 1, e isso é salvo na variável VERSION5 .

Em seguida, o teste ifeq no Makefile compara a variável com 0 e, se corresponder, edita a variável CFLAGS .

    
por 20.09.2017 / 21:40