[libvirt] [PATCH 0/4] maint: improve bootstrap

My biggest motivation in writing this patch series is the fact that I already have the complete gnulib.git on my hard drive, and repeatedly doing shallow clones of gnulib into multiple projects gets expensive in both network traffic and disk space. With this series, it is now possible to do: GNULIB_SRCDIR=/path/to/reference/gnulib.git ./autogen.sh so that the .gnulib subdirectory will exploit git's --reference capabilities rather than re-download all the files from scratch; it also results in less disk usage. The only caveat is that you should make sure that your reference gnulib.git is never rewound beyond contents referred to by a submodule, so that you never risk creating delta objects in the client repositories that would break if the reference module eventually prunes objects rendered unused by the rewind (in practice, this is only a problem if you are prone to pointing the .gnulib submodule to a non-published commit, in order to test out pending changes to gnulib.git, and can be avoided by doing your gnulib development in a different directory than in the reference gnulib.git that only tracks upstream). .gitignore | 20 +- autogen.sh | 21 +- bootstrap | 852 +++++++++++++++++++++++++++++++++++++++++++++----- bootstrap.conf | 145 +++++++++ build-aux/.gitignore | 12 +- po/.gitignore | 26 +- po/Makevars | 41 --- 7 files changed, 967 insertions(+), 150 deletions(-) Eric Blake (4): maint: fix quoting in autogen.sh maint: start factoring bootstrap maint: import modern bootstrap maint: sort .gitignore -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

* autogen.sh (srcdir, THEDIR, OBJ_DIR): Use proper quoting. (.git-module-status): Abort if bootstrap fails. --- I needed this while working on later patches in the series. It's still not completely robust (for example, if srcdir is relative and starts with -), but at least it allows spaces in file names now. More importantly, failure during the bootstrap script no longer continues trying to run configure anyway. autogen.sh | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/autogen.sh b/autogen.sh index 1ddc251..93538f9 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,11 +1,11 @@ #!/bin/sh # Run this to generate all the initial makefiles, etc. -srcdir=`dirname $0` +srcdir=`dirname "$0"` test -z "$srcdir" && srcdir=. THEDIR=`pwd` -cd $srcdir +cd "$srcdir" DIE=0 (autopoint --version) < /dev/null > /dev/null 2>&1 || { @@ -70,7 +70,10 @@ 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 + ./bootstrap && echo "$t" > $curr_status || { + echo "Failed to bootstrap gnulib, please investigate." + exit 1; + } fi # Automake requires that ChangeLog exist. @@ -78,9 +81,9 @@ touch ChangeLog autoreconf -if -cd $THEDIR +cd "$THEDIR" -if test x$OBJ_DIR != x; then +if test "x$OBJ_DIR" != x; then mkdir -p "$OBJ_DIR" cd "$OBJ_DIR" fi -- 1.6.6

