Цель вызова под-оболочки (через `backticks`) в макросах Automake для компиляции C и C ++ - PullRequest
3 голосов
/ 28 апреля 2020

Некоторые C и C ++ IDE поддерживают GNU Создавайте проекты на основе анализа парсинга make. Таким образом, они в основном запускают make -wnk, извлекают вызовы компилятора (gcc -c -o file.o file.c), а также Entering directory ... / Leaving directory ... сообщений из указанного журнала и строят модель проекта на основе этого. Одним из ярких примеров такой IDE является NetBeans , но, конечно, есть и другие.

Теперь, когда в проекте используются как autoconf, так и automake точная командная строка выглядит следующим образом (взято из strace исходный код):

gcc -DHAVE_CONFIG_H   -I./linux/x86_64 -I./linux/x86_64 -I./linux -I./linux -I. -I.     -DIN_MPERS -DMPERS_IS_mx32 -I./mpers-mx32  -Wall -Wempty-body -Wformat-security -Wignored-qualifiers -Wimplicit-fallthrough=5 -Winit-self -Wlogical-op -Wmissing-parameter-type -Wnested-externs -Wold-style-declaration -Wold-style-definition -Woverride-init -Wsign-compare -Wtype-limits -Wwrite-strings -Werror   -g -O2 -MT libmpers_mx32_a-v4l2.o -MD -MP -MF .deps/libmpers_mx32_a-v4l2.Tpo -c -o libmpers_mx32_a-v4l2.o `test -f 'v4l2.c' || echo './'`v4l2.c

Таким образом, на каждый компилируемый исходный файл ссылаются в командной строке как

`test -f 'file.c' || echo './'`file.c

означает, что когда файл присутствует в текущем каталоге (или является символической ссылкой на обычный файл), он компилируется как

gcc -c file.c

, а несуществующий файл вместо этого компилируется как

gcc -c ./file.c

Я чувствую, что может как-то связано с VPATH, но не может правильно объясни это. Причина, по которой я задаю вопрос, состоит в том, что NetBeans (а также некоторые другие подобные инструменты) не в состоянии анализировать такую ​​командную строку (с обратными галочками и вызовом суб-оболочки) и не может собрать правильная модель проекта для automake проектов.

Копая немного глубже, я обнаружил, что такие конструкции оболочки в первую очередь отсутствуют в файлах Makefile.am - только в Makefile.in automake генерирует. Теперь, глядя на /usr/share/automake-1.16/am/depend2.am (точный путь может отличаться), вот определения оригинальных макросов:

?!GENERIC?      %VERBOSE%%COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?-o?    %VERBOSE-NODEP%%COMPILE% %-c% %-o% %OBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!-o?   %VERBOSE-NODEP%%COMPILE% %-c% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!GENERIC?      %VERBOSE%%LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!GENERIC?      %VERBOSE-NODEP%%LTCOMPILE% %-c% -o %LTOBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%

Вопросы

  1. Можете ли вы объяснить цель такие вызовы под-оболочки?
  2. Можно ли безопасно отбрасывать все, что находится между задними чертами, при построении модели проекта, или есть какие-нибудь угловые случаи?
...