Я пытаюсь распечатать версию файла исполнения файла make при его запуске. Я использую тег $Id$, который расширяется до $Id: //repository/path/check.make#6 $ и т. П., И я хочу напечатать //repository/path/check.make#6 в файл (в данный момент использующий echo). Я не могу понять, как заставить make воспринимать # как часть строки, а не как начало комментария. Я попытался:

str1 = $(subst \#,\\\#,'$Id: //repository/path/check.make#6 $')

И другие варианты, но я продолжаю получать:

 unterminated call to function `subst': missing `)'.  Stop.
0
Tim 21 Июл 2020 в 18:54

3 ответа

Лучший ответ

Вы не можете иметь неэкранированный литерал # в назначении make, и его нельзя интерпретировать как символ комментария. Но в качестве хака вы можете заставить оболочку извлечь этот токен из текущего Makefile.

# $Id: //repository/path/check.make#6 $
str1 := $(shell sed '/[$$]Id[$$:]/!d;s/^\# [$$]Id: \(.*\) [$$].*/\1/' Makefile)

Скрипт sed ищет маркер $Id$ или $Id: в самом файле Makefile с помощью регулярного выражения, которое не соответствует самому себе; удвоенный знак доллара - это то, как вы вставляете буквенный знак доллара в Makefile. Он извлекает содержимое поля, а make назначает вывод str1. Поскольку в коде, присваивающем переменную, нет литерала #, дальнейшее экранирование не требуется.

Демонстрация: https://ideone.com/hWjnCp

Это требует GNU Make, но это, очевидно, то, что вы уже используете. (Пожалуйста, пометьте такие вопросы явно как