./bootstrap required [Re: [libvirt] fix two "make syntax-check" failures

Jim Meyering jim at meyering.net
Fri Jul 10 10:45:03 UTC 2009


Daniel P. Berrange wrote:

> On Fri, Jul 10, 2009 at 09:42:10AM +0200, Jim Meyering wrote:
>> Cole Robinson wrote:
>>
>> > Daniel P. Berrange wrote:
>> >>>> diff --git a/.gnulib b/.gnulib
>> >>>> index 1203e8d..b653eda 160000
>> >>>> --- a/.gnulib
>> >>>> +++ b/.gnulib
>> >>>> @@ -1 +1 @@
>> >>>> -Subproject commit 1203e8d1f62dec3d2436dffadd5c20793cf84366
>> >>>> +Subproject commit b653eda3ac4864de205419d9f41eec267cb89eeb
>> >>> Note how that patch changed the .gnulib submodule.
>> >>> When you pull such a change, you have to know to run ./bootstrap
>> >>> to pull in updated-from-gnulib files.
>> >>
>> >> Yeah, this is the kind of scenario where I think it'd be good to have
>> >> autogen.sh somehow notice the .gnulib submodule hash changed, and
>> >> automatically run bootstrap to re-sync.
>> >>
>> >
>> > I actually just had a brief WTF moment, tripping up on the need to run
>> > ./bootstrap with a fresh checkout. autogen.sh fails pretty spectacularly in
>> > that case: I can imagine it would send a first time user running for the hills.
>> >
>> > +1 to any way of integrating this with autogen.sh (or at least clearly warning
>> > the user if the necessary steps haven't been taken).
>>
>> Actually, we can do even better.
>> Run it via "make".
>> There's only one problem when doing it that way:
>>
>> Whenever you rerun bootstrap, you also have to rerun autogen.sh.
>> And to automatically run autogen.sh, you need to know what
>> (if any) command line arguments the user would have selected,
>> e.g., --prefix or other ./configure options.
>>
>> IMHO, this is a good argument for changing autogen.sh so that
>> (like many other autogen scripts) it tells the user to run
>> not "make" directly but "./configure ... && make".
>
> No I like the way autogen.sh currently works. bootstrap is logically
> a part of what autogen.sh should be doing, not part of 'make' rules.
>
>> Anyhow, if you don't mind rerunning ./autogen.sh with *no*
>> options, here's how to make it so after pulling a gnulib submodule
>> update, the next "make" will automatically detect that and run
>> both ./bootstrap and autogen.sh for you.
>
> Running autogen.sh without options is going to causing just as much
> pain & confusion, because it is pretty common to give options to
> autogen.sh particularly to change the install loction.

So how about this alternative?
With it, you don't need to run ./bootstrap manually any more,
and "make" will fail with a message telling you to run ./autogen.sh
whenever the gnulib submodule is out of date wrt your current checkout.
(not wrt upstream, of course).

The first patch isn't technically necessary,
but can save unnecessary invocation of some of those programs.

>From abc4812c4752bb63cefd1f73d8136903e694034a Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Fri, 10 Jul 2009 12:06:36 +0200
Subject: [PATCH 1/2] build: make autogen.sh use autoreconf -if

* autogen.sh: Use "autoreconf -if" instead of open-coding it with
manual and unconditional invocation of each separate tool.
---
 autogen.sh |    8 +-------
 1 files changed, 1 insertions(+), 7 deletions(-)

diff --git a/autogen.sh b/autogen.sh
index c026112..e6bde33 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -57,13 +57,7 @@ fi
 # Automake requires that ChangeLog exist.
 touch ChangeLog

-autopoint --force
-#rm -rf m4
-libtoolize --copy --force
-aclocal -I m4 -I gnulib/m4
-autoheader
-automake --add-missing
-autoconf
+autoreconf -if

 cd $THEDIR

--
1.6.3.3.524.g8586b


>From 6870a8cf78cc3216bd38cb997cc27e1eabccc601 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Fri, 10 Jul 2009 10:01:04 +0200
Subject: [PATCH 2/2] build: automatically rerun ./bootstrap when needed

When "git pull" (or any other operation) brings in a new version of the
gnulib git submodule, you must rerun the autogen.sh script.  With this
change, "make" now fails and tells you to run ./autogen.sh, when needed.
* autogen.sh: Maintain a new file, .git-module-status, containing
the current submodule status.  If it doesn't exist or its content
is different from what "git submodule status" prints, then run
./bootstrap
* .gitignore: Add .git-module-status
* cfg.mk: Diagnose out of date submodule and fail.
* README-hacking: Update not to mention bootstrap.
* Makefile.am (MAINTAINERCLEANFILES): Add .git-module-status,
so that "make maintainerclean" will remove it.
---
 .gitignore     |    1 +
 Makefile.am    |    2 ++
 README-hacking |    9 ++-------
 autogen.sh     |   11 +++++++++++
 cfg.mk         |   10 ++++++++++
 5 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore
index 54c3ba4..17c3975 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
 *.o
 *~
 .git
+.git-module-status
 ABOUT-NLS
 COPYING
 INSTALL
diff --git a/Makefile.am b/Makefile.am
index f9efff5..beddca7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -48,6 +48,8 @@ cov: clean-cov
 clean-cov:
 	rm -rf $(top_builddir)/coverage

+MAINTAINERCLEANFILES = .git-module-status
+
 # disable this check
 distuninstallcheck:

diff --git a/README-hacking b/README-hacking
index 99c68fe..4105a3e 100644
--- a/README-hacking
+++ b/README-hacking
@@ -28,13 +28,8 @@ You can get a copy of the source repository like this:
         $ git clone git://libvirt.org/libvirt
         $ cd libvirt

-The next step is to get and check other files needed to build,
-which are extracted from other source packages:
-
-        $ ./bootstrap
-
-Then run this to create e.g., Makefiles and ./configure,
-and to invoke ./configure:
+The next step is to get all required pieces from gnulib,
+to run autoreconf, and to invoke ./configure:

         $ ./autogen.sh

diff --git a/autogen.sh b/autogen.sh
index e6bde33..415f3ec 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -54,6 +54,17 @@ if test -z "$*"; then
         echo "to pass any to it, please specify them on the $0 command line."
 fi

+# 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=$(git submodule status)
+if test "$t" = "$(cat $curr_status 2>/dev/null)"; then
+    : # good, it's up to date
+else
+  echo running bootstrap...
+  ./bootstrap && echo "$t" > $curr_status
+fi
+
 # Automake requires that ChangeLog exist.
 touch ChangeLog

diff --git a/cfg.mk b/cfg.mk
index 736f7c0..3b3d57f 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -230,3 +230,13 @@ sc_libvirt_unmarked_diagnostics:

 # We don't use this feature of maint.mk.
 prev_version_file = /dev/null
+
+ifeq (0,$(MAKELEVEL))
+  _curr_status = .git-module-status
+  _update_required :=							\
+    $(shell t=$$(git submodule status);					\
+      test "$$t" = "$$(cat $(_curr_status) 2>/dev/null)"; echo $$?)
+  ifeq (1,$(_update_required))
+    $(error gnulib update required; run ./autogen.sh first)
+  endif
+endif
--
1.6.3.3.524.g8586b




More information about the libvir-list mailing list