Я работаю над проектом C++, который использует autoconf
& automake
, и я изо всех сил пытаюсь правильно настроить пути включения в *CPPFLAGS
. Я читал о документах на 3 часа, и пока не могу понять. Я не ищу взлома, но для правильного способа сделать это. Вот моя загадка.как установить включить пути с autotools
Как я вижу, есть 3 совершенно разные источники включают пути:
- Внешние библиотеки, которые должны быть установлены вместе с моим пакетом, которые настроены на
configure --with-XXX=<PATH>
. - В моем пакете некоторые исходные файлы используют
#include <file.h>
, даже еслиfile.h
является частью пакета, поэтому для их компиляции я должен правильно установить путь включения. (Обратите внимание, что это не вариант для редактирования всех этих файлов.) - Причудливые (или нет) стандарты указывают, что пользователю должно быть разрешено указать свои собственные (дополнительные) включенные пути. То есть, я не должен устанавливать
CPPFLAGS
.
В моей текущей настройке:
- Тип 1 дорожка устанавливается внутри
configure.ac
поAC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
. - Пути типа 2 устанавливаются внутри
Makefile.am
поtest_CPPFLAGS = -I<path>
. - Тип 3 не может быть установлен. Точнее, если пользователь устанавливает
CPPFLAGS
перед запускомmake
, это переопределяет настройки типа 1, в результате чего компиляция завершится с ошибкой. Конечно, пользователь может попытаться использоватьCXXFLAGS
вместо этого, но у этого есть другое использование (помните, я прошу правильный способ сделать это, а не взломать).
Я попытался исправить это, установив пути 1-го уровня, используя AM_CPPFLAGS
внутри configure.ac
. (Для справки: если вы установили AM_CPPFLAGS
вместо CPPFLAGS
, но вам еще нужно выполнить некоторые проверки, такие как AC_CHECK_HEADERS
, вам необходимо временно установить CPPFLAGS
, а затем вернуть его для проверки, это объясняется here.) Это освобождает CPPFLAGS
для путей типа 3, но, к сожалению, компиляция завершилась неудачно, потому что Makefile
-s, который получает configure
, будет использовать только AM_CPPFLAGS
, если не существует специализированного <target>_CPPFLAGS
. Итак, если test_CPPFLAGS
существует с типом 2-го типа, компиляция test
завершится неудачно, потому что он не получит путь типа 1.
Исправление должно указывать внутри Makefile.am
, чтобы всегда использовать AM_CPPFLAGS
. Но разве это «по книге»? Могу ли я сделать это глобально, или мне нужно редактировать каждый target_CPPFLAGS
? Есть ли другое «правильное» решение?
Под «причудливым» вы включаете официальную документацию по autoconf, в которой четко указано, что CPPFLAGS является пользовательской переменной, которая не должна быть модифицирована сопровождающим? (См. Раздел 4.8.1 на http://www.gnu.org/software/autoconf/manual/autoconf.html) –
Хотя менее двусмысленный пример из официальной документации по автоману может быть более ясным, в котором говорится: «Вы никогда не должны переопределять пользовательская переменная, такая как CPPFLAGS в Makefile.am ». в разделе 27.6 на http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –