Как условно установить документацию в pkghtmldir с помощью Automake

У меня есть рецепт в Automake, который дополнительно создает документацию, если пользователь выдает make doc или make htmldoc:

if DOXYGEN_AVAILABLE

docs html htmldoc html-doc:
    $(DOXYGEN) Doxyfile -d DOXYGEN_PROCESSING

fi

DOXYGEN_AVAILABLE устанавливается в configure на основе результата AC_CHECK_PROGS. Если документы построены, будет каталог html-doc. Документация необязательна и html-doc может отсутствовать.

Если присутствует html-doc, у меня не будет списка файлов. Я не верю, что это сработает в Makefile.am:

if DOXYGEN_AVAILABLE

docs html htmldoc html-doc:
    $(DOXYGEN) Doxyfile -d DOXYGEN_PROCESSING

pkghtmldir_FILES += html-doc/

fi

Как дополнительно установить документацию на pkghtmldir при использовании Automake?


person jww    schedule 26.07.2018    source источник
comment
Немного ОТ. Я не понимаю строку $(DOXYGEN) Doxyfile -d DOXYGEN_PROCESSING, особенно часть -d .... Я предполагаю, что исполняемый файл $(DOXYGEN) is the doxygen`, в этом случае часть -d ... будет проигнорирована. Более того, проблема здесь не в доксигене.   -  person albert    schedule 26.07.2018
comment
@albert - я считаю, что -d определяет макрос C. Для проекта некоторый код находится в блоке DOXYGEN_PROCESSING, чтобы документация была красивой.   -  person jww    schedule 26.07.2018


Ответы (1)


Я предлагаю вам, во-первых, немного изменить свою логику. Если можно не устанавливать документы Doxygen, когда Doxygen недоступен для их сборки, то также можно не устанавливать их, даже если Doxygen доступен. Таким образом, имеет смысл использовать --enable-docs или --with-docs или аналогичную опцию для configure, чтобы позволить сборщику пакетов указать, следует ли собирать документы, в зависимости от того, какое значение по умолчанию вам подходит. Вы также можете рассмотреть возможность включения готовых документов в свой пакет, а затем выбрать, следует ли включить их повторноесоздание.

Кроме того, вы можете вообще не проверять Doxygen, когда документы все равно не запрашиваются, и выдавать предупреждение или ошибку, когда они запрашиваются, но Doxygen недоступен (или слишком стар). Это должно быть менее удивительным для сборщиков пакетов. По крайней мере, для меня это было бы менее удивительно.

Тем не менее, в конечном итоге все сводится к условным выражениям Automake. Вот немного урезанная версия того, как я решаю почти ту же задачу в одном из своих проектов:

$(top_srcdir)/Makefile.am:

# An Automake conditional:
if make_docs

# The name of the target(s) that encompasses actually building the docs
doxygen_html_targets = dox-html

# My Doxyfile is built by the build system, and the docs also depend on some example
# sources, stylesheets, and other files provided by the package.  All these are
# listed here, so that the docs are rebuilt if any of them change:
dox_deps = Doxyfile ...

# How to actually install the docs (a one-line make recipe).  Covers also installing
# pre-built docs that I include in the package for convenience, though this example
# has most of the other plumbing for that removed.
#
# The chmod in the below command must ensure the target files writable
# in order to work around weirdness in the behavior of the "distcheck" target
# when not configured to rebuild docs.
html_install = test -d dox-html && html_dir=dox-html || html_dir=$(srcdir)/dox-html; \
  $(MKDIR_P) $(DESTDIR)$(pkgdocdir); \
  cp -pR $${html_dir} $(DESTDIR)$(pkgdocdir)/html; \
  chmod -R u+w,go+rX $(DESTDIR)$(pkgdocdir)/html

else

doxygen_html_targets =
dox_deps =
html_install = :

endif

# The variable prerequisites of this rule are how the selection is made between
# building the docs and not building them:
html-local: $(doxygen_html_targets)
        :

## This rule should not be necessary, but Automake seems otherwise to ignore the 
## install-html-local rule, perhaps because there are no targets with an HTML
## primary.
install-data-local: install-html-local

# The variable recipe for this rule is how the selection is made between installing
# the docs and not installing them:
install-html-local:
        $(html_install)

maintainer-clean-local:
        $(RM) -rf dox-html

# This rule, when exercised, is what actually builds the docs:
dox-html: $(dox_deps)
        $(RM) -rf dox-html
        $(DOXYGEN) Doxyfile

Ключевым моментом здесь является то, что вы можете хранить не только списки файлов в make переменных и управлять ими с помощью условий Automake. Вы также можете сохранить имена произвольных целей, которые будут использоваться в списках обязательных требований, и вы даже можете сохранить текст рецептов правил, чтобы изменить поведение выбранных правил.

person John Bollinger    schedule 26.07.2018