[libvirt] [PATCH] build: improve check for out-of-date .gnulib submodule

Matthias Bolte matthias.bolte at googlemail.com
Fri Apr 2 22:36:20 UTC 2010


2010/4/2 Eric Blake <eblake at redhat.com>:
> git reset --hard 96e5a2d4d5b13bf2cc887562dc11d146b78d5950
> ./autogen.sh
> make -s
> git pull
> make -s    <-- expecting auto-bootstrap here, doesn't happen
>
> Use git diff to expose whether the submodule has untracked changes,
> which are typical on an incremental pull if .gnulib was updated but
> the user did not manually run 'git submodule update'.
>
> After this patch is applied, I encountered a new problem when
> following the reproducing pattern.  Basically, the change to .gnulib
> between libvirt's commit 96e5a2d4 and this patch introduced a change
> to sys_ioctl.in.h, but gnulib (intentionally) does not make the
> replacement headers depend on Makefile changes.  Therefore, I ended up
> with the generated replacement header being broken:
> gnulib/lib/sys/ioctl.h complained about a use of @.  But that seems
> like something that should be fixed upstream in gnulib's bootstrap
> script (that is, when doing a gnulib update, all files created from
> .in.h file should probably be deleted).  Without the benefit of that
> proposed gnulib fix, I worked around the problem by manually removing
> the stale gnulib/lib/sys/ioctl.h.
>
> * autogen.sh (t): Also run bootstrap if the gnulib submodule needs
> to be updated.
> * cfg.mk (_autogen): Likewise.
> Reported by Matthias Bolte.
> ---
>
> That took a lot longer to fix than I originally expected.  But I
> think this patch fixes the libvirt side of things, so that make
> will properly rerun autogen when the .gnulib submodule changes.
>
> Thanks again to Matthias for boiling it down to a reproducible step.
>
> And now I'm off to figure out whether gnulib's bootstrap script could
> do a better job of deleting any generated headers that might be
> rendered invalid by an update in gnulib modules.
>
>  autogen.sh |    2 +-
>  cfg.mk     |    6 +++++-
>  2 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/autogen.sh b/autogen.sh
> index a618d86..2f5b42d 100755
> --- a/autogen.sh
> +++ b/autogen.sh
> @@ -75,7 +75,7 @@ bootstrap_hash()
>  # Ensure that whenever we pull in a gnulib update or otherwise change to a
>  # different version (i.e., when switching branches), we also rerun ./bootstrap.
>  curr_status=.git-module-status
> -t=$(bootstrap_hash)
> +t=$(bootstrap_hash; git diff .gnulib)
>  if test "$t" = "$(cat $curr_status 2>/dev/null)"; then
>     : # good, it's up to date, all we need is autoreconf
>     autoreconf -if
> diff --git a/cfg.mk b/cfg.mk
> index b6b2530..74fe5ed 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -294,7 +294,8 @@ ifeq (0,$(MAKELEVEL))
>   _submodule_hash = sed 's/^[ +-]//;s/ .*//'
>   _update_required := $(shell                                          \
>       actual=$$(git submodule status | $(_submodule_hash);             \
> -               git hash-object bootstrap.conf);                        \
> +               git hash-object bootstrap.conf;                         \
> +               git diff .gnulib);                                      \
>       stamp="$$($(_submodule_hash) $(_curr_status) 2>/dev/null)";      \
>       test "$$stamp" = "$$actual"; echo $$?)
>   ifeq (1,$(_update_required))
> @@ -303,9 +304,12 @@ Makefile: _autogen
>   endif
>  endif
>
> +# It is necessary to call autogen any time gnulib changes.  Autogen
> +# reruns configure, then we regenerate all Makefiles at once.
>  .PHONY: _autogen
>  _autogen:
>        $(srcdir)/autogen.sh
> +       ./config.status
>
>  # Exempt @...@ uses of these symbols.
>  _makefile_at_at_check_exceptions = ' && !/(SCHEMA|SYSCONF)DIR/'
> --
> 1.6.6.1
>

ACK.

Fixes the missing automatic bootstrap run on .gnulib update.

Matthias




More information about the libvir-list mailing list