我正在用C ++编写一个个人项目,并且正在使用GNU Autotools作为构建系统。
我想将软件和手册页一起分发,但是我不太喜欢Groff。因此,我决定使用Asciidoc编写所有内容,并使用a2x
在Groff中进行编译。
虽然我对结果非常满意,但我注意到安装Asciidoc可能需要大量磁盘空间。例如,Debian Stretch中的( Edit :甚至不正确。我忘记了disable suggested/recommended,但用例还是有意义的)。asciidoc-base
需要1928 MB的依赖项!
一种解决方案是将其设置为可选。为此,我的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.5
(EXTRA_DIST
),但运气不高。
有什么主意吗?
编辑:Best way to add generated files to distribution?问题似乎相关,尽管我怀疑我的具体情况是否有内置机制。
答案 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.5
和make dist
在dist_
期间生成。这两个联机帮助页都包含在发行包中。
通过在foo.1.txt
中包含源foo.conf.5.txt
和EXTRA_DIST
,我也获得了这两个文件。这是必需的,因为分发压缩包将仅包含已编译的联机帮助页。
声明CLEANFILES
将导致make clean
删除已编译的联机帮助页。
仅需了解一下,通过这种配置,我可以运行make dist
并获得具有以下特性的压缩包:
压缩包将已经包含编译后的手册页以及asciidoc来源。
提取压缩包后立即运行./configure && make
不会编译联机帮助页,因为它们已经可用。
解压缩tarball后立即运行./configure && make clean
将删除编译的联机帮助页(即使它们已包含在分发tarball中);
我试图在安装asciidoc
以及未安装asciidoc
的情况下验证构建系统的行为:一开始我就完全可以得到想要的东西。
如果未安装./configure
(因此无法检测到./configure && make clean && make
),则运行asciidoc
不会重新编译联机帮助页
如果安装了./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
)
将重新编译联机帮助页。