É possível usar expansão de parâmetro bash no Makefile?

0

Meu Makefile:

FULL_VERSION ?= 1.2.3
MINOR_VERSION := $(shell echo "${FULL_VERSION%.*}")

test:
    echo $(MINOR_VERSION)

A execução de make test não dá nada, quero obter 1.2 .

Eu sei que posso obtê-lo via sed / grep, mas estou procurando uma solução mais elegante, parece que não há nada mais simples que a expansão do parâmetro bash

    
por csandanov 03.08.2018 / 07:12

2 respostas

1

Você precisaria primeiro armazenar o valor em uma variável do shell:

MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")

(assumindo que $(FULL_VERSION) não contém aspas simples)

Agora, isso chama sh , não bash . ${var%pattern} é um operador padrão sh (vem de ksh ).

Se você quiser usar operadores bash específicos, precisará informar make para chamar bash em vez de sh com

SHELL = bash
Cuidado, porém, que muitos sistemas não têm bash instalado por padrão, o que tornaria seu Makefile não-portátil (mas, alguns sistemas não têm o GNU make e você já está usando alguns GNUisms lá ).

    
por 03.08.2018 / 07:31
2

Você pode fazer isso com funções embutidas (suponha que você esteja usando o GNU make):

VER=1.2.3
MINORVERTMP=$(subst ., ,${VER})
MINORVER=$(word 1,${MINORVERTMP}).$(word 2,${MINORVERTMP})


all:
    @echo ${MINORVER}

Se você pode usar bmake (fazer BSD) pode ter mais (e talvez mais simples) possibilidades:

VER=1.2.3

all: test1 test2

test1:
    # simple regular expression-based replace like sed
    @echo $@: ${VER:C,([^\.]*)\.([^\.]*).*,.,}

test2:
    # replace all dot to spaces (S),
    # print first and second element (:[1..2])
    # with dot separator (ts.)
    @echo $@: ${VER:S,., ,g:[1..2]:ts.}
    
por 03.08.2018 / 08:56

Tags