Для чего нужны скобки в этом правиле make-файла? - PullRequest
0 голосов
/ 22 января 2019

Я читаю make-файл для проекта, созданного Qt, который имеет следующее:

{backend}.cpp{release\}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
    $<  
<<

(код выше использует \ t для рецепта и написан в make-файле)

И правило, и рецепт смущают меня.

Я начну с {backend} в правиле. Очевидно, такая же путаница и для {release}. Я предполагаю, что это ссылка на определенный подкаталог с именем backend. Я полагаю, что ..\backend\release\bar.obj будет признана законной целью? Но какая часть make говорит, что это допустимый синтаксис и что именно здесь происходит?

FWIW: Это раздел с комментариями: ##### implicit rules. Версия: GNU Make 4.2.1 Built for x86_64-unknown-cygwin

Бонусные баллы:

Объясните использование @<< и << в рецепте ... ( Да, мне не хватает изящества оболочки bash ... ). Это ссылка на первую предпосылку с $< и молчаливое перенаправление? Почему не $$<?

Спасибо.

1 Ответ

0 голосов
/ 22 января 2019

Это правило пакетного режима NMAKE

https://docs.microsoft.com/en-us/cpp/build/batch-mode-rules?view=vs-2017

Эквивалентное правило GNU Make будет выглядеть примерно так:

backend/%.obj: release/%.cpp:

С той разницей, что какКак следует из названия, эти правила будут вызывать свои рецепты только один раз для всех действительных целей и ожидать, что правило создаст все цели за один проход с макросом $<.

Синтаксис << - это NMAKE'sфункция встроенного файла

https://docs.microsoft.com/en-us/cpp/build/inline-files-in-a-makefile?view=vs-2017

Это расширяет и захватывает все, что находится между угловыми скобками, и сохраняет его в файл, в данном случае это временный файл, поскольку имя файла не указано после скобок.Затем файл передается компилятору в качестве файла ответов в первой строке рецепта с помощью параметра @.

...