Как правильно экранировать $ в макросах Makefile - PullRequest
0 голосов
/ 28 марта 2019

Я пишу Makefile, в котором у меня есть функция, которая вызывается в foreach. В этой функции я хочу использовать команду awk, в которой я хотел бы использовать $3. Однако я не знаю, как правильно сбежать $.

Вот упрощенный код. (input.txt имеет три столбца, а третий столбец является значением)

define MyFunction
%/filtered$(1).txt: %/input.txt
    cat $$*/input.txt | awk '{ if ($$3 < $(1)) print }'

endef

$(foreach threshold,1 2 3,$(eval $(call MyFunction,$(threshold))))

Когда я выполняю приведенный выше код, я получаю ошибку

awk: syntax error at source line 1

Я пытался изменить число $ с или экранирование с обратной косой чертой \. Это не помогло ...

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 28 марта 2019

Ваша проблема в том, что функция call оценит макрос один раз, затем при запуске рецепта он будет снова вычислен, а затем команде awk нужно увидеть $. Таким образом, вы должны избежать этого дважды , используя $$$$:

define MyFunction
%/filtered$(1).txt: %/input.txt
        cat $$*/input.txt | awk '{ if ($$$$3 < $(1)) print }'

endef

Если вы хотите увидеть, что делает разбор, хороший трюк - это заменить ваш eval на info:

$(foreach threshold,1 2 3,$(info $(call MyFunction,$(threshold))))
$(foreach threshold,1 2 3,$(eval $(call MyFunction,$(threshold))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...