У меня есть небольшая проблема с automake для обработки подкаталогов при установке заголовков.
Вот примерная иерархия проекта, которая у меня есть:
foo/
foo-bin/
Makefile.am
...
foo-tests/
Makefile.am
...
foo-lib/
Makefile.am
include/
foo/
header1.h
subdir/
header2.h
src/
file1.cpp
Ничего особенного, есть корневой каталог, содержащий configure.ac
и 3 подкаталога для общей библиотеки, основного двоичного файла и тестов.
Интересная часть здесь foo-lib/
, Он содержит библиотеку, на которую ссылается двоичный файл и тесты.
Поскольку я хочу иметь возможность создавать файлы конфигурации из дерева исходных текстов, я решил использовать $top_srcdir
Относительный путь по моему Makefile.am
,
Вот как это выглядит:
libfoo_la_SOURCES = \
$(top_srcdir)/foo-lib/src/file1.cpp
pkginclude_HEADERS = \
$(top_srcdir)/foo-lib/include/foo/header1.h \
$(top_srcdir)/foo-lib/include/foo/subdir/header2.h
Без этих $top_srcdir
-относительный путь, у меня есть проблемы, когда я пытаюсь использовать foo-lib
от foo-bin
или когда я пытаюсь сгенерировать проект из исходного дерева.
Теперь проблема: при установке этих заголовков, они в конечном итоге сглаживаются!
То есть я в конечном итоге:
$prefix/include/foo/header1.h
$prefix/include/foo/header2.h
Пока я ожидал:
$prefix/include/foo/header1.h
$prefix/include/foo/subdir/header2.h
Итак, я предполагаю, что это то, что nobase_
должен достичь, но поскольку путь, который я использую, не относится к Makefile.am
, но $top_srcdir
Я заканчиваю с целым $top_srcdir
путь копируется:
$prefix/include/foo-lib/include/foo/header1.h
$prefix/include/foo-lib/include/foo/subdir/header2.h
что явно не то, что ожидается.
Любые мысли и советы по этому вопросу с благодарностью
Если вам нужен доступ к реальному Makefile.am
файлы, а не канонические примеры, проект здесь:
Это:
pkginclude_HEADERS = \
$(top_srcdir)/foo-lib/include/foo/header1.h \
$(top_srcdir)/foo-lib/include/foo/subdir/header2.h
говорит установщику разместить заголовки выше в $(pkgincludedir)
так сплющено, как вы сказали им быть.
Что вы могли бы сделать, это:
myincludesubdir=$(pkgincludedir)/subdir
pkginclude_HEADERS = $(top_srcdir)/foo-lib/include/foo/header1.h
myincludesub_HEADERS = $(top_srcdir)/foo-lib/include/foo/subdir/header2.h
Это должно установить header1.h
в $(pkgincludedir)
а также header2.h
в $(myincludesubdir)
ака $(pkgincludedir)/subdir
,
Я бы не использовал nobase_
в этом случае. Результаты, которые вы получили, не кажутся мне неожиданными или ошибочными.
Других решений пока нет …