On Mon, Feb 22, 2010 at 05:01:31PM -0700, Eric Blake wrote:
* autogen.sh (srcdir, THEDIR, OBJ_DIR): Use proper quoting. (.git-module-status): Abort if bootstrap fails. ---
I needed this while working on later patches in the series. It's still not completely robust (for example, if srcdir is relative and starts with -), but at least it allows spaces in file names now. More importantly, failure during the bootstrap script no longer continues trying to run configure anyway.
autogen.sh | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/autogen.sh b/autogen.sh index 1ddc251..93538f9 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,11 +1,11 @@ #!/bin/sh # Run this to generate all the initial makefiles, etc.
-srcdir=`dirname $0` +srcdir=`dirname "$0"` test -z "$srcdir" && srcdir=.
THEDIR=`pwd` -cd $srcdir +cd "$srcdir" DIE=0
(autopoint --version) < /dev/null > /dev/null 2>&1 || { @@ -70,7 +70,10 @@ 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 + ./bootstrap && echo "$t" > $curr_status || { + echo "Failed to bootstrap gnulib, please investigate." + exit 1; + } fi
# Automake requires that ChangeLog exist. @@ -78,9 +81,9 @@ touch ChangeLog
autoreconf -if
-cd $THEDIR +cd "$THEDIR"
-if test x$OBJ_DIR != x; then +if test "x$OBJ_DIR" != x; then mkdir -p "$OBJ_DIR" cd "$OBJ_DIR" fi --
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

Borrow ideas from gnulib/build-aux/bootstrap, in order to factor the specifics of libvirt into bootstrap.conf, while allowing future upgrades of bootstrap to happen with less effort. * bootstrap (gnulib_tool): Update invocation to be closer to gnulib's version. Move libvirt specifics... * bootstrap.conf: ...into new file. --- All manual edits at this point, but it creates a bootstrap.conf similar to the template in .gnulib/build-aux/bootstrap.conf. bootstrap | 133 +++++++++++++++++++++++++++++++++----------------------- bootstrap.conf | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 54 deletions(-) create mode 100644 bootstrap.conf diff --git a/bootstrap b/bootstrap index 113cc0f..269de3a 100755 --- a/bootstrap +++ b/bootstrap @@ -20,6 +20,72 @@ Running without arguments will suffice in most cases. " } +# Configuration. + +# List of gnulib modules needed. +gnulib_modules= + +extract_package_name=' + /^AC_INIT(/{ + /.*,.*,.*, */{ + s/// + s/[][]//g + s/)$// + p + q + } + s/AC_INIT(\[*// + s/]*,.*// + s/^GNU // + y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + s/[^A-Za-z0-9_]/-/g + p + } +' +package=`sed -n "$extract_package_name" configure.ac` || exit +gnulib_name=lib$package + +build_aux=build-aux +source_base=lib +m4_base=m4 +doc_base=doc +tests_base=tests + +# Extra files from gnulib, which override files from other sources. +gnulib_extra_files=" + $build_aux/install-sh + $build_aux/missing + $build_aux/mdate-sh + $build_aux/texinfo.tex + $build_aux/depcomp + $build_aux/config.guess + $build_aux/config.sub + doc/INSTALL +" + +# Additional gnulib-tool options to use. Use "\newline" to break lines. +gnulib_tool_option_extras= + +# Other locale categories that need message catalogs. +EXTRA_LOCALE_CATEGORIES= + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS='\\\ + --flag=_:1:pass-c-format\\\ + --flag=N_:1:pass-c-format\\\ + --flag=error:3:c-format --flag=error_at_line:5:c-format\\\ +' + +# Override the default configuration, if necessary. +# Make sure that bootstrap.conf is sourced from the current directory +# if we were invoked as "sh bootstrap". +case "$0" in + */*) test -r "$0.conf" && . "$0.conf" ;; + *) test -r "$0.conf" && . ./"$0.conf" ;; +esac + +# Parse options. + for option do case $option in @@ -64,57 +130,16 @@ esac gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit -modules=' -areadlink -base64 -c-ctype -canonicalize-lgpl -close -connect -dirname-lgpl -getaddrinfo -gethostname -getpass -gettext -gitlog-to-changelog -gnumakefile -ignore-value -inet_pton -ioctl -maintainer-makefile -mkstemp -mktempd -perror -physmem -poll -posix-shell -recv -random_r -send -setsockopt -socket -stpcpy -strchrnul -strndup -strerror -strsep -sys_stat -time_r -useless-if-before-free -vasprintf -verify -vc-list-files -' - -# Tell gnulib to: -# require LGPLv2+ -# put *.m4 files in new gnulib/m4/ dir -# put *.[ch] files in new gnulib/lib/ dir. - -$gnulib_tool \ - --lgpl=2 \ - --with-tests \ - --m4-base=gnulib/m4 \ - --source-base=gnulib/lib \ - --tests-base=gnulib/tests \ - --import $modules +gnulib_tool_options="\ + --import\ + --no-changelog\ + --aux-dir $build_aux\ + --doc-base $doc_base\ + --lib $gnulib_name\ + --m4-base $m4_base/\ + --source-base $source_base/\ + --tests-base $tests_base\ + $gnulib_tool_option_extras\ +" +echo "$0: $gnulib_tool $gnulib_tool_options --import ..." +$gnulib_tool $gnulib_tool_options --import $gnulib_modules diff --git a/bootstrap.conf b/bootstrap.conf new file mode 100644 index 0000000..fd3c1cb --- /dev/null +++ b/bootstrap.conf @@ -0,0 +1,124 @@ +# Bootstrap configuration. + +# Copyright (C) 2010 Red Hat, Inc. + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +# gnulib modules used by this package. +gnulib_modules=' +areadlink +base64 +c-ctype +canonicalize-lgpl +close +connect +dirname-lgpl +getaddrinfo +gethostname +getpass +gettext +gitlog-to-changelog +gnumakefile +ignore-value +inet_pton +ioctl +maintainer-makefile +mkstemp +mktempd +perror +physmem +poll +posix-shell +recv +random_r +send +setsockopt +socket +stpcpy +strchrnul +strndup +strerror +strsep +sys_stat +time_r +useless-if-before-free +vasprintf +verify +vc-list-files +' + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ + --flag=virAsprintf:2:c-format\\\ + --from-code=UTF-8\\\ +' + +# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]" +# appears in configure.ac, exclude some unnecessary files. +# Without grep's -E option (not portable enough, pre-configure), +# the following test is ugly. Also, this depends on the existence +# of configure.ac, not the obsolescent-named configure.in. But if +# you're using this infrastructure, you should care about such things. + +gettext_external=0 +grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null && + gettext_external=1 +grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null && + gettext_external=1 + +if test $gettext_external = 1; then + # Gettext supplies these files, but we don't need them since + # we don't have an intl subdirectory. + excluded_files=' + m4/glibc2.m4 + m4/intdiv0.m4 + m4/lcmessage.m4 + m4/uintmax_t.m4 + m4/ulonglong.m4 + m4/visibility.m4 + ' +fi + +# Tell gnulib to: +# require LGPLv2+ +# put *.m4 files in new gnulib/m4/ dir +# put *.[ch] files in new gnulib/lib/ dir. +# import gnulib tests in new gnulib/tests/ dir. +gnulib_name=libgnu +m4_base=gnulib/m4 +source_base=gnulib/lib +tests_base=gnulib/tests +gnulib_tool_option_extras="\ + --lgpl=2\ + --with-tests\ +" + +# Build prerequisites +buildreq="\ +autoconf 2.59 +automake 1.9.6 +autopoint - +gettext - +git 1.6.4 +gzip - +libtool - +perl 5.5 +rsync - +tar - +" + +# Automake requires that ChangeLog exist. +touch ChangeLog || exit 1 -- 1.6.6

On Mon, Feb 22, 2010 at 05:01:32PM -0700, Eric Blake wrote:
Borrow ideas from gnulib/build-aux/bootstrap, in order to factor the specifics of libvirt into bootstrap.conf, while allowing future upgrades of bootstrap to happen with less effort.
* bootstrap (gnulib_tool): Update invocation to be closer to gnulib's version. Move libvirt specifics... * bootstrap.conf: ...into new file. ---
All manual edits at this point, but it creates a bootstrap.conf similar to the template in .gnulib/build-aux/bootstrap.conf.
bootstrap | 133 +++++++++++++++++++++++++++++++++----------------------- bootstrap.conf | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 54 deletions(-) create mode 100644 bootstrap.conf
diff --git a/bootstrap b/bootstrap index 113cc0f..269de3a 100755 --- a/bootstrap +++ b/bootstrap @@ -20,6 +20,72 @@ Running without arguments will suffice in most cases. " }
+# Configuration. + +# List of gnulib modules needed. +gnulib_modules= + +extract_package_name=' + /^AC_INIT(/{ + /.*,.*,.*, */{ + s/// + s/[][]//g + s/)$// + p + q + } + s/AC_INIT(\[*// + s/]*,.*// + s/^GNU // + y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + s/[^A-Za-z0-9_]/-/g + p + } +' +package=`sed -n "$extract_package_name" configure.ac` || exit +gnulib_name=lib$package + +build_aux=build-aux +source_base=lib +m4_base=m4 +doc_base=doc +tests_base=tests + +# Extra files from gnulib, which override files from other sources. +gnulib_extra_files=" + $build_aux/install-sh + $build_aux/missing + $build_aux/mdate-sh + $build_aux/texinfo.tex + $build_aux/depcomp + $build_aux/config.guess + $build_aux/config.sub + doc/INSTALL +" + +# Additional gnulib-tool options to use. Use "\newline" to break lines. +gnulib_tool_option_extras= + +# Other locale categories that need message catalogs. +EXTRA_LOCALE_CATEGORIES= + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS='\\\ + --flag=_:1:pass-c-format\\\ + --flag=N_:1:pass-c-format\\\ + --flag=error:3:c-format --flag=error_at_line:5:c-format\\\ +' + +# Override the default configuration, if necessary. +# Make sure that bootstrap.conf is sourced from the current directory +# if we were invoked as "sh bootstrap". +case "$0" in + */*) test -r "$0.conf" && . "$0.conf" ;; + *) test -r "$0.conf" && . ./"$0.conf" ;; +esac + +# Parse options. + for option do case $option in @@ -64,57 +130,16 @@ esac gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit
-modules=' -areadlink -base64 -c-ctype -canonicalize-lgpl -close -connect -dirname-lgpl -getaddrinfo -gethostname -getpass -gettext -gitlog-to-changelog -gnumakefile -ignore-value -inet_pton -ioctl -maintainer-makefile -mkstemp -mktempd -perror -physmem -poll -posix-shell -recv -random_r -send -setsockopt -socket -stpcpy -strchrnul -strndup -strerror -strsep -sys_stat -time_r -useless-if-before-free -vasprintf -verify -vc-list-files -' - -# Tell gnulib to: -# require LGPLv2+ -# put *.m4 files in new gnulib/m4/ dir -# put *.[ch] files in new gnulib/lib/ dir. - -$gnulib_tool \ - --lgpl=2 \ - --with-tests \ - --m4-base=gnulib/m4 \ - --source-base=gnulib/lib \ - --tests-base=gnulib/tests \ - --import $modules +gnulib_tool_options="\ + --import\ + --no-changelog\ + --aux-dir $build_aux\ + --doc-base $doc_base\ + --lib $gnulib_name\ + --m4-base $m4_base/\ + --source-base $source_base/\ + --tests-base $tests_base\ + $gnulib_tool_option_extras\ +" +echo "$0: $gnulib_tool $gnulib_tool_options --import ..." +$gnulib_tool $gnulib_tool_options --import $gnulib_modules diff --git a/bootstrap.conf b/bootstrap.conf new file mode 100644 index 0000000..fd3c1cb --- /dev/null +++ b/bootstrap.conf @@ -0,0 +1,124 @@ +# Bootstrap configuration. + +# Copyright (C) 2010 Red Hat, Inc. + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +# gnulib modules used by this package. +gnulib_modules=' +areadlink +base64 +c-ctype +canonicalize-lgpl +close +connect +dirname-lgpl +getaddrinfo +gethostname +getpass +gettext +gitlog-to-changelog +gnumakefile +ignore-value +inet_pton +ioctl +maintainer-makefile +mkstemp +mktempd +perror +physmem +poll +posix-shell +recv +random_r +send +setsockopt +socket +stpcpy +strchrnul +strndup +strerror +strsep +sys_stat +time_r +useless-if-before-free +vasprintf +verify +vc-list-files +' + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ + --flag=virAsprintf:2:c-format\\\ + --from-code=UTF-8\\\ +' + +# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]" +# appears in configure.ac, exclude some unnecessary files. +# Without grep's -E option (not portable enough, pre-configure), +# the following test is ugly. Also, this depends on the existence +# of configure.ac, not the obsolescent-named configure.in. But if +# you're using this infrastructure, you should care about such things. + +gettext_external=0 +grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null && + gettext_external=1 +grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null && + gettext_external=1 + +if test $gettext_external = 1; then + # Gettext supplies these files, but we don't need them since + # we don't have an intl subdirectory. + excluded_files=' + m4/glibc2.m4 + m4/intdiv0.m4 + m4/lcmessage.m4 + m4/uintmax_t.m4 + m4/ulonglong.m4 + m4/visibility.m4 + ' +fi + +# Tell gnulib to: +# require LGPLv2+ +# put *.m4 files in new gnulib/m4/ dir +# put *.[ch] files in new gnulib/lib/ dir. +# import gnulib tests in new gnulib/tests/ dir. +gnulib_name=libgnu +m4_base=gnulib/m4 +source_base=gnulib/lib +tests_base=gnulib/tests +gnulib_tool_option_extras="\ + --lgpl=2\ + --with-tests\ +" + +# Build prerequisites +buildreq="\ +autoconf 2.59 +automake 1.9.6 +autopoint - +gettext - +git 1.6.4 +gzip - +libtool - +perl 5.5 +rsync - +tar - +" + +# Automake requires that ChangeLog exist. +touch ChangeLog || exit 1 --
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

According to Eric Blake on 2/22/2010 5:01 PM:
Borrow ideas from gnulib/build-aux/bootstrap, in order to factor the specifics of libvirt into bootstrap.conf, while allowing future upgrades of bootstrap to happen with less effort.
* bootstrap (gnulib_tool): Update invocation to be closer to gnulib's version. Move libvirt specifics... * bootstrap.conf: ...into new file. ... +# Build prerequisites +buildreq="\ +autoconf 2.59 +automake 1.9.6 +autopoint - +gettext - +git 1.6.4 +gzip - +libtool - +perl 5.5 +rsync - +tar -
I don't have a RHEL 5 installation handy; are all of these prerequisites reasonable, or is git 1.6.4 a bit strong of a pre-req? If the latter, then I can further patch gnulib's bootstrap to fall back gracefully to a use of the older 'git clone --reference' instead of 'git submodule update --init --reference'. Are there any other tools that we should be adding into the prereq list, now that gnulib's bootstrap does a good job of aborting early if a development tool is insufficient for building from a git snapshot? -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On Tue, Feb 23, 2010 at 09:31:32AM -0700, Eric Blake wrote:
According to Eric Blake on 2/22/2010 5:01 PM:
Borrow ideas from gnulib/build-aux/bootstrap, in order to factor the specifics of libvirt into bootstrap.conf, while allowing future upgrades of bootstrap to happen with less effort.
* bootstrap (gnulib_tool): Update invocation to be closer to gnulib's version. Move libvirt specifics... * bootstrap.conf: ...into new file. ... +# Build prerequisites +buildreq="\ +autoconf 2.59 +automake 1.9.6 +autopoint - +gettext - +git 1.6.4 +gzip - +libtool - +perl 5.5 +rsync - +tar -
I don't have a RHEL 5 installation handy; are all of these prerequisites reasonable, or is git 1.6.4 a bit strong of a pre-req? If the latter, then I can further patch gnulib's bootstrap to fall back gracefully to a use of the older 'git clone --reference' instead of 'git submodule update --init --reference'. Are there any other tools that we should be adding into the prereq list, now that gnulib's bootstrap does a good job of aborting early if a development tool is insufficient for building from a git snapshot?
The automake/conf versions are fine. The only missing one is GIT, whcih is not in RHEL5 at all, but has GIT 1.5.5 in EPEL Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap. This also fixes a bug in the .pot files, regarding the copyright holder. * bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it. * po/.gitignore: Update. --- As I understand it, it is Red Hat and not FSF that should own the copyright of the .pot file. The bulk of this patch is merely copy-and-paste from gnulib's bootstrap script, which has had a number of improvements since the last time libvirt bootstrap was forked from there. autogen.sh | 8 +- bootstrap | 735 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- bootstrap.conf | 21 ++ po/.gitignore | 1 + po/Makevars | 41 --- 5 files changed, 731 insertions(+), 75 deletions(-) delete mode 100644 po/Makevars diff --git a/autogen.sh b/autogen.sh index 93538f9..833b1d1 100755 --- a/autogen.sh +++ b/autogen.sh @@ -67,7 +67,8 @@ fi 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 + : # good, it's up to date, all we need is autoreconf + autoreconf -if else echo running bootstrap... ./bootstrap && echo "$t" > $curr_status || { @@ -76,11 +77,6 @@ else } fi -# Automake requires that ChangeLog exist. -touch ChangeLog - -autoreconf -if - cd "$THEDIR" if test "x$OBJ_DIR" != x; then diff --git a/bootstrap b/bootstrap index 269de3a..be96444 100755 --- a/bootstrap +++ b/bootstrap @@ -1,8 +1,40 @@ -#!/bin/sh -# Run this before autogen.sh, to pull in all of the gnulib-related bits. +#! /bin/sh + +# Bootstrap this package from checked-out sources. + +# Copyright (C) 2003-2010 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Written by Paul Eggert. + +nl=' +' + +# Ensure file names are sorted consistently across platforms. +LC_ALL=C +export LC_ALL + +local_gl_dir=gl + +# Temporary directory names. +bt='._bootmp' +bt_regex=`echo "$bt"| sed 's/\./[.]/g'` +bt2=${bt}2 usage() { - echo >&2 "\ + cat <<EOF Usage: $0 [OPTION]... Bootstrap this package from the checked-out sources. @@ -11,20 +43,45 @@ Options: sources reside. Use this if you already have gnulib sources on your machine, and do not want to waste your bandwidth downloading - them again. + them again. Defaults to \$GNULIB_SRCDIR. + --copy Copy files instead of creating symbolic links. + --force Attempt to bootstrap even if the sources seem + not to have been checked out. + --skip-po Do not download po files. -If the file bootstrap.conf exists in the current working directory, its +If the file $0.conf exists in the same directory as this script, its contents are read as shell variables to configure the bootstrap. +For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR +are honored. + Running without arguments will suffice in most cases. -" +EOF } # Configuration. +# Name of the Makefile.am +gnulib_mk=gnulib.mk + # List of gnulib modules needed. gnulib_modules= +# Any gnulib files needed that are not in modules. +gnulib_files= + +# A function to be called after everything else in this script. +# Override it via your own definition in bootstrap.conf. +bootstrap_epilogue() { :; } + +# The command to download all .po files for a specified domain into +# a specified directory. Fill in the first %s is the domain name, and +# the second with the destination directory. Use rsync's -L and -r +# options because the latest/%s directory and the .po files within are +# all symlinks. +po_download_command_format=\ +"rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'" + extract_package_name=' /^AC_INIT(/{ /.*,.*,.*, */{ @@ -76,6 +133,65 @@ XGETTEXT_OPTIONS='\\\ --flag=error:3:c-format --flag=error_at_line:5:c-format\\\ ' +# Package bug report address and copyright holder for gettext files +COPYRIGHT_HOLDER='Free Software Foundation, Inc.' +MSGID_BUGS_ADDRESS=bug-$package@gnu.org + +# Files we don't want to import. +excluded_files= + +# File that should exist in the top directory of a checked out hierarchy, +# but not in a distribution tarball. +checkout_only_file=README-hacking + +# Whether to use copies instead of symlinks. +copy=false + +# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want +# those files to be generated in directories like lib/, m4/, and po/. +# Or set it to 'auto' to make this script select which to use based +# on which version control system (if any) is used in the source directory. +vc_ignore=auto + +# find_tool ENVVAR NAMES... +# ------------------------- +# Search for a required program. Use the value of ENVVAR, if set, +# otherwise find the first of the NAMES that can be run (i.e., +# supports --version). If found, set ENVVAR to the program name, +# die otherwise. +find_tool () +{ + # Find sha1sum, named gsha1sum on MacPorts. + find_tool_envvar=$1 + shift + find_tool_names=$@ + eval "find_tool_res=\$$find_tool_envvar" + if test x"$find_tool_res" = x; then + for i + do + if ($i --version </dev/null) >/dev/null 2>&1; then + find_tool_res=$i + break + fi + done + else + find_tool_error_prefix="\$$find_tool_envvar: " + fi + if test x"$find_tool_res" = x; then + echo >&2 "$0: one of these is required: $find_tool_names" + exit 1 + fi + ($find_tool_res --version </dev/null) >/dev/null 2>&1 || { + echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version" + exit 1 + } + eval "$find_tool_envvar=\$find_tool_res" + eval "export $find_tool_envvar" +} + +# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6. +find_tool SHA1SUM sha1sum gsha1sum shasum + # Override the default configuration, if necessary. # Make sure that bootstrap.conf is sourced from the current directory # if we were invoked as "sh bootstrap". @@ -84,6 +200,15 @@ case "$0" in *) test -r "$0.conf" && . ./"$0.conf" ;; esac + +if test "$vc_ignore" = auto; then + vc_ignore= + test -d .git && vc_ignore=.gitignore + test -d CVS && vc_ignore="$vc_ignore .cvsignore" +fi + +# Translate configuration into internal form. + # Parse options. for option @@ -93,36 +218,219 @@ do usage exit;; --gnulib-srcdir=*) - GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;; + GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;; + --skip-po) + SKIP_PO=t;; + --force) + checkout_only_file=;; + --copy) + copy=true;; *) echo >&2 "$0: $option: unknown option" exit 1;; esac done +if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then + echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2 + exit 1 +fi + +# If $STR is not already on a line by itself in $FILE, insert it, +# sorting the new contents of the file and replacing $FILE with the result. +insert_sorted_if_absent() { + file=$1 + str=$2 + test -f $file || touch $file + echo "$str" | sort -u - $file | cmp - $file > /dev/null \ + || echo "$str" | sort -u - $file -o $file \ + || exit 1 +} + +# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac. +found_aux_dir=no +grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \ + >/dev/null && found_aux_dir=yes +grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \ + >/dev/null && found_aux_dir=yes +if test $found_aux_dir = no; then + echo "$0: expected line not found in configure.ac. Add the following:" >&2 + echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2 + exit 1 +fi + +# If $build_aux doesn't exist, create it now, otherwise some bits +# below will malfunction. If creating it, also mark it as ignored. +if test ! -d $build_aux; then + mkdir $build_aux + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + insert_sorted_if_absent $dot_ig $build_aux + done +fi + +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +sort_ver() { # sort -V is not generally available + ver1="$1" + ver2="$2" + + # split on '.' and compare each component + i=1 + while : ; do + p1=$(echo "$ver1" | cut -d. -f$i) + p2=$(echo "$ver2" | cut -d. -f$i) + if [ ! "$p1" ]; then + echo "$1 $2" + break + elif [ ! "$p2" ]; then + echo "$2 $1" + break + elif [ ! "$p1" = "$p2" ]; then + if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison + echo "$2 $1" + elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison + echo "$1 $2" + else # numeric, then lexicographic comparison + lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1) + if [ "$lp" = "$p2" ]; then + echo "$1 $2" + else + echo "$2 $1" + fi + fi + break + fi + i=$(($i+1)) + done +} + +get_version() { + app=$1 + + $app --version >/dev/null 2>&1 || return 1 + + $app --version 2>&1 | + sed -n '# extract version within line + s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ + t done + + # extract version at start of line + s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ + t done + + d + + :done + #the following essentially does s/5.005/5.5/ + s/\.0*\([1-9]\)/.\1/g + p + q' +} + +check_versions() { + ret=0 + + while read app req_ver; do + # Honor $APP variables ($TAR, $AUTOCONF, etc.) + appvar=`echo $app | tr '[a-z]' '[A-Z]'` + test "$appvar" = TAR && appvar=AMTAR + eval "app=\${$appvar-$app}" + inst_ver=$(get_version $app) + if [ ! "$inst_ver" ]; then + echo "Error: '$app' not found" >&2 + ret=1 + elif [ ! "$req_ver" = "-" ]; then + latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2) + if [ ! "$latest_ver" = "$inst_ver" ]; then + echo "Error: '$app' version == $inst_ver is too old" >&2 + echo " '$app' version >= $req_ver is required" >&2 + ret=1 + fi + fi + done + + return $ret +} + +print_versions() { + echo "Program Min_version" + echo "----------------------" + printf "$buildreq" + echo "----------------------" + # can't depend on column -t +} + +if ! printf "$buildreq" | check_versions; then + test -f README-prereq && + echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2 + echo + print_versions + exit 1 +fi + +echo "$0: Bootstrapping from checked-out $package sources..." + +# See if we can use gnulib's git-merge-changelog merge driver. +if test -d .git && (git --version) >/dev/null 2>/dev/null ; then + if git config merge.merge-changelog.driver >/dev/null ; then + : + elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then + echo "initializing git-merge-changelog driver" + git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' + git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' + else + echo "consider installing git-merge-changelog from gnulib" + fi +fi + + +cleanup_gnulib() { + status=$? + rm -fr "$gnulib_path" + exit $status +} + +git_modules_config () { + test -f .gitmodules && git config --file .gitmodules "$@" +} + +gnulib_path=`git_modules_config submodule.gnulib.path` + # Get gnulib files. case ${GNULIB_SRCDIR--} in -) - echo "$0: getting gnulib files..." - git submodule init || exit $? - git submodule update || exit $? - GNULIB_SRCDIR=.gnulib + if git_modules_config submodule.gnulib.url >/dev/null; then + echo "$0: getting gnulib files..." + git submodule init || exit $? + git submodule update || exit $? + + elif [ ! -d "$gnulib_path" ]; then + echo "$0: getting gnulib files..." + + trap cleanup_gnulib 1 2 13 15 + + git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow= + git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" || + cleanup_gnulib + + trap - 1 2 13 15 + fi + GNULIB_SRCDIR=$gnulib_path ;; *) - # Redirect the gnulib submodule to the directory on the command line - # if possible. + # Use GNULIB_SRCDIR as a reference. Assumes git 1.6.4 or newer. if test -d "$GNULIB_SRCDIR"/.git && \ - git config --file .gitmodules submodule.gnulib.url >/dev/null; then - git submodule init - GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd` - git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR + git_modules_config submodule.gnulib.url >/dev/null; then echo "$0: getting gnulib files..." - git submodule update || exit $? - GNULIB_SRCDIR=.gnulib - else - echo >&2 "$0: invalid gnulib srcdir: $GNULIB_SRCDIR" - exit 1 + git submodule update --init --reference "$GNULIB_SRCDIR" \ + "$gnulib_path" || exit $? + GNULIB_SRCDIR=$gnulib_path fi ;; esac @@ -130,16 +438,387 @@ esac gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit +# Get translations. + +download_po_files() { + subdir=$1 + domain=$2 + echo "$0: getting translations into $subdir for $domain..." + cmd=`printf "$po_download_command_format" "$domain" "$subdir"` + eval "$cmd" +} + +# Download .po files to $po_dir/.reference and copy only the new +# or modified ones into $po_dir. Also update $po_dir/LINGUAS. +update_po_files() { + # Directory containing primary .po files. + # Overwrite them only when we're sure a .po file is new. + po_dir=$1 + domain=$2 + + # Download *.po files into this dir. + # Usually contains *.s1 checksum files. + ref_po_dir="$po_dir/.reference" + + test -d $ref_po_dir || mkdir $ref_po_dir || return + download_po_files $ref_po_dir $domain \ + && ls "$ref_po_dir"/*.po 2>/dev/null | + sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" + + langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'` + test "$langs" = '*' && langs=x + for po in $langs; do + case $po in x) continue;; esac + new_po="$ref_po_dir/$po.po" + cksum_file="$ref_po_dir/$po.s1" + if ! test -f "$cksum_file" || + ! test -f "$po_dir/$po.po" || + ! $SHA1SUM -c --status "$cksum_file" \ + < "$new_po" > /dev/null; then + echo "updated $po_dir/$po.po..." + cp "$new_po" "$po_dir/$po.po" \ + && $SHA1SUM < "$new_po" > "$cksum_file" + fi + done +} + +case $SKIP_PO in +'') + if test -d po; then + update_po_files po $package || exit + fi + + if test -d runtime-po; then + update_po_files runtime-po $package-runtime || exit + fi;; +esac + +symlink_to_dir() +{ + src=$1/$2 + dst=${3-$2} + + test -f "$src" && { + + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=`dirname "$dst"` + if ! test -d "$dst_dir"; then + mkdir -p "$dst_dir" + + # If we've just created a directory like lib/uniwidth, + # tell version control system(s) it's ignorable. + # FIXME: for now, this does only one level + parent=`dirname "$dst_dir"` + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$parent/$dot_ig + insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'` + done + fi + + if $copy; then + { + test ! -h "$dst" || { + echo "$0: rm -f $dst" && + rm -f "$dst" + } + } && + test -f "$dst" && + cmp -s "$src" "$dst" || { + echo "$0: cp -fp $src $dst" && + cp -fp "$src" "$dst" + } + else + test -h "$dst" && + src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 && + dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 && + test "$src_i" = "$dst_i" || { + dot_dots= + case $src in + /*) ;; + *) + case /$dst/ in + *//* | */../* | */./* | /*/*/*/*/*/) + echo >&2 "$0: invalid symlink calculation: $src -> $dst" + exit 1;; + /*/*/*/*/) dot_dots=../../../;; + /*/*/*/) dot_dots=../../;; + /*/*/) dot_dots=../;; + esac;; + esac + + echo "$0: ln -fs $dot_dots$src $dst" && + ln -fs "$dot_dots$src" "$dst" + } + fi + } +} + +cp_mark_as_generated() +{ + cp_src=$1 + cp_dst=$2 + + if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then + symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst" + elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then + symlink_to_dir $local_gl_dir "$cp_dst" + else + case $cp_dst in + *.[ch]) c1='/* '; c2=' */';; + *.texi) c1='@c '; c2= ;; + *.m4|*/Make*|Make*) c1='# ' ; c2= ;; + *) c1= ; c2= ;; + esac + + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=`dirname "$cp_dst"` + test -d "$dst_dir" || mkdir -p "$dst_dir" + + if test -z "$c1"; then + cmp -s "$cp_src" "$cp_dst" || { + # Copy the file first to get proper permissions if it + # doesn't already exist. Then overwrite the copy. + echo "$0: cp -f $cp_src $cp_dst" && + rm -f "$cp_dst" && + cp "$cp_src" "$cp_dst-t" && + sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" && + mv -f "$cp_dst-t" "$cp_dst" + } + else + # Copy the file first to get proper permissions if it + # doesn't already exist. Then overwrite the copy. + cp "$cp_src" "$cp_dst-t" && + ( + echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" && + echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" && + sed "s!$bt_regex/!!g" "$cp_src" + ) > $cp_dst-t && + if cmp -s "$cp_dst-t" "$cp_dst"; then + rm -f "$cp_dst-t" + else + echo "$0: cp $cp_src $cp_dst # with edits" && + mv -f "$cp_dst-t" "$cp_dst" + fi + fi + fi +} + +version_controlled_file() { + dir=$1 + file=$2 + found=no + if test -d CVS; then + grep -F "/$file/" $dir/CVS/Entries 2>/dev/null | + grep '^/[^/]*/[0-9]' > /dev/null && found=yes + elif test -d .git; then + git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes + elif test -d .svn; then + svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes + else + echo "$0: no version control for $dir/$file?" >&2 + fi + test $found = yes +} + +slurp() { + for dir in . `(cd $1 && find * -type d -print)`; do + copied= + sep= + for file in `ls -a $1/$dir`; do + case $file in + .|..) continue;; + .*) continue;; # FIXME: should all file names starting with "." be ignored? + esac + test -d $1/$dir/$file && continue + for excluded_file in $excluded_files; do + test "$dir/$file" = "$excluded_file" && continue 2 + done + if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then + copied=$copied${sep}$gnulib_mk; sep=$nl + remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g" + sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || { + echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." && + rm -f $dir/$gnulib_mk && + sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk + } + elif { test "${2+set}" = set && test -r $2/$dir/$file; } || + version_controlled_file $dir $file; then + echo "$0: $dir/$file overrides $1/$dir/$file" + else + copied=$copied$sep$file; sep=$nl + if test $file = gettext.m4; then + echo "$0: patching m4/gettext.m4 to remove need for intl/* ..." + rm -f $dir/$file + sed ' + /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\ + AC_DEFUN([AM_INTL_SUBDIR], []) + /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\ + AC_DEFUN([gt_INTL_SUBDIR_CORE], []) + $a\ + AC_DEFUN([gl_LOCK_EARLY], []) + ' $1/$dir/$file >$dir/$file + else + cp_mark_as_generated $1/$dir/$file $dir/$file + fi + fi || exit + done + + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$dir/$dot_ig + if test -n "$copied"; then + insert_sorted_if_absent $ig "$copied" + # If an ignored file name ends with .in.h, then also add + # the name with just ".h". Many gnulib headers are generated, + # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc. + # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed + f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'` + insert_sorted_if_absent $ig "$f" + + # For files like sys_stat.in.h and sys_time.in.h, record as + # ignorable the directory we might eventually create: sys/. + f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'` + insert_sorted_if_absent $ig "$f" + fi + done + done +} + + +# Create boot temporary directories to import from gnulib and gettext. +rm -fr $bt $bt2 && +mkdir $bt $bt2 || exit + +# Import from gnulib. + gnulib_tool_options="\ --import\ --no-changelog\ - --aux-dir $build_aux\ - --doc-base $doc_base\ + --aux-dir $bt/$build_aux\ + --doc-base $bt/$doc_base\ --lib $gnulib_name\ - --m4-base $m4_base/\ - --source-base $source_base/\ - --tests-base $tests_base\ + --m4-base $bt/$m4_base/\ + --source-base $bt/$source_base/\ + --tests-base $bt/$tests_base\ + --local-dir $local_gl_dir\ $gnulib_tool_option_extras\ " echo "$0: $gnulib_tool $gnulib_tool_options --import ..." -$gnulib_tool $gnulib_tool_options --import $gnulib_modules +$gnulib_tool $gnulib_tool_options --import $gnulib_modules && +slurp $bt || exit + +for file in $gnulib_files; do + symlink_to_dir "$GNULIB_SRCDIR" $file || exit +done + + +# Import from gettext. +with_gettext=yes +grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \ + with_gettext=no + +if test $with_gettext = yes; then + echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..." + cp configure.ac $bt2 && + (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) && + slurp $bt2 $bt || exit +fi +rm -fr $bt $bt2 || exit + +# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some +# gnulib-populated directories. Such .m4 files would cause aclocal to fail. +# The following requires GNU find 4.2.3 or newer. Considering the usual +# portability constraints of this script, that may seem a very demanding +# requirement, but it should be ok. Ignore any failure, which is fine, +# since this is only a convenience to help developers avoid the relatively +# unusual case in which a symlinked-to .m4 file is git-removed from gnulib +# between successive runs of this script. +find "$m4_base" "$source_base" \ + -depth \( -name '*.m4' -o -name '*.[ch]' \) \ + -type l -xtype l -delete > /dev/null 2>&1 + +# Reconfigure, getting other files. + +# Skip autoheader if it's not needed. +grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null || + AUTOHEADER=true + +for command in \ + libtool \ + "${ACLOCAL-aclocal} --force -I m4" \ + "${AUTOCONF-autoconf} --force" \ + "${AUTOHEADER-autoheader} --force" \ + "${AUTOMAKE-automake} --add-missing --copy --force-missing" +do + if test "$command" = libtool; then + use_libtool=0 + # We'd like to use grep -E, to see if any of LT_INIT, + # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, + # but that's not portable enough (e.g., for Solaris). + grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \ + && use_libtool=1 + grep '^[ ]*LT_INIT' configure.ac >/dev/null \ + && use_libtool=1 + test $use_libtool = 0 \ + && continue + command="${LIBTOOLIZE-libtoolize} -c -f" + fi + echo "$0: $command ..." + $command || exit +done + + +# Get some extra files from gnulib, overriding existing files. +for file in $gnulib_extra_files; do + case $file in + */INSTALL) dst=INSTALL;; + build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;; + *) dst=$file;; + esac + symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit +done + +if test $with_gettext = yes; then + # Create gettext configuration. + echo "$0: Creating po/Makevars from po/Makevars.template ..." + rm -f po/Makevars + sed ' + /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/ + /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/ + /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'| + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+} + } + ' po/Makevars.template >po/Makevars + + if test -d runtime-po; then + # Similarly for runtime-po/Makevars, but not quite the same. + rm -f runtime-po/Makevars + sed ' + /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/ + /^subdir *=.*/s/=.*/= runtime-po/ + /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/ + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+} + } + ' <po/Makevars.template >runtime-po/Makevars + + # Copy identical files from po to runtime-po. + (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po) + fi +fi + +bootstrap_epilogue + +echo "$0: done. Now you can run './configure'." + +# Local Variables: +# indent-tabs-mode: nil +# End: diff --git a/bootstrap.conf b/bootstrap.conf index fd3c1cb..d315e04 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -66,6 +66,12 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ --from-code=UTF-8\\\ ' +# This is not a GNU package, so the default bug address is invalid, +# and the translation project is not in use. +MSGID_BUGS_ADDRESS=libvir-list@redhat.com +COPYRIGHT_HOLDER='Red Hat, Inc.' +SKIP_PO=true + # If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]" # appears in configure.ac, exclude some unnecessary files. # Without grep's -E option (not portable enough, pre-configure), @@ -101,11 +107,17 @@ gnulib_name=libgnu m4_base=gnulib/m4 source_base=gnulib/lib tests_base=gnulib/tests +gnulib_mk=Makefile.am gnulib_tool_option_extras="\ --lgpl=2\ --with-tests\ " +# Convince bootstrap to use multiple m4 directories. +: ${ACLOCAL=aclocal} +ACLOCAL="$ACLOCAL -I gnulib/m4" +export ACLOCAL + # Build prerequisites buildreq="\ autoconf 2.59 @@ -122,3 +134,12 @@ tar - # Automake requires that ChangeLog exist. touch ChangeLog || exit 1 + + +bootstrap_epilogue() +{ + # Change paths in gnulib/tests/Makefile.am from "../../.." to "../..". + m=gnulib/tests/Makefile.am + sed 's,\.\./\.\./\.\.,../..,g' $m > $m-t + mv -f $m-t $m +} diff --git a/po/.gitignore b/po/.gitignore index a0b63f3..40ff7c8 100644 --- a/po/.gitignore +++ b/po/.gitignore @@ -13,3 +13,4 @@ Makefile.in.in Makefile.in Makefile remove-potcdate.sed +Makevars diff --git a/po/Makevars b/po/Makevars deleted file mode 100644 index 3b09143..0000000 --- a/po/Makevars +++ /dev/null @@ -1,41 +0,0 @@ -# Makefile variables for PO directory in any package using GNU gettext. - -# Usually the message domain is the same as the package name. -DOMAIN = $(PACKAGE) - -# These two variables depend on the location of this directory. -subdir = po -top_builddir = .. - -# These options get passed to xgettext. -XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ - -# This is the copyright holder that gets inserted into the header of the -# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding -# package. (Note that the msgstr strings, extracted from the package's -# sources, belong to the copyright holder of the package.) Translators are -# expected to transfer the copyright for their translations to this person -# or entity, or to disclaim their copyright. The empty string stands for -# the public domain; in this case the translators are expected to disclaim -# their copyright. -COPYRIGHT_HOLDER = Free Software Foundation, Inc. - -# This is the email address or URL to which the translators shall report -# bugs in the untranslated strings: -# - Strings which are not entire sentences, see the maintainer guidelines -# in the GNU gettext documentation, section 'Preparing Strings'. -# - Strings which use unclear terms or require additional context to be -# understood. -# - Strings which make invalid assumptions about notation of date, time or -# money. -# - Pluralisation problems. -# - Incorrect English spelling. -# - Incorrect formatting. -# It can be your email address, or a mailing list address where translators -# can write to without being subscribed, or the URL of a web page through -# which the translators can contact you. -MSGID_BUGS_ADDRESS = libvir-list@redhat.com - -# This is the list of locale categories, beyond LC_MESSAGES, for which the -# message catalogs shall be used. It is usually empty. -EXTRA_LOCALE_CATEGORIES = -- 1.6.6

On Mon, Feb 22, 2010 at 05:01:33PM -0700, Eric Blake wrote:
Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it. * po/.gitignore: Update. ---
As I understand it, it is Red Hat and not FSF that should own the copyright of the .pot file.
Yes, that's correct
The bulk of this patch is merely copy-and-paste from gnulib's bootstrap script, which has had a number of improvements since the last time libvirt bootstrap was forked from there.
autogen.sh | 8 +- bootstrap | 735 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- bootstrap.conf | 21 ++ po/.gitignore | 1 + po/Makevars | 41 --- 5 files changed, 731 insertions(+), 75 deletions(-) delete mode 100644 po/Makevars
diff --git a/autogen.sh b/autogen.sh index 93538f9..833b1d1 100755 --- a/autogen.sh +++ b/autogen.sh @@ -67,7 +67,8 @@ fi 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 + : # good, it's up to date, all we need is autoreconf + autoreconf -if else echo running bootstrap... ./bootstrap && echo "$t" > $curr_status || { @@ -76,11 +77,6 @@ else } fi
-# Automake requires that ChangeLog exist. -touch ChangeLog - -autoreconf -if - cd "$THEDIR"
if test "x$OBJ_DIR" != x; then diff --git a/bootstrap b/bootstrap index 269de3a..be96444 100755 --- a/bootstrap +++ b/bootstrap @@ -1,8 +1,40 @@ -#!/bin/sh -# Run this before autogen.sh, to pull in all of the gnulib-related bits. +#! /bin/sh + +# Bootstrap this package from checked-out sources. + +# Copyright (C) 2003-2010 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Written by Paul Eggert. + +nl=' +' + +# Ensure file names are sorted consistently across platforms. +LC_ALL=C +export LC_ALL + +local_gl_dir=gl + +# Temporary directory names. +bt='._bootmp' +bt_regex=`echo "$bt"| sed 's/\./[.]/g'` +bt2=${bt}2
usage() { - echo >&2 "\ + cat <<EOF Usage: $0 [OPTION]... Bootstrap this package from the checked-out sources.
@@ -11,20 +43,45 @@ Options: sources reside. Use this if you already have gnulib sources on your machine, and do not want to waste your bandwidth downloading - them again. + them again. Defaults to \$GNULIB_SRCDIR. + --copy Copy files instead of creating symbolic links. + --force Attempt to bootstrap even if the sources seem + not to have been checked out. + --skip-po Do not download po files.
-If the file bootstrap.conf exists in the current working directory, its +If the file $0.conf exists in the same directory as this script, its contents are read as shell variables to configure the bootstrap.
+For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR +are honored. + Running without arguments will suffice in most cases. -" +EOF }
# Configuration.
+# Name of the Makefile.am +gnulib_mk=gnulib.mk + # List of gnulib modules needed. gnulib_modules=
+# Any gnulib files needed that are not in modules. +gnulib_files= + +# A function to be called after everything else in this script. +# Override it via your own definition in bootstrap.conf. +bootstrap_epilogue() { :; } + +# The command to download all .po files for a specified domain into +# a specified directory. Fill in the first %s is the domain name, and +# the second with the destination directory. Use rsync's -L and -r +# options because the latest/%s directory and the .po files within are +# all symlinks. +po_download_command_format=\ +"rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'" + extract_package_name=' /^AC_INIT(/{ /.*,.*,.*, */{ @@ -76,6 +133,65 @@ XGETTEXT_OPTIONS='\\\ --flag=error:3:c-format --flag=error_at_line:5:c-format\\\ '
+# Package bug report address and copyright holder for gettext files +COPYRIGHT_HOLDER='Free Software Foundation, Inc.' +MSGID_BUGS_ADDRESS=bug-$package@gnu.org + +# Files we don't want to import. +excluded_files= + +# File that should exist in the top directory of a checked out hierarchy, +# but not in a distribution tarball. +checkout_only_file=README-hacking + +# Whether to use copies instead of symlinks. +copy=false + +# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want +# those files to be generated in directories like lib/, m4/, and po/. +# Or set it to 'auto' to make this script select which to use based +# on which version control system (if any) is used in the source directory. +vc_ignore=auto + +# find_tool ENVVAR NAMES... +# ------------------------- +# Search for a required program. Use the value of ENVVAR, if set, +# otherwise find the first of the NAMES that can be run (i.e., +# supports --version). If found, set ENVVAR to the program name, +# die otherwise. +find_tool () +{ + # Find sha1sum, named gsha1sum on MacPorts. + find_tool_envvar=$1 + shift + find_tool_names=$@ + eval "find_tool_res=\$$find_tool_envvar" + if test x"$find_tool_res" = x; then + for i + do + if ($i --version </dev/null) >/dev/null 2>&1; then + find_tool_res=$i + break + fi + done + else + find_tool_error_prefix="\$$find_tool_envvar: " + fi + if test x"$find_tool_res" = x; then + echo >&2 "$0: one of these is required: $find_tool_names" + exit 1 + fi + ($find_tool_res --version </dev/null) >/dev/null 2>&1 || { + echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version" + exit 1 + } + eval "$find_tool_envvar=\$find_tool_res" + eval "export $find_tool_envvar" +} + +# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6. +find_tool SHA1SUM sha1sum gsha1sum shasum + # Override the default configuration, if necessary. # Make sure that bootstrap.conf is sourced from the current directory # if we were invoked as "sh bootstrap". @@ -84,6 +200,15 @@ case "$0" in *) test -r "$0.conf" && . ./"$0.conf" ;; esac
+ +if test "$vc_ignore" = auto; then + vc_ignore= + test -d .git && vc_ignore=.gitignore + test -d CVS && vc_ignore="$vc_ignore .cvsignore" +fi + +# Translate configuration into internal form. + # Parse options.
for option @@ -93,36 +218,219 @@ do usage exit;; --gnulib-srcdir=*) - GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;; + GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;; + --skip-po) + SKIP_PO=t;; + --force) + checkout_only_file=;; + --copy) + copy=true;; *) echo >&2 "$0: $option: unknown option" exit 1;; esac done
+if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then + echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2 + exit 1 +fi + +# If $STR is not already on a line by itself in $FILE, insert it, +# sorting the new contents of the file and replacing $FILE with the result. +insert_sorted_if_absent() { + file=$1 + str=$2 + test -f $file || touch $file + echo "$str" | sort -u - $file | cmp - $file > /dev/null \ + || echo "$str" | sort -u - $file -o $file \ + || exit 1 +} + +# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac. +found_aux_dir=no +grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \ + >/dev/null && found_aux_dir=yes +grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \ + >/dev/null && found_aux_dir=yes +if test $found_aux_dir = no; then + echo "$0: expected line not found in configure.ac. Add the following:" >&2 + echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2 + exit 1 +fi + +# If $build_aux doesn't exist, create it now, otherwise some bits +# below will malfunction. If creating it, also mark it as ignored. +if test ! -d $build_aux; then + mkdir $build_aux + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + insert_sorted_if_absent $dot_ig $build_aux + done +fi + +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +sort_ver() { # sort -V is not generally available + ver1="$1" + ver2="$2" + + # split on '.' and compare each component + i=1 + while : ; do + p1=$(echo "$ver1" | cut -d. -f$i) + p2=$(echo "$ver2" | cut -d. -f$i) + if [ ! "$p1" ]; then + echo "$1 $2" + break + elif [ ! "$p2" ]; then + echo "$2 $1" + break + elif [ ! "$p1" = "$p2" ]; then + if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison + echo "$2 $1" + elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison + echo "$1 $2" + else # numeric, then lexicographic comparison + lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1) + if [ "$lp" = "$p2" ]; then + echo "$1 $2" + else + echo "$2 $1" + fi + fi + break + fi + i=$(($i+1)) + done +} + +get_version() { + app=$1 + + $app --version >/dev/null 2>&1 || return 1 + + $app --version 2>&1 | + sed -n '# extract version within line + s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ + t done + + # extract version at start of line + s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ + t done + + d + + :done + #the following essentially does s/5.005/5.5/ + s/\.0*\([1-9]\)/.\1/g + p + q' +} + +check_versions() { + ret=0 + + while read app req_ver; do + # Honor $APP variables ($TAR, $AUTOCONF, etc.) + appvar=`echo $app | tr '[a-z]' '[A-Z]'` + test "$appvar" = TAR && appvar=AMTAR + eval "app=\${$appvar-$app}" + inst_ver=$(get_version $app) + if [ ! "$inst_ver" ]; then + echo "Error: '$app' not found" >&2 + ret=1 + elif [ ! "$req_ver" = "-" ]; then + latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2) + if [ ! "$latest_ver" = "$inst_ver" ]; then + echo "Error: '$app' version == $inst_ver is too old" >&2 + echo " '$app' version >= $req_ver is required" >&2 + ret=1 + fi + fi + done + + return $ret +} + +print_versions() { + echo "Program Min_version" + echo "----------------------" + printf "$buildreq" + echo "----------------------" + # can't depend on column -t +} + +if ! printf "$buildreq" | check_versions; then + test -f README-prereq && + echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2 + echo + print_versions + exit 1 +fi + +echo "$0: Bootstrapping from checked-out $package sources..." + +# See if we can use gnulib's git-merge-changelog merge driver. +if test -d .git && (git --version) >/dev/null 2>/dev/null ; then + if git config merge.merge-changelog.driver >/dev/null ; then + : + elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then + echo "initializing git-merge-changelog driver" + git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' + git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' + else + echo "consider installing git-merge-changelog from gnulib" + fi +fi + + +cleanup_gnulib() { + status=$? + rm -fr "$gnulib_path" + exit $status +} + +git_modules_config () { + test -f .gitmodules && git config --file .gitmodules "$@" +} + +gnulib_path=`git_modules_config submodule.gnulib.path` + # Get gnulib files.
case ${GNULIB_SRCDIR--} in -) - echo "$0: getting gnulib files..." - git submodule init || exit $? - git submodule update || exit $? - GNULIB_SRCDIR=.gnulib + if git_modules_config submodule.gnulib.url >/dev/null; then + echo "$0: getting gnulib files..." + git submodule init || exit $? + git submodule update || exit $? + + elif [ ! -d "$gnulib_path" ]; then + echo "$0: getting gnulib files..." + + trap cleanup_gnulib 1 2 13 15 + + git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow= + git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" || + cleanup_gnulib + + trap - 1 2 13 15 + fi + GNULIB_SRCDIR=$gnulib_path ;; *) - # Redirect the gnulib submodule to the directory on the command line - # if possible. + # Use GNULIB_SRCDIR as a reference. Assumes git 1.6.4 or newer. if test -d "$GNULIB_SRCDIR"/.git && \ - git config --file .gitmodules submodule.gnulib.url >/dev/null; then - git submodule init - GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd` - git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR + git_modules_config submodule.gnulib.url >/dev/null; then echo "$0: getting gnulib files..." - git submodule update || exit $? - GNULIB_SRCDIR=.gnulib - else - echo >&2 "$0: invalid gnulib srcdir: $GNULIB_SRCDIR" - exit 1 + git submodule update --init --reference "$GNULIB_SRCDIR" \ + "$gnulib_path" || exit $? + GNULIB_SRCDIR=$gnulib_path fi ;; esac @@ -130,16 +438,387 @@ esac gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit
+# Get translations. + +download_po_files() { + subdir=$1 + domain=$2 + echo "$0: getting translations into $subdir for $domain..." + cmd=`printf "$po_download_command_format" "$domain" "$subdir"` + eval "$cmd" +} + +# Download .po files to $po_dir/.reference and copy only the new +# or modified ones into $po_dir. Also update $po_dir/LINGUAS. +update_po_files() { + # Directory containing primary .po files. + # Overwrite them only when we're sure a .po file is new. + po_dir=$1 + domain=$2 + + # Download *.po files into this dir. + # Usually contains *.s1 checksum files. + ref_po_dir="$po_dir/.reference" + + test -d $ref_po_dir || mkdir $ref_po_dir || return + download_po_files $ref_po_dir $domain \ + && ls "$ref_po_dir"/*.po 2>/dev/null | + sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" + + langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'` + test "$langs" = '*' && langs=x + for po in $langs; do + case $po in x) continue;; esac + new_po="$ref_po_dir/$po.po" + cksum_file="$ref_po_dir/$po.s1" + if ! test -f "$cksum_file" || + ! test -f "$po_dir/$po.po" || + ! $SHA1SUM -c --status "$cksum_file" \ + < "$new_po" > /dev/null; then + echo "updated $po_dir/$po.po..." + cp "$new_po" "$po_dir/$po.po" \ + && $SHA1SUM < "$new_po" > "$cksum_file" + fi + done +} + +case $SKIP_PO in +'') + if test -d po; then + update_po_files po $package || exit + fi + + if test -d runtime-po; then + update_po_files runtime-po $package-runtime || exit + fi;; +esac + +symlink_to_dir() +{ + src=$1/$2 + dst=${3-$2} + + test -f "$src" && { + + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=`dirname "$dst"` + if ! test -d "$dst_dir"; then + mkdir -p "$dst_dir" + + # If we've just created a directory like lib/uniwidth, + # tell version control system(s) it's ignorable. + # FIXME: for now, this does only one level + parent=`dirname "$dst_dir"` + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$parent/$dot_ig + insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'` + done + fi + + if $copy; then + { + test ! -h "$dst" || { + echo "$0: rm -f $dst" && + rm -f "$dst" + } + } && + test -f "$dst" && + cmp -s "$src" "$dst" || { + echo "$0: cp -fp $src $dst" && + cp -fp "$src" "$dst" + } + else + test -h "$dst" && + src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 && + dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 && + test "$src_i" = "$dst_i" || { + dot_dots= + case $src in + /*) ;; + *) + case /$dst/ in + *//* | */../* | */./* | /*/*/*/*/*/) + echo >&2 "$0: invalid symlink calculation: $src -> $dst" + exit 1;; + /*/*/*/*/) dot_dots=../../../;; + /*/*/*/) dot_dots=../../;; + /*/*/) dot_dots=../;; + esac;; + esac + + echo "$0: ln -fs $dot_dots$src $dst" && + ln -fs "$dot_dots$src" "$dst" + } + fi + } +} + +cp_mark_as_generated() +{ + cp_src=$1 + cp_dst=$2 + + if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then + symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst" + elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then + symlink_to_dir $local_gl_dir "$cp_dst" + else + case $cp_dst in + *.[ch]) c1='/* '; c2=' */';; + *.texi) c1='@c '; c2= ;; + *.m4|*/Make*|Make*) c1='# ' ; c2= ;; + *) c1= ; c2= ;; + esac + + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=`dirname "$cp_dst"` + test -d "$dst_dir" || mkdir -p "$dst_dir" + + if test -z "$c1"; then + cmp -s "$cp_src" "$cp_dst" || { + # Copy the file first to get proper permissions if it + # doesn't already exist. Then overwrite the copy. + echo "$0: cp -f $cp_src $cp_dst" && + rm -f "$cp_dst" && + cp "$cp_src" "$cp_dst-t" && + sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" && + mv -f "$cp_dst-t" "$cp_dst" + } + else + # Copy the file first to get proper permissions if it + # doesn't already exist. Then overwrite the copy. + cp "$cp_src" "$cp_dst-t" && + ( + echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" && + echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" && + sed "s!$bt_regex/!!g" "$cp_src" + ) > $cp_dst-t && + if cmp -s "$cp_dst-t" "$cp_dst"; then + rm -f "$cp_dst-t" + else + echo "$0: cp $cp_src $cp_dst # with edits" && + mv -f "$cp_dst-t" "$cp_dst" + fi + fi + fi +} + +version_controlled_file() { + dir=$1 + file=$2 + found=no + if test -d CVS; then + grep -F "/$file/" $dir/CVS/Entries 2>/dev/null | + grep '^/[^/]*/[0-9]' > /dev/null && found=yes + elif test -d .git; then + git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes + elif test -d .svn; then + svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes + else + echo "$0: no version control for $dir/$file?" >&2 + fi + test $found = yes +} + +slurp() { + for dir in . `(cd $1 && find * -type d -print)`; do + copied= + sep= + for file in `ls -a $1/$dir`; do + case $file in + .|..) continue;; + .*) continue;; # FIXME: should all file names starting with "." be ignored? + esac + test -d $1/$dir/$file && continue + for excluded_file in $excluded_files; do + test "$dir/$file" = "$excluded_file" && continue 2 + done + if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then + copied=$copied${sep}$gnulib_mk; sep=$nl + remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g" + sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || { + echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." && + rm -f $dir/$gnulib_mk && + sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk + } + elif { test "${2+set}" = set && test -r $2/$dir/$file; } || + version_controlled_file $dir $file; then + echo "$0: $dir/$file overrides $1/$dir/$file" + else + copied=$copied$sep$file; sep=$nl + if test $file = gettext.m4; then + echo "$0: patching m4/gettext.m4 to remove need for intl/* ..." + rm -f $dir/$file + sed ' + /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\ + AC_DEFUN([AM_INTL_SUBDIR], []) + /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\ + AC_DEFUN([gt_INTL_SUBDIR_CORE], []) + $a\ + AC_DEFUN([gl_LOCK_EARLY], []) + ' $1/$dir/$file >$dir/$file + else + cp_mark_as_generated $1/$dir/$file $dir/$file + fi + fi || exit + done + + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$dir/$dot_ig + if test -n "$copied"; then + insert_sorted_if_absent $ig "$copied" + # If an ignored file name ends with .in.h, then also add + # the name with just ".h". Many gnulib headers are generated, + # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc. + # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed + f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'` + insert_sorted_if_absent $ig "$f" + + # For files like sys_stat.in.h and sys_time.in.h, record as + # ignorable the directory we might eventually create: sys/. + f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'` + insert_sorted_if_absent $ig "$f" + fi + done + done +} + + +# Create boot temporary directories to import from gnulib and gettext. +rm -fr $bt $bt2 && +mkdir $bt $bt2 || exit + +# Import from gnulib. + gnulib_tool_options="\ --import\ --no-changelog\ - --aux-dir $build_aux\ - --doc-base $doc_base\ + --aux-dir $bt/$build_aux\ + --doc-base $bt/$doc_base\ --lib $gnulib_name\ - --m4-base $m4_base/\ - --source-base $source_base/\ - --tests-base $tests_base\ + --m4-base $bt/$m4_base/\ + --source-base $bt/$source_base/\ + --tests-base $bt/$tests_base\ + --local-dir $local_gl_dir\ $gnulib_tool_option_extras\ " echo "$0: $gnulib_tool $gnulib_tool_options --import ..." -$gnulib_tool $gnulib_tool_options --import $gnulib_modules +$gnulib_tool $gnulib_tool_options --import $gnulib_modules && +slurp $bt || exit + +for file in $gnulib_files; do + symlink_to_dir "$GNULIB_SRCDIR" $file || exit +done + + +# Import from gettext. +with_gettext=yes +grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \ + with_gettext=no + +if test $with_gettext = yes; then + echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..." + cp configure.ac $bt2 && + (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) && + slurp $bt2 $bt || exit +fi +rm -fr $bt $bt2 || exit + +# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some +# gnulib-populated directories. Such .m4 files would cause aclocal to fail. +# The following requires GNU find 4.2.3 or newer. Considering the usual +# portability constraints of this script, that may seem a very demanding +# requirement, but it should be ok. Ignore any failure, which is fine, +# since this is only a convenience to help developers avoid the relatively +# unusual case in which a symlinked-to .m4 file is git-removed from gnulib +# between successive runs of this script. +find "$m4_base" "$source_base" \ + -depth \( -name '*.m4' -o -name '*.[ch]' \) \ + -type l -xtype l -delete > /dev/null 2>&1 + +# Reconfigure, getting other files. + +# Skip autoheader if it's not needed. +grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null || + AUTOHEADER=true + +for command in \ + libtool \ + "${ACLOCAL-aclocal} --force -I m4" \ + "${AUTOCONF-autoconf} --force" \ + "${AUTOHEADER-autoheader} --force" \ + "${AUTOMAKE-automake} --add-missing --copy --force-missing" +do + if test "$command" = libtool; then + use_libtool=0 + # We'd like to use grep -E, to see if any of LT_INIT, + # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, + # but that's not portable enough (e.g., for Solaris). + grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \ + && use_libtool=1 + grep '^[ ]*LT_INIT' configure.ac >/dev/null \ + && use_libtool=1 + test $use_libtool = 0 \ + && continue + command="${LIBTOOLIZE-libtoolize} -c -f" + fi + echo "$0: $command ..." + $command || exit +done + + +# Get some extra files from gnulib, overriding existing files. +for file in $gnulib_extra_files; do + case $file in + */INSTALL) dst=INSTALL;; + build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;; + *) dst=$file;; + esac + symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit +done + +if test $with_gettext = yes; then + # Create gettext configuration. + echo "$0: Creating po/Makevars from po/Makevars.template ..." + rm -f po/Makevars + sed ' + /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/ + /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/ + /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'| + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+} + } + ' po/Makevars.template >po/Makevars + + if test -d runtime-po; then + # Similarly for runtime-po/Makevars, but not quite the same. + rm -f runtime-po/Makevars + sed ' + /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/ + /^subdir *=.*/s/=.*/= runtime-po/ + /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/ + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+} + } + ' <po/Makevars.template >runtime-po/Makevars + + # Copy identical files from po to runtime-po. + (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po) + fi +fi + +bootstrap_epilogue + +echo "$0: done. Now you can run './configure'." + +# Local Variables: +# indent-tabs-mode: nil +# End: diff --git a/bootstrap.conf b/bootstrap.conf index fd3c1cb..d315e04 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -66,6 +66,12 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ --from-code=UTF-8\\\ '
+# This is not a GNU package, so the default bug address is invalid, +# and the translation project is not in use. +MSGID_BUGS_ADDRESS=libvir-list@redhat.com +COPYRIGHT_HOLDER='Red Hat, Inc.' +SKIP_PO=true + # If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]" # appears in configure.ac, exclude some unnecessary files. # Without grep's -E option (not portable enough, pre-configure), @@ -101,11 +107,17 @@ gnulib_name=libgnu m4_base=gnulib/m4 source_base=gnulib/lib tests_base=gnulib/tests +gnulib_mk=Makefile.am gnulib_tool_option_extras="\ --lgpl=2\ --with-tests\ "
+# Convince bootstrap to use multiple m4 directories. +: ${ACLOCAL=aclocal} +ACLOCAL="$ACLOCAL -I gnulib/m4" +export ACLOCAL + # Build prerequisites buildreq="\ autoconf 2.59 @@ -122,3 +134,12 @@ tar -
# Automake requires that ChangeLog exist. touch ChangeLog || exit 1 + + +bootstrap_epilogue() +{ + # Change paths in gnulib/tests/Makefile.am from "../../.." to "../..". + m=gnulib/tests/Makefile.am + sed 's,\.\./\.\./\.\.,../..,g' $m > $m-t + mv -f $m-t $m +} diff --git a/po/.gitignore b/po/.gitignore index a0b63f3..40ff7c8 100644 --- a/po/.gitignore +++ b/po/.gitignore @@ -13,3 +13,4 @@ Makefile.in.in Makefile.in Makefile remove-potcdate.sed +Makevars diff --git a/po/Makevars b/po/Makevars deleted file mode 100644 index 3b09143..0000000 --- a/po/Makevars +++ /dev/null @@ -1,41 +0,0 @@ -# Makefile variables for PO directory in any package using GNU gettext. - -# Usually the message domain is the same as the package name. -DOMAIN = $(PACKAGE) - -# These two variables depend on the location of this directory. -subdir = po -top_builddir = .. - -# These options get passed to xgettext. -XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ - -# This is the copyright holder that gets inserted into the header of the -# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding -# package. (Note that the msgstr strings, extracted from the package's -# sources, belong to the copyright holder of the package.) Translators are -# expected to transfer the copyright for their translations to this person -# or entity, or to disclaim their copyright. The empty string stands for -# the public domain; in this case the translators are expected to disclaim -# their copyright. -COPYRIGHT_HOLDER = Free Software Foundation, Inc. - -# This is the email address or URL to which the translators shall report -# bugs in the untranslated strings: -# - Strings which are not entire sentences, see the maintainer guidelines -# in the GNU gettext documentation, section 'Preparing Strings'. -# - Strings which use unclear terms or require additional context to be -# understood. -# - Strings which make invalid assumptions about notation of date, time or -# money. -# - Pluralisation problems. -# - Incorrect English spelling. -# - Incorrect formatting. -# It can be your email address, or a mailing list address where translators -# can write to without being subscribed, or the URL of a web page through -# which the translators can contact you. -MSGID_BUGS_ADDRESS = libvir-list@redhat.com - -# This is the list of locale categories, beyond LC_MESSAGES, for which the -# message catalogs shall be used. It is usually empty. -EXTRA_LOCALE_CATEGORIES = --
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

