在并行 automake 中使用 help2man
Use help2man in parallel automake
我正在开发一个使用 GNU autotools(autoconf、automake)构建的项目。它确实运行良好,但我对 help2man 有一个问题:构建并行 (MAKEFLAGS=-j3
) 时,项目构建了两次 - 一次使用 "normal" 目标,一次使用 foo.1
调用.
以下是Makefile.am
的相关部分:
foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/src/main.c $(top_srcdir)/configure.ac
$(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
-$(HELP2MAN) -o $@ --include $< $(top_builddir)/foo
所以,我的问题是如何编写 Makefile.am
来支持以下内容:
- 分发
foo.1
以支持没有 help2man
的系统
- 不抛出错误
- 必要时重建联机帮助页
期待您的回答
foo.1
需要正确的先决条件。 AIUI,help2man
只需要构建可执行二进制文件:
foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/configure.ac $(top_builddir)/foo
-$(HELP2MAN) -o $@ --include $< $(top_builddir)/foo
所以这是 3)
不明白你想从2)中得到什么,这在一般情况下是不可能的。
dist_man_MANS = foo.1
这是 1)
这个问题似乎没有简单的解决办法;以下对我有用。
在configure.ac
中,您必须检查help2man。如果交叉编译,你不能 运行 help2man,因为可执行文件将是 运行。因此包含以下片段:
# Man pages
AS_IF([test "$cross_compiling" = "no"], [
AM_MISSING_PROG([HELP2MAN], [help2man])
], [
HELP2MAN=:
])
建筑有两层的概念。首先,检查联机帮助页是否比可执行文件更新;如果是这样,为了禁止不必要的联机帮助页重建,您使用联机帮助页本身最后一次更改的临时文件检查源代码。所以,Makefile.am
包含:
dist_man_MANS = foo.1
EXTRA_DIST += $(dist_man_MANS:.1=.x) common.x
MOSTLYCLEANFILES += $(dist_man_MANS:=-t)
MAINTAINERCLEANFILES += $(dist_man_MANS)
common_dep = $(top_srcdir)/common.x $(top_srcdir)/configure.ac $(top_srcdir)/.version
common_indirect_dep = $(top_srcdir)/common.x $(top_srcdir)/configure $(top_srcdir)/.version
foo.1 : $(common_indirect_dep) $(top_builddir)/foo$(EXEEXT)
foo.1-t : $(common_dep) $(top_srcdir)/main-helpversion.c
SUFFIXES += .x .1 .1-t
.x.1:
test -f $@ || if test -f $(top_srcdir)/`echo $@ | $(SED) -e 's,.*/,,'`; then \
touch -r $(top_srcdir)/`echo $@ | $(SED) -e 's,.*/,,'` $@; \
else \
touch -d @0 $@; \
fi
touch -r $@ $@-t
$(MAKE) $(AM_MAKEFLAGS) $@-t
if test -s $@-t; then \
mv -f $@-t $@; \
else \
rm -f $@-t; \
if test -s $@; then touch $@; else rm -f $@; fi; \
fi
.x.1-t:
$(HELP2MAN) -o $@ -I $< -I $(top_srcdir)/common.x -s 1 foo$(EXEEXT)
我正在开发一个使用 GNU autotools(autoconf、automake)构建的项目。它确实运行良好,但我对 help2man 有一个问题:构建并行 (MAKEFLAGS=-j3
) 时,项目构建了两次 - 一次使用 "normal" 目标,一次使用 foo.1
调用.
以下是Makefile.am
的相关部分:
foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/src/main.c $(top_srcdir)/configure.ac
$(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
-$(HELP2MAN) -o $@ --include $< $(top_builddir)/foo
所以,我的问题是如何编写 Makefile.am
来支持以下内容:
- 分发
foo.1
以支持没有help2man
的系统
- 不抛出错误
- 必要时重建联机帮助页
期待您的回答
foo.1
需要正确的先决条件。 AIUI,help2man
只需要构建可执行二进制文件:
foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/configure.ac $(top_builddir)/foo
-$(HELP2MAN) -o $@ --include $< $(top_builddir)/foo
所以这是 3)
不明白你想从2)中得到什么,这在一般情况下是不可能的。
dist_man_MANS = foo.1
这是 1)
这个问题似乎没有简单的解决办法;以下对我有用。
在configure.ac
中,您必须检查help2man。如果交叉编译,你不能 运行 help2man,因为可执行文件将是 运行。因此包含以下片段:
# Man pages
AS_IF([test "$cross_compiling" = "no"], [
AM_MISSING_PROG([HELP2MAN], [help2man])
], [
HELP2MAN=:
])
建筑有两层的概念。首先,检查联机帮助页是否比可执行文件更新;如果是这样,为了禁止不必要的联机帮助页重建,您使用联机帮助页本身最后一次更改的临时文件检查源代码。所以,Makefile.am
包含:
dist_man_MANS = foo.1
EXTRA_DIST += $(dist_man_MANS:.1=.x) common.x
MOSTLYCLEANFILES += $(dist_man_MANS:=-t)
MAINTAINERCLEANFILES += $(dist_man_MANS)
common_dep = $(top_srcdir)/common.x $(top_srcdir)/configure.ac $(top_srcdir)/.version
common_indirect_dep = $(top_srcdir)/common.x $(top_srcdir)/configure $(top_srcdir)/.version
foo.1 : $(common_indirect_dep) $(top_builddir)/foo$(EXEEXT)
foo.1-t : $(common_dep) $(top_srcdir)/main-helpversion.c
SUFFIXES += .x .1 .1-t
.x.1:
test -f $@ || if test -f $(top_srcdir)/`echo $@ | $(SED) -e 's,.*/,,'`; then \
touch -r $(top_srcdir)/`echo $@ | $(SED) -e 's,.*/,,'` $@; \
else \
touch -d @0 $@; \
fi
touch -r $@ $@-t
$(MAKE) $(AM_MAKEFLAGS) $@-t
if test -s $@-t; then \
mv -f $@-t $@; \
else \
rm -f $@-t; \
if test -s $@; then touch $@; else rm -f $@; fi; \
fi
.x.1-t:
$(HELP2MAN) -o $@ -I $< -I $(top_srcdir)/common.x -s 1 foo$(EXEEXT)