Можно ли использовать расширение параметра Bash в Makefile?

Измените следующую строку:

grepFails=$(egrep "\\def$myVar\>" myFile)

На:

grepFails=$(egrep "\\\\def\\$myVar\>" myFile)

Проблема заключалась в том, что вы неправильно экранировали \ в подоболочке.

Чтобы понять, попробуйте запустить eval echo "\\\\" . Вы заметите, что результат будет \ из-за двойной оценки.

2
03.08.2018, 08:12
2 ответа

Вам нужно сначала сохранить значение в переменной оболочки:

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

(при условии, что $(FULL_VERSION)не содержит одинарных кавычек)

Теперь это вызывает sh, а не bash. ${var%pattern}является стандартным shоператором (происходит отksh).

Если вы хотите использоватьbash-конкретных операторов, вам нужно указать make, чтобы он звонил bashвместо shс помощью

.
SHELL = bash

Однако имейте в виду, что на многих системах bashне установлено по умолчанию, что сделало бы ваш Makefile не -переносимым (, но с другой стороны, на некоторых системах также нет GNU make, и вы уже используя там некоторые GNU-измы )).

11
27.01.2020, 21:51

Вы можете сделать это с помощью встроенных функций (при условии, что вы используете GNU make):

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


all:
    @echo ${MINORVER}

Если вы можете использоватьbmake(BSD make ), у вас может быть больше (и, возможно, более простые )возможности:

VER=1.2.3

all: test1 test2

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

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.}
4
27.01.2020, 21:51

Теги

Похожие вопросы