Я вижу ниже опций команды для GCC в Makefile:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "[email protected]" "$<"
Как интерпретировать это?
Я просмотрел файл makefile, но пока не повезло.
(Это не только о Automatic Variables)
Я вижу ниже опций команды для GCC в Makefile:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "[email protected]" "$<"
Как интерпретировать это?
Я просмотрел файл makefile, но пока не повезло.
(Это не только о Automatic Variables)
$(:=)
выполняет string replacement.
[email protected]
the name of the file being generated (цель).
Таким образом, $(@:%.o=%.d)
- это имя файла, с расширением .o
изменено на .d
.
Эта командная строка генерирует один файл зависимостей .d
для каждого файла .o
.
Я никогда не ожидал, что '()' может чередовать с '$ @'. – smwikipedia
@smwikipedia Make не имеет самого симпатичного синтаксиса, я дам вам следующее: p – Quentin
(Спасибо @ ключ Квентина я только что нашел его.!)
Это называется Substitution Reference
Некоторые цитаты:
Ссылка замещения подставляется значение переменной с изменениями которые вы указываете. Он имеет форму «
$(var:a=b)
» (или '${var:a=b}
'), и его смысл состоит в том, чтобы принять значение переменной var, заменить каждый a в конце слова на b в этом значении и заменить полученную строку.Когда мы говорим «в конце слова», мы подразумеваем, что a должно появиться либо с последующим пробелом, либо в конце значения для замены ; другие вхождения a в значение не изменяются. Для Например:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
наборы «
bar
» до «a.c b.c c.c
». См. Setting Variables.Ссылка на замещение на самом деле является аббревиатурой от использования функции расширения
patsubst
(см. Functions for String Substitution and Analysis). Мы предоставляем ссылки на замещения, а также patsubst для совместимость с другими реализациями make.
Таким образом, полная интерпретация следующей команды:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "[email protected]" "$<"
является:
Использование GCC для компиляции 1-го предварительных условий файла (
$<
) и генерировать выходной файл с именем после того, как имя текущего правила (%@
).И путем способом, сгенерируйте файл с именем*.d
, содержащий правило , чтобы описать зависимость текущего целевого значения правила. И измените имя правило цель в сгенерирована*.d
makefile от*.o
до*.d
.
Возможный дубликат [Что Makefile, символы $ @ и $ <означает?] (Http://stackoverflow.com/questions/3220277/what-do-the-makefile-symbols-and-mean) – Tim
Речь идет не только об автоматических переменных. – smwikipedia