Daniel P. Berrange wrote:
On Mon, Feb 22, 2010 at 05:01:33PM -0700, Eric Blake wrote:
Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it. * po/.gitignore: Update. ---
As I understand it, it is Red Hat and not FSF that should own the copyright of the .pot file.
Yes, that's correct
Hi Dan, Thanks for reviewing these. If you don't comment on the remainder of a patch (in this case 900 lines worth), please remove that part from your reply. Otherwise, we (possibly multiple people) who read your reply waste time searching through all of that, thinking that you included all the context because you had another comment or two.

On Mon, Feb 22, 2010 at 05:01:33PM -0700, Eric Blake wrote:
Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it.
This seems to break for me. po/Makevars.template doesn't define top_builddir , but that's needed in a few places in po/Makefile.in.in and as a result I end up with make[2]: Entering directory `/u/veillard/libvirt/po' make[2]: *** No rule to make target `/config.status', needed by `Makefile'. Stop. when trying to build the normal way (./autogen.sh --system ; make) could you have a look at this ? Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On Wed, Feb 24, 2010 at 10:19:48AM +0100, Daniel Veillard wrote:
On Mon, Feb 22, 2010 at 05:01:33PM -0700, Eric Blake wrote:
Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it.
This seems to break for me. po/Makevars.template doesn't define top_builddir , but that's needed in a few places in po/Makefile.in.in and as a result I end up with
make[2]: Entering directory `/u/veillard/libvirt/po' make[2]: *** No rule to make target `/config.status', needed by `Makefile'. Stop.
when trying to build the normal way (./autogen.sh --system ; make)
explicitely running ./bootstrap seems to have solved the problem for me Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Daniel Veillard wrote:
On Mon, Feb 22, 2010 at 05:01:33PM -0700, Eric Blake wrote:
Note that this commit mirrors the latest upstream gnulib, but does NOT update our gnulib checkout to the latest, so our version of bootstrap is now newer than .gnulib/build-aux/bootstrap.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it.
This seems to break for me. po/Makevars.template doesn't define top_builddir , but that's needed in a few places in po/Makefile.in.in and as a result I end up with
make[2]: Entering directory `/u/veillard/libvirt/po' make[2]: *** No rule to make target `/config.status', needed by `Makefile'. Stop.
when trying to build the normal way (./autogen.sh --system ; make)
could you have a look at this ?
Hi DV, So far, I've been able to reproduce that only in a build directory in which .gnulib is locally modified (i.e., when .gnulib is listed in "git diff" output as being locally modified). Once I undo that local modification (say via "git submodule update") "make" then reports that I must run autogen.sh, as expected. And when I do that, it *does* run bootstrap and recreate po/Makevars.

