LINUX.ORG.RU

Automake, макроопределения для компиляции

 , ,


0

1

Всем привет.

TL;DR: пытаюсь открыть исходники strace в как проект в NetBeans. И для этих целей скармливаю NetBeans вывод make -wnk, который среда анализирует.

И вот тут проблема.

Нередко строка компиляции имеет вот такой вид:

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

Естественно, среда уже не может разобрать такое и «ломается» (файл не включён в проектную модель).

В исходных 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. Какой смысл данного финта ушами? Если бы было test -f && echo, то я бы предположил, что файл из локального каталога (если есть) должен иметь более высокий приоритет, чем тот же файл из VPATH. А в том виде, как есть, – непонятно.
  2. Кажется, я не в каждом проекте, использующем autotools, встречал такое. Т. е. есть проекты на autotools, которые тот же NetBeans открывает без проблем. Навскидку сейчас пример не приведу, но, может быть, есть кто-то, кто сможет объяснить, почему? Могут ли существовать проекты, использующие autoconf без automake? Часто ли такое встречается в природе?
★★★★★

Какой смысл данного финта ушами?

насколько я помню - это более-менее портабельный способ избежать хождения по симлинкам

Могут ли существовать проекты, использующие autoconf без automake?

да. и раньше таких дофига было

ananas ★★★★★ ()
Ответ на: комментарий от ananas

Спасибо.

насколько я помню - это более-менее портабельный способ избежать хождения по симлинкам

Но ведь test -f завершится успешно и для регулярного файла, и для симлинка на регулярный файл. В чём же смысл?

Bass ★★★★★ ()
Ответ на: комментарий от DllMain

может быть

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

ananas ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.