GNU bug report logs - #31157
Advice for help2man does not work for parallel builds

Previous Next

Package: automake;

Reported by: Reuben Thomas <rrt <at> sc3d.org>

Date: Sat, 14 Apr 2018 23:50:02 UTC

Severity: minor

Full log


View this message in rfc822 format

From: Reuben Thomas <rrt <at> sc3d.org>
To: Mathieu Lirzin <mthl <at> gnu.org>
Cc: 31157 <at> debbugs.gnu.org
Subject: bug#31157: Advice for help2man does not work for parallel builds
Date: Sun, 22 Apr 2018 07:52:02 +0100
[Message part 1 (text/plain, inline)]
On 21 April 2018 at 16:13, Mathieu Lirzin <mthl <at> gnu.org> wrote:

> Hello Reuben,
>
> Reuben Thomas <rrt <at> sc3d.org> writes:
>
> > In the manual, we are given the following pattern for using help2man
> > without breaking make distcheck:
> >
> > foo.1: foo.c $(top_srcdir)/configure.ac
> > $(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
> > help2man --output=foo.1 ./foo$(EXEEXT)
> >
> > The problem is that with make -j this can result in two attempts to
> > make a library in parallel (suppose that we have:
> >
> > foo_LDADD = libfoo.la
> > lib_LTLIBRARIES = libfoo.la
> >
> > ). This can fail, and in any case is wasteful.
>
> Have you identified the reason why this can fail?  because
>

​Because two independent parallel invocations of make ​can end up trying to
build the library (which is wasteful anyway) and some needed file can be
deleted by one invocation when the other is trying to use it to link the
library.

This is not ideal since this result in making ‘help2man’ (and ‘perl’
> transitively) a build dependency for tarball builders.
>

​I'm increasingly of the view this is not a problem. Perl is increasingly
reasonable as a build dep (it seems to be in most base systems now), and
help2man is small. Further, it's increasingly common to build from git
sources, or a tarball of git, or, as Debian does, to rerun
autoreconf/bootstrap at build time.​ However, for now I am being
conservative!

$(srcdir)/foo.1: foo.c foo$(EXEEXT)
>         -@case '$?' in \
>           *foo.c*)
> ​​
> $(AM_V_P) && set -x || echo "  HELP2MAN $@"; \
>                    LANGUAGE= help2man --output="$(srcdir)/foo.1"
> ./foo$(EXEEXT);; \
>           *) : ;; \
>         esac;
>

Nice! The one thing I don't understand: why is "-" needed at the start
(i.e. why do we need to ignore failure of this command?).

Combining the above with what I originally posted, I get:

beetle.1: tbl_opts.h beetle$(EXEEXT)
## Exit gracefully if beetle.1 is not writeable, such as during distcheck!
    @if ( touch $@.w && rm -f $@.w; ) >/dev/null 2>&1; then \
        case '$?' in \
          *tbl_opts.h*) $(AM_V_P) && set -x || echo "  HELP2MAN $@"; \
          $(top_srcdir)/build-aux/missing --run $(HELP2MAN) --no-info \
            --name="Forth virtual machine" \
            --output=$@ ./beetle$(EXEEXT);; \
          *) : ;; \
        esac; \
    fi

-- 
https://rrt.sc3d.org
[Message part 2 (text/html, inline)]

This bug report was last modified 7 years and 55 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.