Fallout from the new bootstrap. * .gitignore: Commit sorting done by bootstrap. * build-aux/.gitignore: Likewise. * po/.gitignore: Likewise. --- Hmm, on review, this doubles some entries in build-aux/.gitignore. That seems like an upstream bug in gnulib's bootstrap that we might ought to revisit. For that matter, why do we version control multiple .gitignore? These can be consolidated into a single top-level file. I can prepare further patches along these lines, if others think it would be worthwhile. .gitignore | 20 ++++++++++---------- build-aux/.gitignore | 12 ++++++++++-- po/.gitignore | 27 ++++++++++++++------------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index d9a4aea..a638e0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,21 @@ +*#*# +*.#*# *.a *.o +*.orig +*.rej *~ .git .git-module-status +/GNUmakefile +/maint.mk ABOUT-NLS COPYING +ChangeLog INSTALL Makefile Makefile.in +NEWS aclocal.m4 autom4te.cache config.cache @@ -22,6 +30,7 @@ configure coverage cscope.files cscope.out +gnulib/ libtool libvirt-*.tar.gz libvirt.pc @@ -34,14 +43,5 @@ results.log stamp-h stamp-h.in stamp-h1 -update.log tests/*.log -/GNUmakefile -/maint.mk -gnulib/ -*.orig -*.rej -*#*# -*.#*# -ChangeLog -NEWS +update.log diff --git a/build-aux/.gitignore b/build-aux/.gitignore index af7a347..29b1e03 100644 --- a/build-aux/.gitignore +++ b/build-aux/.gitignore @@ -1,7 +1,15 @@ * -/link-warning.h -/mktempd /arg-nonnull.h /gitlog-to-changelog +/link-warning.h +/mktempd /useless-if-before-free /vc-list-files +arg-nonnull.h +config.rpath +gitlog-to-changelog +mkinstalldirs +mktempd +useless-if-before-free +vc-list-files +warn-on-use.h diff --git a/po/.gitignore b/po/.gitignore index 40ff7c8..9f7b57f 100644 --- a/po/.gitignore +++ b/po/.gitignore @@ -1,16 +1,17 @@ -stamp-po -remove-potcdate.sin -quot.sed -insert-header.sin *.gmo -en@quot.header -en@boldquot.header -boldquot.sed -Rules-quot -POTFILES -Makevars.template -Makefile.in.in -Makefile.in Makefile -remove-potcdate.sed +Makefile.in +Makefile.in.in Makevars +Makevars.template +POTFILES +Rules-quot +boldquot.sed +en@boldquot.header +en@quot.header +insert-header.sed +insert-header.sin +quot.sed +remove-potcdate.sed +remove-potcdate.sin +stamp-po -- 1.6.6

