progname=$0
package=gnulib
-cvsdatestamp='$Date: 2006-07-29 13:18:04 $'
+cvsdatestamp='$Date: 2006-08-10 15:05:20 $'
last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'`
version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'`
For --import, this specifies where your
configure.ac can be found. Defaults to current
directory.
+ --local-dir=DIRECTORY Specify a local override directory where to look
+ up files before looking in gnulib's directory.
Options for --import:
--lib=LIBRARY Specify the library name. Defaults to 'libgnu'.
--lgpl Abort if modules aren't available under the LGPL.
Also modify license template from GPL to LGPL.
--libtool Use libtool rules.
+ --no-libtool Don't use libtool rules.
--macro-prefix=PREFIX Specify the prefix of the macros 'gl_EARLY' and
'gl_INIT'. Default is 'gl'.
--no-changelog don't update or create ChangeLog files
# - inctests true if --with-tests was given, blank otherwise
# - avoidlist list of modules to avoid, from --avoid
# - lgpl true if --lgpl was given, blank otherwise
-# - libtool true if --libtool was given, blank otherwise
+# - libtool true if --libtool was given, false if --no-libtool was
+# given, blank otherwise
# - macro_prefix from --macro-prefix
# - autoconf_minversion minimum supported autoconf version
# - do_changelog false if --no-changelog was given, : otherwise
# - doit : if actions shall be executed, false if only to be printed
+# - local_gnulib_dir from --local-dir
+# - symbolic true if --symbolic was given, blank otherwise
{
mode=
destdir=
lgpl=
libtool=
macro_prefix=
- autoconf_minversion=
do_changelog=:
doit=:
+ local_gnulib_dir=
symbolic=
supplied_opts="$@"
--libtool )
libtool=true
shift ;;
+ --no-libtool )
+ libtool=false
+ shift ;;
--macro-prefix )
shift
if test $# = 0; then
--dry-run )
doit=false
shift ;;
+ --local-dir )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --local-dir"
+ fi
+ local_gnulib_dir=$1
+ shift ;;
+ --local-dir=* )
+ local_gnulib_dir=`echo "X$1" | sed -e 's/^X--local-dir=//'`
+ shift ;;
-s | --symbolic | --symboli | --symbol | --symbo | --symb | --symlink | --symlin | --symli | --syml | --sym | --sy )
symbolic=true
shift ;;
# Determine the minimum supported autoconf version from the project's
# configure.ac.
DEFAULT_AUTOCONF_MINVERSION="2.59"
- if test -f configure.ac; then
- autoconf_minversion=`$AUTOCONF --trace=AC_PREREQ:'$1' | $SORT -g | uniq | tail -1`
+ autoconf_minversion=
+ configure_ac=
+ if { test "$mode" = import || test "$mode" = update; } && test -n "$destdir"; then
+ if test -f "$destdir"/configure.ac; then
+ configure_ac="$destdir/configure.ac"
+ else
+ if test -f "$destdir"/configure.in; then
+ configure_ac="$destdir/configure.in"
+ fi
+ fi
+ else
+ if test -f configure.ac; then
+ configure_ac="configure.ac"
+ else
+ if test -f configure.in; then
+ configure_ac="configure.in"
+ fi
+ fi
+ fi
+ if test -n "$configure_ac"; then
+ # Use sed, not autoconf --trace, to look for the AC_PREREQ invocation,
+ # because when some m4 files are omitted from a CVS repository,
+ # "autoconf --trace=AC_PREREQ" fails with an error message like this:
+ # m4: aclocal.m4:851: Cannot open m4/absolute-header.m4: No such file or directory
+ # autom4te: m4 failed with exit status: 1
+ prereqs=
+ my_sed_traces='
+ s,#.*$,,
+ s,^dnl .*$,,
+ s, dnl .*$,,
+ /AC_PREREQ/ {
+ s,^.*AC_PREREQ([[ ]*\([^])]*\).*$,prereqs="$prereqs \1",p
+ }'
+ eval `sed -n -e "$my_sed_traces" < "$configure_ac"`
+ if test -n "$prereqs"; then
+ autoconf_minversion=`for version in $prereqs; do echo $version; done | $SORT -g | uniq | tail -1`
+ fi
fi
if test -z "$autoconf_minversion"; then
autoconf_minversion=$DEFAULT_AUTOCONF_MINVERSION
done
gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`
+func_tmpdir
+trap 'rm -rf "$tmp"' 0 1 2 3 15
+
+# func_lookup_file file
+# looks up a file in $local_gnulib_dir or $gnulib_dir, or combines it through
+# 'patch'.
+# Output:
+# - lookedup_file name of the merged (combined) file
+# - lookedup_tmp true if it is located in the tmp directory, blank otherwise
+func_lookup_file ()
+{
+ lkfile="$1"
+ if test -n "$local_gnulib_dir" && test -f "$local_gnulib_dir/$lkfile"; then
+ lookedup_file="$local_gnulib_dir/$lkfile"
+ lookedup_tmp=
+ else
+ if test -f "$gnulib_dir/$lkfile"; then
+ if test -n "$local_gnulib_dir" && test -f "$local_gnulib_dir/$lkfile.diff"; then
+ lkbase=`echo "$lkfile" | sed -e 's,^.*/,,'`
+ rm -f "$tmp/$lkbase"
+ cp "$gnulib_dir/$lkfile" "$tmp/$lkbase"
+ patch -s "$tmp/$lkbase" < "$local_gnulib_dir/$lkfile.diff" \
+ || func_fatal_error "patch file $local_gnulib_dir/$lkfile.diff didn't apply cleanly"
+ lookedup_file="$tmp/$lkbase"
+ lookedup_tmp=true
+ else
+ lookedup_file="$gnulib_dir/$lkfile"
+ lookedup_tmp=
+ fi
+ else
+ func_fatal_error "file $gnulib_dir/$lkfile not found"
+ fi
+ fi
+}
+
# func_all_modules
func_all_modules ()
{
# Filter out metainformation files like README, which are not modules.
# Filter out unit test modules; they can be retrieved through
# --extract-tests-module if desired.
- (cd "$gnulib_dir/modules" && ls -1) \
+ {
+ (cd "$gnulib_dir/modules" && ls -1)
+ if test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules"; then
+ (cd "$local_gnulib_dir/modules" && ls -1 | sed -e 's,\.diff$,,')
+ fi
+ } \
| sed -e '/^CVS$/d' -e '/^ChangeLog$/d' -e '/^README$/d' -e '/^TEMPLATE$/d' -e '/^TEMPLATE-TESTS$/d' -e '/~$/d' \
| sed -e '/-tests$/d' \
- | LC_ALL=C sort
+ | LC_ALL=C sort \
+ | LC_ALL=C uniq
}
# func_verify_module
# verifies a module name
func_verify_module ()
{
- if test ! -f "$gnulib_dir/modules/$module" \
+ if ! { test -f "$gnulib_dir/modules/$module" \
+ || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
+ && test -f "$local_gnulib_dir/modules/$module"; }; } \
|| test "CVS" = "$module" \
|| test "ChangeLog" = "$module" \
|| test "README" = "$module" \
# func_get_description module
func_get_description ()
{
- sed -n -e "/^Description$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file"
}
# func_get_filelist module
func_get_filelist ()
{
- sed -n -e "/^Files$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file"
case "$autoconf_minversion" in
2.59)
#echo m4/onceonly.m4
# ${module}-tests always implicitly depends on ${module}.
echo "$1" | sed -n -e 's/-tests//p'
# Then the explicit dependencies listed in the module description.
- sed -n -e "/^Depends-on$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file"
}
# func_get_autoconf_snippet module
func_get_autoconf_snippet ()
{
- sed -n -e "/^configure\.ac$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^configure\.ac$sed_extract_prog" < "$lookedup_file"
}
# func_get_automake_snippet module
func_get_automake_snippet ()
{
- sed -n -e "/^Makefile\.am$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
}
# func_get_include_directive module
func_get_include_directive ()
{
- sed -n -e "/^Include$sed_extract_prog" < "$gnulib_dir/modules/$1" | \
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Include$sed_extract_prog" < "$lookedup_file" | \
sed -e 's/^\(["<]\)/#include \1/'
}
# func_get_license module
func_get_license ()
{
- sed -n -e "/^License$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^License$sed_extract_prog" < "$lookedup_file"
}
# func_get_maintainer module
func_get_maintainer ()
{
- sed -n -e "/^Maintainer$sed_extract_prog" < "$gnulib_dir/modules/$1"
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Maintainer$sed_extract_prog" < "$lookedup_file"
}
# func_get_tests_module module
# Input:
# - modules list of modules, including dependencies
# - libname library name
-# - libtool true if libtool will be used, blank otherwise
+# - libtool true if libtool will be used, false or blank otherwise
# - actioncmd (optional) command that will reproduce this invocation
func_emit_lib_Makefile_am ()
{
- if test -n "$libtool"; then
+ if test "$libtool" = true; then
libext=la
perhapsLT=LT
else
echo "${libname}_${libext}_SOURCES ="
echo "${libname}_${libext}_LIBADD = @${perhapsLT}LIBOBJS@"
echo "noinst_HEADERS ="
+ echo "pkgdata_DATA ="
echo "EXTRA_DIST ="
echo "BUILT_SOURCES ="
echo "SUFFIXES ="
- echo "MOSTLYCLEANFILES ="
+ echo "MOSTLYCLEANFILES = core *.stackdump"
echo "MOSTLYCLEANDIRS ="
echo "CLEANFILES ="
echo "DISTCLEANFILES ="
fi
done
echo
- echo "mostlyclean-local:"
+ echo "mostlyclean-local: mostlyclean-generic"
echo " @test -z \"\$(MOSTLYCLEANDIRS)\" || \\"
echo " for dir in \$(MOSTLYCLEANDIRS); do \\"
echo " if test -d \$\$dir; then \\"
# Input:
# - modules list of modules, including dependencies
# - libname library name
-# - libtool true if libtool will be used, blank otherwise
+# - libtool true if libtool will be used, false or blank otherwise
# - sourcebase relative directory containing lib source code
# - m4base relative directory containing autoconf macros
# - testsbase relative directory containing unit test code
func_emit_tests_Makefile_am ()
{
- if test -n "$libtool"; then
+ if test "$libtool" = true; then
libext=la
else
libext=a
echo "noinst_PROGRAMS ="
echo "check_PROGRAMS ="
echo "noinst_HEADERS ="
+ echo "pkgdata_DATA ="
echo "EXTRA_DIST ="
echo "BUILT_SOURCES ="
echo "SUFFIXES ="
- echo "MOSTLYCLEANFILES ="
+ echo "MOSTLYCLEANFILES = core *.stackdump"
echo "MOSTLYCLEANDIRS ="
echo "CLEANFILES ="
echo "DISTCLEANFILES ="
echo "clean-local:"
echo " rm -rf SunWS_cache"
echo
- echo "mostlyclean-local:"
+ echo "mostlyclean-local: mostlyclean-generic"
echo " @test -z \"\$(MOSTLYCLEANDIRS)\" || \\"
echo " for dir in \$(MOSTLYCLEANDIRS); do \\"
echo " if test -d \$\$dir; then \\"
# - inctests true if --with-tests was given, blank otherwise
# - avoidlist list of modules to avoid, from --avoid
# - lgpl true if library's license shall be LGPL, blank otherwise
-# - libtool true if libtool will be used, blank otherwise
-# - guessed_libtool true if the configure.ac file uses libtool, blank otherwise
+# - libtool true if --libtool was given, false if --no-libtool was
+# given, blank otherwise
+# - guessed_libtool true if the configure.ac file uses libtool, false otherwise
# - macro_prefix prefix of gl_EARLY, gl_INIT macros to use
# - autoconf_minversion minimum supported autoconf version
# - doit : if actions shall be executed, false if only to be printed
cached_macro_prefix=
cached_files=
if test -f "$destdir"/$m4base/gnulib-cache.m4; then
+ cached_libtool=false
my_sed_traces='
s,#.*$,,
s,^dnl .*$,,
if test -z "$docbase"; then
docbase="$cached_docbase"
if test -z "$docbase"; then
- func_fatal_error "missing --doc-base option. --doc-base has been introduced on 2006-07-11; if your last invocation of 'gnulib-tool --update' is before that date, you need to run 'gnulib-tool --update' once, with a --doc-base option."
+ func_fatal_error "missing --doc-base option. --doc-base has been introduced on 2006-07-11; if your last invocation of 'gnulib-tool --import' is before that date, you need to run 'gnulib-tool --import' once, with a --doc-base option."
fi
fi
# The testsbase defaults to the cached one.
fi
fi
- func_tmpdir
- trap 'rm -rf "$tmp"' 0 1 2 3 15
# func_dest_tmpfilename file
# determines the name of a temporary file (file is relative to destdir).
# Sets variable:
func_add_or_update ()
{
func_dest_tmpfilename "$g"
- cp "$gnulib_dir/$f" "$tmpfile" || func_fatal_error "failed"
+ func_lookup_file "$f"
+ cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
if test -n "$lgpl"; then
# Update license.
case "$f" in
lib/*)
sed -e 's/GNU General/GNU Lesser General/g' \
-e 's/version 2\([ ,]\)/version 2.1\1/g' \
- < "$gnulib_dir/$f" > "$tmpfile" || func_fatal_error "failed"
+ < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
;;
esac
fi
echo "Replacing file $g (non-gnulib code backuped in ${g}~) !!"
fi
mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
- if test -n "$symbolic" && cmp "$gnulib_dir/$f" "$tmpfile" > /dev/null; then
- func_ln_if_changed "$gnulib_dir/$f" "$destdir/$g"
+ if test -n "$symbolic" && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
else
mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
fi
# frequently that developers don't put autogenerated files into CVS.
if $doit; then
echo "Copying file $g"
- if test -n "$symbolic" && cmp "$gnulib_dir/$f" "$tmpfile" > /dev/null; then
- func_ln_if_changed "$gnulib_dir/$f" "$destdir/$g"
+ if test -n "$symbolic" && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
else
mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
fi
if test -n "$lgpl"; then
actioncmd="$actioncmd --lgpl"
fi
- if test -n "$libtool"; then
+ if test "$libtool" = true; then
actioncmd="$actioncmd --libtool"
+ else
+ actioncmd="$actioncmd --no-libtool"
fi
actioncmd="$actioncmd --macro-prefix=$macro_prefix"
actioncmd="$actioncmd `echo $specified_modules`"
echo "gl_TESTS_BASE([$testsbase])"
echo "gl_LIB([$libname])"
test -z "$lgpl" || echo "gl_LGPL"
- test -z "$libtool" || echo "gl_LIBTOOL"
+ if test "$libtool" = true; then
+ echo "gl_LIBTOOL"
+ fi
echo "gl_MACRO_PREFIX([$macro_prefix])"
) > "$tmpfile"
if test -f "$destdir"/$m4base/gnulib-cache.m4; then
echo "# any checks for libraries, header files, types and library functions."
echo "AC_DEFUN([${macro_prefix}_EARLY],"
echo "["
+ echo " m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
+ echo " m4_pattern_allow([^gl_ES$])dnl a valid locale name"
echo " AC_REQUIRE([AC_PROG_RANLIB])"
if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then
echo " AC_REQUIRE([AC_GNU_SOURCE])"
echo "# \"Check for header files, types and library functions\"."
echo "AC_DEFUN([${macro_prefix}_INIT],"
echo "["
- if test -z "$libtool"; then
- echo " AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
- else
+ if test "$libtool" = true; then
echo " AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ else
+ echo " AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
fi
if test "$auxdir" != "build-aux"; then
sed_replace_build_aux='
| sed -e '/^$/d;' -e 's/^/ /' \
-e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
-e "$sed_replace_build_aux"
- if test "$module" = 'alloca' && test -n "$libtool"; then
+ if test "$module" = 'alloca' && test "$libtool" = true; then
echo 'changequote(,)dnl'
echo 'LTALLOCA=`echo "$ALLOCA" | sed '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`'
echo 'changequote([, ])dnl'
fi
fi
- rm -rf "$tmp"
- # Undo the effect of the previous 'trap' command. Some shellology:
- # We cannot use "trap - 0 1 2 3 15", because Solaris sh would attempt to
- # execute the command "-". "trap '' ..." is fine only for signal 0 (= normal
- # exit); for the others we need to call 'exit' explicitly. The value of $? is
- # 128 + signal number and is set before the trap-registered command is run.
- trap '' 0
- trap 'exit $?' 1 2 3 15
-
echo "Finished."
echo
echo "You may need to add #include directives for the following .h files."
# Copy files or make symbolic links.
for f in $files; do
+ func_lookup_file "$f"
case "$f" in
build-aux/*) g=`echo "$f" | sed -e "s,^build-aux/,$auxdir/,"` ;;
*) g="$f" ;;
esac
- ln "$gnulib_dir/$f" "$testdir/$g" 2>/dev/null ||
- if test -z "$symbolic"; then
- cp -p "$gnulib_dir/$f" "$testdir/$g"
+ if test -n "$lookedup_tmp"; then
+ cp -p "$lookedup_file" "$testdir/$g"
else
- ln -s "$gnulib_dir/$f" "$testdir/$g"
+ ln "$lookedup_file" "$testdir/$g" 2>/dev/null ||
+ if test -z "$symbolic"; then
+ cp -p "$lookedup_file" "$testdir/$g"
+ else
+ ln -s "$lookedup_file" "$testdir/$g"
+ fi
fi
done
echo "gl_LOCK"
echo
fi
- if test -z "$libtool"; then
- echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
- else
+ if test "$libtool" = true; then
echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ else
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
fi
+ # Wrap the set of autoconf snippets into an autoconf macro that is then
+ # invoked. This is needed because autoconf does not support AC_REQUIRE
+ # at the top level:
+ # error: AC_REQUIRE(gt_CSHARPCOMP): cannot be used outside of an AC_DEFUN'd macro
+ # but we want the AC_REQUIRE to have its normal meaning (provide one
+ # expansion of the required macro before the current point, and only one
+ # expansion total).
+ echo "AC_DEFUN([gl_INIT], ["
if test "$auxdir" != "build-aux"; then
sed_replace_build_aux='
:a
| sed -e "$sed_replace_build_aux"
fi
done
+ echo "])"
+ echo "gl_INIT"
echo
# Usually tests/config.h will be a superset of config.h. Verify this by
# "merging" config.h into tests/config.h; look out for gcc warnings.
echo "AC_PROG_CC"
echo "AC_PROG_INSTALL"
echo "AC_PROG_MAKE_SET"
+ echo
+ echo "m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
+ echo "m4_pattern_allow([^gl_ES$])dnl a valid locale name"
+ echo
echo "AC_PROG_RANLIB"
echo
if grep AC_GNU_SOURCE "$testdir"/m4/*.m4 >/dev/null 2>/dev/null; then
echo "gl_LOCK"
echo
fi
- if test -z "$libtool"; then
- echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
- else
+ if test "$libtool" = true; then
echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ else
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
fi
+ # Wrap the set of autoconf snippets into an autoconf macro that is then
+ # invoked. This is needed because autoconf does not support AC_REQUIRE
+ # at the top level:
+ # error: AC_REQUIRE(gt_CSHARPCOMP): cannot be used outside of an AC_DEFUN'd macro
+ # but we want the AC_REQUIRE to have its normal meaning (provide one
+ # expansion of the required macro before the current point, and only one
+ # expansion total).
+ echo "AC_DEFUN([gl_INIT], ["
if test "$auxdir" != "build-aux"; then
sed_replace_build_aux='
:a
| sed -e "$sed_replace_build_aux"
fi
done
+ echo "])"
+ echo "gl_INIT"
echo
if test -n "$subdirs_with_configure_ac"; then
echo "AC_CONFIG_SUBDIRS(["`echo $subdirs_with_configure_ac`"])"
# Analyze configure.ac.
guessed_auxdir="."
- guessed_libtool=
+ guessed_libtool=false
my_sed_traces='
s,#.*$,,
s,^dnl .*$,,
func_fatal_error "unknown operation mode --$mode" ;;
esac
+rm -rf "$tmp"
+# Undo the effect of the previous 'trap' command. Some shellology:
+# We cannot use "trap - 0 1 2 3 15", because Solaris sh would attempt to
+# execute the command "-". "trap '' ..." is fine only for signal 0 (= normal
+# exit); for the others we need to call 'exit' explicitly. The value of $? is
+# 128 + signal number and is set before the trap-registered command is run.
+trap '' 0
+trap 'exit $?' 1 2 3 15
+
exit 0