Дополнительные руководства? Или предварительно скомпилированы в раздаче? - PullRequest
0 голосов
/ 27 августа 2018

Я работаю над личным проектом, написанным на C ++, и использую GNU Autotools в качестве системы сборки.

Я хотел бы распространять свое программное обеспечение вместе со справочными страницами, но я не очень люблю Groff. По этой причине я решил написать все в Asciidoc и скомпилировать его в Groff с a2x.

Хотя я вполне доволен результатом, Я заметил, что для установки Asciidoc может потребоваться много места на диске. Например, asciidoc-base в Debian Stretch требует 1928 МБ зависимостей! ( Редактировать : даже не правда. Я забыл отключить предложенный / рекомендуемый , но случай использования актуален в любом случае).

Одним из решений было бы сделать его необязательным. Для этого my configure.ac содержит следующие строки:

AC_CHECK_PROG([asciidoc], [a2x], [a2x], [false])
AM_CONDITIONAL([ASCIIDOC_AVAIL], [test x$asciidoc != xfalse])

… и файл man/Makefile.am определяется следующим образом:

if ASCIIDOC_AVAIL

man1_MANS = foo.1
man5_MANS = foo.conf.5

foo.1: foo.1.txt
    $(asciidoc) --doctype manpage --format manpage ./$<

foo.conf.5: foo.conf.5.txt
    $(asciidoc) --doctype manpage --format manpage ./$<

clean:
    rm $(man1_MANS) $(man5_MANS)

endif

Несмотря на то, что это похоже на работу, я не очень доволен этим. Мне не нравится идея не предоставлять руководство.

Желательно ли предварительно скомпилировать страницы руководства как часть шага make dist? Так же, как дистрибутив foo-x.y.z.tar.gz содержит скрипт configure (который не проверяется в VCS, но генерируется autoreconf), я мог бы сделать foo.1 и foo.conf.5 предварительно скомпилированными и распространять с исходный архив.

При условии, что это приемлемо с точки зрения «лучших практик», как я могу этого достичь? Я пытался объявить их как EXTRA_DIST (EXTRA_DIST = man1_MANS man5_MANS), но мне не повезло.

Есть идеи?

EDIT : Лучший способ добавить сгенерированные файлы в дистрибутив? Вопрос, похоже, связан, хотя я сомневаюсь, что для моего конкретного случая есть встроенный механизм.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

ОП здесь.

Благодаря ответу ldav1s я получил хорошее определение для моего man/Makefile.am файла. Я поставил это здесь как ответ, но вся заслуга принадлежит ldav1s.

Вот так:

dist_man1_MANS = foo.1
dist_man5_MANS = foo.conf.5

EXTRA_DIST = foo.1.txt foo.conf.5.txt

if ASCIIDOC_AVAIL
foo.1: foo.1.txt
    $(asciidoc) --doctype manpage --format manpage ./$<

foo.conf.5: foo.conf.5.txt
    $(asciidoc) --doctype manpage --format manpage ./$<
endif

CLEANFILES = $(dist_man1_MANS) $(dist_man5_MANS)

Немного полезной информации об этом:

  • Страницы man foo.1 и foo.conf.5 создаются во время make dist благодаря префиксу dist_ (как указано в ldav1s). Две страницы включены в дистрибутив.

  • Имея источники foo.1.txt и foo.conf.5.txt в EXTRA_DIST, я получаю эти два файла для распространения. Это необходимо, поскольку в дистрибутивный архив будут включены только скомпилированные man-страницы.

  • Объявление CLEANFILES приведет к make clean удалению скомпилированных man-страниц.

Просто чтобы понять, с этой конфигурацией я могу запустить make dist и получить тарбол со следующими свойствами:

  1. В архиве уже содержатся скомпилированные man-страницы вместе с исходниками asciidoc.

  2. Запуск ./configure && make сразу после извлечения архива не скомпилирует man-страницы, так как они уже доступны.

  3. Запуск ./configure && make clean сразу после извлечения архива приведет к удалению скомпилированных man-страниц (даже если они были включены в дистрибутив дистрибутива);

Я пытался проверить поведение системы сборки, когда установлена ​​asciidoc и когда она не установлена: в первую очередь я получаю именно то, что мне нужно.

  1. Если asciidoc не установлен (таким образом, ./configure не обнаружит его), запуск ./configure && make clean && make не перекомпилирует man-страницы

  2. Если установлен asciidoc, то при запуске ./configure && make clean && make будут перекомпилированы man-страницы.

0 голосов
/ 28 августа 2018

хотя я сомневаюсь, что для моего конкретного случая есть встроенный механизм.

На самом деле, такой механизм описан здесь , примерно на полпути вниз по этой странице. Префикс dist_ - это то, что вы ищете:

dist_man1_MANS = foo.1
dist_man5_MANS = foo.conf.5

if ASCIIDOC_AVAIL

foo.1: foo.1.txt
    $(asciidoc) --doctype manpage --format manpage ./$<

foo.conf.5: foo.conf.5.txt
    $(asciidoc) --doctype manpage --format manpage ./$<

CLEANFILES += $(dist_man1_MANS) $(dist_man5_MANS)

endif
...