On Mon, Feb 22, 2010 at 05:01:34PM -0700, Eric Blake wrote:
Fallout from the new bootstrap.
* .gitignore: Commit sorting done by bootstrap. * build-aux/.gitignore: Likewise. * po/.gitignore: Likewise. ---
Hmm, on review, this doubles some entries in build-aux/.gitignore. That seems like an upstream bug in gnulib's bootstrap that we might ought to revisit. For that matter, why do we version control multiple .gitignore? These can be consolidated into a single top-level file. I can prepare further patches along these lines, if others think it would be worthwhile.
We had multiple .gitignore for historic reasons - we had many .cvsignore and auto-generated .gitignore from them. These days we can consolidate them all That said we probably want to go one step further & auto-generate the .gitignore files from the automake rules. I do this in GTK-VNC using this makefile snippet in the top level http://git.gnome.org/browse/gtk-vnc/tree/git.mk then each Makefile.am just adds -include $(top_srcdir)/git.mk
.gitignore | 20 ++++++++++---------- build-aux/.gitignore | 12 ++++++++++-- po/.gitignore | 27 ++++++++++++++------------- 3 files changed, 34 insertions(+), 25 deletions(-)
diff --git a/.gitignore b/.gitignore index d9a4aea..a638e0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,21 @@ +*#*# +*.#*# *.a *.o +*.orig +*.rej *~ .git .git-module-status +/GNUmakefile +/maint.mk ABOUT-NLS COPYING +ChangeLog INSTALL Makefile Makefile.in +NEWS aclocal.m4 autom4te.cache config.cache @@ -22,6 +30,7 @@ configure coverage cscope.files cscope.out +gnulib/ libtool libvirt-*.tar.gz libvirt.pc @@ -34,14 +43,5 @@ results.log stamp-h stamp-h.in stamp-h1 -update.log tests/*.log -/GNUmakefile -/maint.mk -gnulib/ -*.orig -*.rej -*#*# -*.#*# -ChangeLog -NEWS +update.log diff --git a/build-aux/.gitignore b/build-aux/.gitignore index af7a347..29b1e03 100644 --- a/build-aux/.gitignore +++ b/build-aux/.gitignore @@ -1,7 +1,15 @@ * -/link-warning.h -/mktempd /arg-nonnull.h /gitlog-to-changelog +/link-warning.h +/mktempd /useless-if-before-free /vc-list-files +arg-nonnull.h +config.rpath +gitlog-to-changelog +mkinstalldirs +mktempd +useless-if-before-free +vc-list-files +warn-on-use.h diff --git a/po/.gitignore b/po/.gitignore index 40ff7c8..9f7b57f 100644 --- a/po/.gitignore +++ b/po/.gitignore @@ -1,16 +1,17 @@ -stamp-po -remove-potcdate.sin -quot.sed -insert-header.sin *.gmo -en@quot.header -en@boldquot.header -boldquot.sed -Rules-quot -POTFILES -Makevars.template -Makefile.in.in -Makefile.in Makefile -remove-potcdate.sed +Makefile.in +Makefile.in.in Makevars +Makevars.template +POTFILES +Rules-quot +boldquot.sed +en@boldquot.header +en@quot.header +insert-header.sed +insert-header.sin +quot.sed +remove-potcdate.sed +remove-potcdate.sin +stamp-po --
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

