Если configure.ac
содержит
AC_CONFIG_HEADERS([foo/config.h])
Тогда сгенерированный Makefile.in
будет содержать
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/foo
Таким образом, использование только AC_CONFIG_HEADERS([config.h])
всегда будет приводить к добавлению -I$(top_builddir)
в качестве последнего пути поиска.
Это для размещения
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
в вашем исходном коде.
Я бы сказал, что top_builddir должен только содержать это config.h
; и ваше приложение должно иметь только один configure.ac
и, следовательно, один config.h
, поэтому, если приложение использует #include "config.h"
, оно либо не скомпилируется, либо найдет config.h
в top_builddir.
Однако есть еще ведущий -I.
. Я сам считаю это немного сомнительным, потому что кажется, что необходимо забрать сгенерированные файлы заголовков из каталога объектов (каталога сборки), только -- в конце концов, а иначе в сборке em> каталог включить? Но поскольку приложение должно иметь возможность компилироваться и тогда, когда оно компилируется в самом дереве исходных текстов, и в этом случае builddir == srcdir, оно автоматически включает исходный каталог. Чтобы сделать два случая по крайней мере эквивалентными, один из них ДОЛЖЕН (тогда) также включать исходный каталог, когда каталог сборки и исходный каталог НЕ совпадают.
Об этом заботится с помощью @am__isrc@
, который расширяется до -I$(srcdir)
тогда и только тогда, когда каталог сборки и исходный каталог не совпадают (это просто для того, чтобы избежать двух -I. -I.
после другого).
Предполагая, что у вас нет сгенерированных файлов заголовков в исходном каталоге (вы можете поместить их в другое место), тогда это включение будет только «мешать», когда вы включаете заголовки, которые ЕСТЬ в исходном каталоге, но вы не хотите включить их. Это кажется довольно сломанным, если вы спросите меня... А именно, если у вас есть
#include "foo.h"
в вашем исходном файле, и, конечно же, этот исходный файл должен находиться в srcdir (вот почему вы не должны не использовать «исходные файлы» в подкаталогах — также FOO_SOURCES = subdir/foo.c
, но вместо этого используйте SUBDIRS = subdir
и скомпилировать foo.c
в subdir
), это включение будет искать в srcdir в любом случае из-за двойных кавычек (такие включения всегда сначала ищутся в пути к включаемому файлу).
Тем не менее, вы можете просто переопределить это определение, добавив
DEFAULT_INCLUDES =
Вашему Makefile.am
. Даже если вы добавите это в самый верх Makefile.am
, оно все равно окажется ниже первого определения и переопределит его.
Или, если на то пошло, вы могли бы сделать:
DEFAULT_INCLUDES = @my_default_includes@
и установите его на все, что хотите (используя AC_SUBST(my_default_includes)
в вашем файле configure.ac).
person
Carlo Wood
schedule
08.08.2019