Automake: перезапись DEFAULT_INCLUDES

Я хотел бы иметь возможность переопределить набор включений, используемых automake, либо во время настройки, либо во время компиляции. Я знаю следующие работы:

make DEFAULT_INCLUDES= CPPFLAGS="-I. -I/home/development/trunk"

Мой вопрос в том, есть ли лучший способ переопределить DEFAULT_INCLUDES?

Решение должно работать для всего проекта, который несколько велик. Решение с использованием configure.ac было бы приемлемым, но оно должно быть необязательным. Другими словами, я не думаю, что использование nostdinc с AM_INIT_AUTOMAKE сработает, потому что не существует способа условного вызова макроса.


person deuberger    schedule 12.04.2011    source источник
comment
Не совсем. Мы использовали nostdinc, потому что не нашли другого способа, который соответствовал бы нашим потребностям. Однако, как говорится в вопросе, nostdinc на самом деле не делает то, что мы хотим.   -  person deuberger    schedule 06.03.2013


Ответы (2)


Если 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.. Я сам считаю это немного сомнительным, потому что кажется, что необходимо забрать сгенерированные файлы заголовков из каталога объектов (каталога сборки), только -- в конце концов, а иначе в сборке каталог включить? Но поскольку приложение должно иметь возможность компилироваться и тогда, когда оно компилируется в самом дереве исходных текстов, и в этом случае 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

В руководстве по Autoconf предлагается использовать файл config.site.

person milton    schedule 20.04.2012
comment
Можете ли вы привести пример? Я не думаю, что это правильный способ использования файла config.site, и я не думаю, что он выполнит то, о чем я просил. - person deuberger; 06.03.2013