Eric Blake wrote:
My biggest motivation in writing this patch series is the fact that I already have the complete gnulib.git on my hard drive, and repeatedly doing shallow clones of gnulib into multiple projects gets expensive in both network traffic and disk space. With this series, it is now possible to do:
GNULIB_SRCDIR=/path/to/reference/gnulib.git ./autogen.sh
so that the .gnulib subdirectory will exploit git's --reference capabilities rather than re-download all the files from scratch; it also results in less disk usage. The only caveat is that you should make sure that your reference gnulib.git is never rewound beyond contents referred to by a submodule, so that you never risk creating delta objects in the client repositories that would break if the reference module eventually prunes objects rendered unused by the rewind (in practice, this is only a problem if you are prone to pointing the .gnulib submodule to a non-published commit, in order to test out pending changes to gnulib.git, and can be avoided by doing your gnulib development in a different directory than in the reference gnulib.git that only tracks upstream).
.gitignore | 20 +- autogen.sh | 21 +- bootstrap | 852 +++++++++++++++++++++++++++++++++++++++++++++----- bootstrap.conf | 145 +++++++++ build-aux/.gitignore | 12 +- po/.gitignore | 26 +- po/Makevars | 41 ---
Thanks for doing all that. I have applied those patches and then ran ./autogen.sh --enable-compile-warnings=maximum && make but it failed like this: Making all in po make[2]: Entering directory `/w/co/libvirt/po' make[2]: *** No rule to make target `/config.status', needed by `Makefile'. Stop I tracked that down to the fact that po/Makevars is now removed (rightly so, since it's generated), and it contained the definition of top_builddir, which when missing provokes the diagnostic above. po/Makevars is normally included in po/Makefile. po/Makevars is generated only when running bootstrap, but I had already run bootstrap, and nothing about this patch would cause it to be rerun. We could just tell people to run bootstrap manually, or to remove the stamp file that autogen uses to detect when rerunning it is required, but not everyone would see that email. A more reliable approach is to update to the latest gnulib, since that will cause bootstrap to be rerun automatically by anyone who pulls in that change. I propose to include the following change right after yours: The only trick is to disable the new syntax-check for hash.h, since it currently evokes a false-positive.
From 7ac7a95f3956d430b99065dc9b736a6a0ddc637a Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@redhat.com> Date: Tue, 23 Feb 2010 17:54:32 +0100 Subject: [PATCH] build: update gnulib submodule to latest
* cfg.mk (local-checks-to-skip): Disable sc_prohibit_hash_without_use for now, since it fails with a false-positive match. --- .gnulib | 2 +- cfg.mk | 1 + 2 files changed, 2 insertions(+), 1 deletions(-) diff --git a/.gnulib b/.gnulib index 11fbc57..2709233 160000 --- a/.gnulib +++ b/.gnulib @@ -1 +1 @@ -Subproject commit 11fbc57405a118e6ec9a3ebc19bbf5ececdae4d6 +Subproject commit 2709233ead439b582d82af48bd25e709378cda44 diff --git a/cfg.mk b/cfg.mk index 5013e4b..17bb341 100644 --- a/cfg.mk +++ b/cfg.mk @@ -42,6 +42,7 @@ local-checks-to-skip = \ sc_obsolete_symbols \ sc_prohibit_S_IS_definition \ sc_prohibit_atoi_atof \ + sc_prohibit_hash_without_use \ sc_prohibit_jm_in_m4 \ sc_prohibit_quote_without_use \ sc_prohibit_quotearg_without_use \ -- 1.7.0.367.g566c3

According to Jim Meyering on 2/23/2010 10:06 AM:
Making all in po make[2]: Entering directory `/w/co/libvirt/po' make[2]: *** No rule to make target `/config.status', needed by `Makefile'. Stop
I tracked that down to the fact that po/Makevars is now removed (rightly so, since it's generated), and it contained the definition of top_builddir, which when missing provokes the diagnostic above.
Yes, I was encountering some of that yesterday, but wasn't sure how much of it was due to my (constantly-changing) setup while I was tweaking the gnulib bootstrap side of things. My testing passed only because I ended up doing a fresh checkout every time.
I propose to include the following change right after yours: The only trick is to disable the new syntax-check for hash.h, since it currently evokes a false-positive.
Is there ever a chance that #include <hash.h> in libvirt sources will pick up the wrong header? That is, should we rename one of the two files to a less-common name, then update all clients to specify which of the two versions they are grabbing? But that is independent of this patch.
Subject: [PATCH] build: update gnulib submodule to latest
* cfg.mk (local-checks-to-skip): Disable sc_prohibit_hash_without_use for now, since it fails with a false-positive match.
ACK (assuming my ACK is good for much, given my relative newcomer status). For that matter, maybe we should push yours first; the commit message in 3/4 can then use a bit of tweaking, if we then match bootstrap to ./.gnulib/build-aux/bootstrap. I guess I should also do a followup patch to README-hacking to give the hint about setting GNULIB_SRCDIR to reduce download time if you already have a local copy of gnulib.git. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

Eric Blake wrote: ...
I propose to include the following change right after yours: The only trick is to disable the new syntax-check for hash.h, since it currently evokes a false-positive.
Is there ever a chance that #include <hash.h> in libvirt sources will pick up the wrong header? That is, should we rename one of the two files to a less-common name, then update all clients to specify which of the two versions they are grabbing? But that is independent of this patch.
This is probably a good reason to rename the gnulib one to something like gl-hash.h (probably with measures to help clients ease into the change). I'll bring it up on bug-gnulib.
Subject: [PATCH] build: update gnulib submodule to latest
* cfg.mk (local-checks-to-skip): Disable sc_prohibit_hash_without_use for now, since it fails with a false-positive match.
ACK (assuming my ACK is good for much, given my relative newcomer status).
For that matter, maybe we should push yours first; the commit message in 3/4 can then use a bit of tweaking, if we then match bootstrap to ./.gnulib/build-aux/bootstrap.
If that's all you want to change, just send me an updated patch and I'll plug it in. Before or after shouldn't matter, as long as the Makevars-removing commit and the .gnulib-udpating one are pushed at the same time.
I guess I should also do a followup patch to README-hacking to give the hint about setting GNULIB_SRCDIR to reduce download time if you already have a local copy of gnulib.git.
Good idea.

According to Jim Meyering on 2/23/2010 10:31 AM:
For that matter, maybe we should push yours first; the commit message in 3/4 can then use a bit of tweaking, if we then match bootstrap to ./.gnulib/build-aux/bootstrap.
If that's all you want to change, just send me an updated patch and I'll plug it in.
If you commit the gnulib sync first, then this is an appropriate commit log for 3/4: maint: import modern bootstrap Copy the latest gnulib bootstrap, which runs autoreconf and generates po/Makevars for us. Other improvements include some improved prerequisite tool checking. This also fixes a bug in the .pot files, regarding the copyright holder. * bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it. * po/.gitignore: Update. ---
Before or after shouldn't matter, as long as the Makevars-removing commit and the .gnulib-udpating one are pushed at the same time.
If you commit my changes first, then * bootstrap: Update to version in .gnulib/build-aux. should change to: * bootstrap: Update to latest version from upstream gnulib.
I guess I should also do a followup patch to README-hacking to give the hint about setting GNULIB_SRCDIR to reduce download time if you already have a local copy of gnulib.git.
Good idea.
Coming later today, after I've had lunch. -- Don't work too hard, make some time for fun as well! Eric Blake ebb9@byu.net

Eric Blake wrote:
According to Jim Meyering on 2/23/2010 10:31 AM:
For that matter, maybe we should push yours first; the commit message in 3/4 can then use a bit of tweaking, if we then match bootstrap to ./.gnulib/build-aux/bootstrap.
If that's all you want to change, just send me an updated patch and I'll plug it in.
If you commit the gnulib sync first, then this is an appropriate commit log for 3/4:
Adjusted and pushed. Thanks.
maint: import modern bootstrap
Copy the latest gnulib bootstrap, which runs autoreconf and generates po/Makevars for us. Other improvements include some improved prerequisite tool checking.
This also fixes a bug in the .pot files, regarding the copyright holder.
* bootstrap: Update to version in .gnulib/build-aux. * bootstrap.conf (MSGID_BUGS_ADDRESS, COPYRIGHT_HOLDER, SKIP_PO) (gnulib_mk, ACLOCAL, bootstrap_epilogue): Provide overrides. * autogen.sh (autoreconf): Avoid redundant autoreconf if bootstrap was run. * po/Makevars: Delete, now that bootstrap creates it. * po/.gitignore: Update.
participants (4)
-
Daniel P. Berrange
-
Daniel Veillard
-
Eric Blake
-
Jim Meyering