Некоторые 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%
Вопросы
- Можете ли вы объяснить цель такие вызовы под-оболочки?
- Можно ли безопасно отбрасывать все, что находится между задними чертами, при построении модели проекта, или есть какие-нибудь угловые случаи?