可选手册?还是预编译发行?

时间:2018-08-27 19:27:35

标签: packaging autoconf automake

我正在用C ++编写一个个人项目,并且正在使用GNU Autotools作为构建系统。

我想将软件和手册页一起分发,但是我不太喜欢Groff。因此,我决定使用Asciidoc编写所有内容,并使用a2x在Groff中进行编译。

虽然我对结果非常满意,但我注意到安装Asciidoc可能需要大量磁盘空间。例如,Debian Stretch中的asciidoc-base需要1928 MB的依赖项! Edit :甚至不正确。我忘记了disable suggested/recommended,但用例还是有意义的)。

一种解决方案是将其设置为可选。为此,我的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和{{1 }}预编译,并与源tarball一起分发。

从“最佳实践”的角度来看,这是可以接受的,我如何实现呢?我试图将它们声明为foo.conf.5EXTRA_DIST),但运气不高。

有什么主意吗?

编辑Best way to add generated files to distribution?问题似乎相关,尽管我怀疑我的具体情况是否有内置机制。

2 个答案:

答案 0 :(得分:2)

  

即使我怀疑我的具体情况是否有内置机制。

实际上,here中描述了这种机制,大约在该页面的一半以下。 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

答案 1 :(得分:0)

在这里

多亏了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)

一些有用的信息:

  • 由于foo.1前缀(如ldav1s所指出),手册页foo.conf.5make distdist_期间生成。这两个联机帮助页都包含在发行包中。

  • 通过在foo.1.txt中包含源foo.conf.5.txtEXTRA_DIST,我也获得了这两个文件。这是必需的,因为分发压缩包将仅包含已编译的联机帮助页。

  • 声明CLEANFILES将导致make clean删除已编译的联机帮助页。

仅需了解一下,通过这种配置,我可以运行make dist并获得具有以下特性的压缩包:

  1. 压缩包将已经包含编译后的手册页以及asciidoc来源。

  2. 提取压缩包后立即运行./configure && make不会编译联机帮助页,因为它们已经可用。

  3. 解压缩tarball后立即运行./configure && make clean将删除编译的联机帮助页(即使它们已包含在分发tarball中);

我试图在安装asciidoc以及未安装asciidoc的情况下验证构建系统的行为:一开始我就完全可以得到想要的东西。

  1. 如果未安装./configure(因此无法检测到./configure && make clean && make),则运行asciidoc不会重新编译联机帮助页

  2. 如果安装了./configure && make clean && make,则运行if (b = selection as array)[1] == undefined then ( b = box() b.pivot=[0,0,0] absrot = eulerAngles 90 0 0 absrotmat = (absrot as quat) as matrix3 b.transform = absrotmat b.objectOffsetRot = inverse absrotmat.rotationPart ) 将重新编译联机帮助页。