gnulib-tool --test --dir=directory module1 ... moduleN
gnulib-tool --megatest --dir=directory [module1 ... moduleN]
gnulib-tool --extract-description module
+ gnulib-tool --extract-status module
gnulib-tool --extract-notice module
gnulib-tool --extract-filelist module
gnulib-tool --extract-dependencies module
--megatest test the given modules one by one and all together
(recommended to use CC=\"gcc -Wall\" here)
--extract-description extract the description
+ --extract-status extract the status (obsolete or not)
--extract-notice extract the notice or banner
--extract-filelist extract the list of files
--extract-dependencies extract the dependencies
--aux-dir=DIRECTORY Directory relative to --dir where auxiliary build
tools are placed (default \"build-aux\").
--with-tests Include unit tests for the included modules.
+ --with-obsolete Include obsolete modules when they occur among the
+ dependencies. By default, dependencies to obsolete
+ modules are ignored.
--avoid=MODULE Avoid including the given MODULE. Useful if you
have code that provides equivalent functionality.
This option can be repeated.
date=`echo "$date" | sed -e "$sed_year_before_time"`
# Use GNU date to compute the time in GMT.
date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
- version=' '`"$gnulib_dir"/build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
+ version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
else
if test -d "$gnulib_dir"/CVS \
&& (cvs --version) >/dev/null 2>/dev/null; then
# func_gnulib_dir
# locates the directory where the gnulib repository lives
+# Input:
+# - progname name of this program
# Sets variables
# - self_abspathname absolute pathname of gnulib-tool
# - gnulib_dir absolute pathname of gnulib repository
func_gnulib_dir ()
{
- case "$0" in
- /*) self_abspathname="$0" ;;
- */*) self_abspathname=`pwd`/"$0" ;;
+ case "$progname" in
+ /*) self_abspathname="$progname" ;;
+ */*) self_abspathname=`pwd`/"$progname" ;;
*)
# Look in $PATH.
# Iterate through the elements of $PATH.
for d in $pathx; do
IFS="$save_IFS"
test -z "$d" && d=.
- if test -x "$d/$0" && test ! -d "$d/$0"; then
- self_abspathname="$d/$0"
+ if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+ self_abspathname="$d/$progname"
break
fi
done
# func_tmpdir
# creates a temporary directory.
+# Input:
+# - progname name of this program
# Sets variable
# - tmp pathname of freshly created temporary directory
func_tmpdir ()
(umask 077 && mkdir "$tmp")
} ||
{
- echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ echo "$progname: cannot create a temporary directory in $TMPDIR" >&2
func_exit 1
}
}
# func_fatal_error message
# outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname name of this program
func_fatal_error ()
{
- echo "gnulib-tool: *** $1" 1>&2
- echo "gnulib-tool: *** Stop." 1>&2
+ echo "$progname: *** $1" 1>&2
+ echo "$progname: *** Stop." 1>&2
func_exit 1
}
# - testsbase from --tests-base
# - auxdir from --aux-dir
# - inctests true if --with-tests was given, blank otherwise
+# - incobsolete true if --with-obsolete was given, blank otherwise
# - avoidlist list of modules to avoid, from --avoid
# - lgpl yes or a number if --lgpl was given, blank otherwise
# - makefile_name from --makefile-name
testsbase=
auxdir=
inctests=
+ incobsolete=
avoidlist=
lgpl=
makefile_name=
--with-tests )
inctests=true
shift ;;
+ --with-obsolete )
+ incobsolete=true
+ shift ;;
--avoid )
shift
if test $# = 0; then
if test -n "$local_gnulib_dir" || test -n "$supplied_libname" \
|| test -n "$sourcebase" || test -n "$m4base" || test -n "$pobase" \
|| test -n "$docbase" || test -n "$testsbase" || test -n "$auxdir" \
- || test -n "$inctests" || test -n "$avoidlist" || test -n "$lgpl" \
- || test -n "$makefile_name" || test -n "$macro_prefix" \
- || test -n "$po_domain" || test -n "$vc_files"; then
+ || test -n "$inctests" || test -n "$incobsolete" \
+ || test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \
+ || test -n "$macro_prefix" || test -n "$po_domain" \
+ || test -n "$vc_files"; then
echo "gnulib-tool: invalid options for 'update' mode" 1>&2
echo "Try 'gnulib-tool --help' for more information." 1>&2
echo "If you really want to modify the gnulib configuration of your project," 1>&2
:a
n
s/^Description:[ ]*$//
+ s/^Status:[ ]*$//
s/^Notice:[ ]*$//
s/^Files:[ ]*$//
s/^Depends-on:[ ]*$//
sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file"
}
+# func_get_status module
+# Input:
+# - local_gnulib_dir from --local-dir
+func_get_status ()
+{
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file"
+}
+
# func_get_notice module
# Input:
# - local_gnulib_dir from --local-dir
# - local_gnulib_dir from --local-dir
# - modules list of specified modules
# - inctests true if tests should be included, blank otherwise
+# - incobsolete true if obsolete modules among dependencies should be
+# included, blank otherwise
# - avoidlist list of modules to avoid
# - tmp pathname of a temporary directory
# Output:
if test -n "$duplicated_deps"; then
echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2
fi
- func_append inmodules " $deps"
+ for dep in $deps; do
+ if test -n "$incobsolete" \
+ || { status=`func_get_status $dep`; test "$status" != obsolete; }; then
+ func_append inmodules " $dep"
+ fi
+ done
if test -n "$inctests"; then
testsmodule=`func_get_tests_module $module`
if test -n "$testsmodule"; then
# - po_domain prefix of i18n domain to use (without -gnulib suffix)
# - actioncmd (optional) command that will reproduce this invocation
# - for_test true if creating a package for testing, false otherwise
+# - destfile filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+# list of edits to be done to Makefile.am variables
# Output:
# - uses_subdirs nonempty if object files in subdirs exist
func_emit_lib_Makefile_am ()
fi
echo
if test -z "$makefile_name"; then
+ echo "SUBDIRS ="
echo "noinst_HEADERS ="
echo "noinst_LIBRARIES ="
echo "noinst_LTLIBRARIES ="
echo "CLEANFILES ="
echo "DISTCLEANFILES ="
echo "MAINTAINERCLEANFILES ="
+ fi
+ # Execute edits that apply to the Makefile.am being generated.
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+ echo "${var} += ${val}"
+ eval "makefile_am_edit${edit}_var="
+ fi
+ fi
+ done
+ if test -z "$makefile_name"; then
echo
echo "AM_CPPFLAGS ="
fi
# - macro_prefix prefix of gl_LIBOBJS macros to use
# - for_test true if creating a package for testing, false otherwise
# - use_libtests true if a libtests.a should be built, false otherwise
+# - destfile filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+# list of edits to be done to Makefile.am variables
# Output:
# - uses_subdirs nonempty if object files in subdirs exist
func_emit_tests_Makefile_am ()
echo "CLEANFILES ="
echo "DISTCLEANFILES ="
echo "MAINTAINERCLEANFILES ="
+ # Execute edits that apply to the Makefile.am being generated.
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+ echo "${var} += ${val}"
+ eval "makefile_am_edit${edit}_var="
+ fi
+ fi
+ done
echo
echo "AM_CPPFLAGS = \\"
echo " -I. -I\$(srcdir) \\"
# - testsbase directory relative to destdir where to place unit test code
# - auxdir directory relative to destdir where to place build aux files
# - inctests true if --with-tests was given, blank otherwise
+# - incobsolete true if --with-obsolete was given, blank otherwise
# - avoidlist list of modules to avoid, from --avoid
# - lgpl yes or a number if library's license shall be LGPL,
# blank otherwise
# Get the cached settings.
cached_local_gnulib_dir=
cached_specified_modules=
+ cached_incobsolete=
cached_avoidlist=
cached_sourcebase=
cached_m4base=
:b
s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p
}
+ /gl_WITH_OBSOLETE/ {
+ s,^.*$,cached_incobsolete=true,p
+ }
/gl_AVOID(/ {
s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p
}
# Append the cached and the specified module names. So that
# "gnulib-tool --import foo" means to add the module foo.
specified_modules="$cached_specified_modules $1"
+ # Included obsolete modules among the dependencies if specified either way.
+ if test -z "$incobsolete"; then
+ incobsolete="$cached_incobsolete"
+ fi
# Append the cached and the specified avoidlist. This is probably better
# than dropping the cached one when --avoid is specified at least once.
avoidlist=`for m in $cached_avoidlist $avoidlist; do echo $m; done | LC_ALL=C sort -u`
# If --lgpl, verify that the licenses of modules are compatible.
if test -n "$lgpl"; then
+ license_incompatibilities=
for module in $main_modules; do
license=`func_get_license $module`
case $license in
yes | 3)
case $license in
LGPL | LGPLv2+) ;;
- *) func_fatal_error "incompatible license on module $module: $license" ;;
+ *) func_append license_incompatibilities "$module $license$nl" ;;
esac
;;
2)
case $license in
LGPLv2+) ;;
- *) func_fatal_error "incompatible license on module $module: $license" ;;
+ *) func_append license_incompatibilities "$module $license$nl" ;;
esac
;;
*) func_fatal_error "invalid value lgpl=$lgpl" ;;
;;
esac
done
+ if test -n "$license_incompatibilities"; then
+ # Format the license incompatibilities as a table.
+ sed_expand_column1_width50_indent17='s,^\([^ ]*\) ,\1 ,
+s,^\(.................................................[^ ]*\) *, \1 ,'
+ license_incompatibilities=`echo "$license_incompatibilities" | sed -e "$sed_expand_column1_width50_indent17"`
+ func_fatal_error "incompatible license on modules:$nl$license_incompatibilities"
+ fi
fi
# Show banner notice of every module.
func_append actioncmd " --po-base=$pobase"
fi
func_append actioncmd " --doc-base=$docbase"
+ func_append actioncmd " --tests-base=$testsbase"
func_append actioncmd " --aux-dir=$auxdir"
if test -n "$inctests"; then
func_append actioncmd " --with-tests"
fi
+ if test -n "$incobsolete"; then
+ func_append actioncmd " --with-obsolete"
+ fi
for module in $avoidlist; do
func_append actioncmd " --avoid=$module"
done
# Create normal Makefile.ams.
for_test=false
+ # Setup list of Makefile.am edits that are to be performed afterwards.
+ # Some of these edits apply to files that we will generate; others are
+ # under the responsibility of the developer.
+ makefile_am_edits=0
+ # func_note_Makefile_am_edit dir var value
+ # remembers that ${dir}Makefile.am needs to be edited to that ${var} mentions
+ # ${value}.
+ func_note_Makefile_am_edit ()
+ {
+ makefile_am_edits=`expr $makefile_am_edits + 1`
+ eval makefile_am_edit${makefile_am_edits}_dir=\"\$1\"
+ eval makefile_am_edit${makefile_am_edits}_var=\"\$2\"
+ eval makefile_am_edit${makefile_am_edits}_val=\"\$3\"
+ }
+ if test "$makefile_am" = Makefile.am; then
+ sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
+ sourcebase_base=`basename "$sourcebase"`
+ func_note_Makefile_am_edit "$sourcebase_dir" SUBDIRS "$sourcebase_base"
+ fi
+ if test -n "$pobase"; then
+ pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
+ pobase_base=`basename "$pobase"`
+ func_note_Makefile_am_edit "$pobase_dir" SUBDIRS "$pobase_base"
+ fi
+ if test -n "$inctests"; then
+ if test "$makefile_am" = Makefile.am; then
+ testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
+ testsbase_base=`basename "$testsbase"`
+ func_note_Makefile_am_edit "$testsbase_dir" SUBDIRS "$testsbase_base"
+ fi
+ fi
+ func_note_Makefile_am_edit "" ACLOCAL_AMFLAGS "-I ${m4base}"
+ {
+ # Find the first parent directory of $m4base that contains or will contain
+ # a Makefile.am.
+ sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
+s,//*$,/,'
+ sed_butlast='s,[^/][^/]*//*$,,'
+ dir1="${m4base}/"; dir2=""
+ while test -n "$dir1" \
+ && ! { test -f "${destdir}/${dir1}Makefile.am" \
+ || test "${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+ || test "./${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+ || { test -n "$inctests" \
+ && { test "${dir1}Makefile.am" = "$testsbase/$makefile_am" \
+ || test "./${dir1}Makefile.am" = "$testsbase/$makefile_am"; }; }; }; do
+ dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
+ dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+ done
+ func_note_Makefile_am_edit "$dir1" EXTRA_DIST "${dir2}gnulib-cache.m4"
+ }
+
# Create library makefile.
func_dest_tmpfilename $sourcebase/$makefile_am
+ destfile="$sourcebase/$makefile_am"
modules="$main_modules"
func_emit_lib_Makefile_am > "$tmpfile"
if test -f "$destdir"/$sourcebase/$makefile_am; then
echo "gl_MODULES(["
echo "$specified_modules" | sed 's/^/ /g'
echo "])"
+ test -z "$incobsolete" || echo "gl_WITH_OBSOLETE"
echo "gl_AVOID([$avoidlist])"
echo "gl_SOURCE_BASE([$sourcebase])"
echo "gl_M4_BASE([$m4base])"
if test -n "$inctests"; then
# Create tests makefile.
func_dest_tmpfilename $testsbase/$makefile_am
+ destfile="$testsbase/$makefile_am"
modules="$testsrelated_modules"
func_emit_tests_Makefile_am > "$tmpfile"
if test -f "$destdir"/$testsbase/$makefile_am; then
echo " - \"include $makefile_name\" from within \"$testsbase/Makefile.am\","
fi
fi
- if test "$makefile_am" = Makefile.am; then
- sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
- sourcebase_base=`basename "$sourcebase"`
- echo " - mention \"${sourcebase_base}\" in SUBDIRS in ${sourcebase_dir}Makefile.am,"
- fi
- if test -n "$pobase"; then
- pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
- pobase_base=`basename "$pobase"`
- echo " - mention \"${pobase_base}\" in SUBDIRS in ${pobase_dir}Makefile.am,"
- fi
- if test -n "$inctests"; then
- if test "$makefile_am" = Makefile.am; then
- testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
- testsbase_base=`basename "$testsbase"`
- echo " - mention \"${testsbase_base}\" in SUBDIRS in ${testsbase_dir}Makefile.am,"
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ echo " - mention \"${val}\" in ${var} in ${dir}Makefile.am,"
fi
- fi
- echo " - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am,"
- {
- # Find the first parent directory of $m4base that contains a Makefile.am.
- sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
-s,//*$,/,'
- sed_butlast='s,[^/][^/]*//*$,,'
- dir1="${m4base}/"; dir2=""
- while test -n "$dir1" && test ! -f "${destdir}/${dir1}Makefile.am"; do
- dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
- dir1=`echo "$dir1" | sed -e "$sed_butlast"`
- done
- echo " - mention ${dir2}gnulib-cache.m4 in EXTRA_DIST in ${dir1}Makefile.am."
- }
+ done
echo " - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC,"
echo " - invoke ${macro_prefix}_INIT in $configure_ac."
}
# Create Makefile.ams that are for testing.
for_test=true
+ # No special edits are needed.
+ makefile_am_edits=0
+
# Create $sourcebase/Makefile.am.
mkdir -p "$testdir/$sourcebase"
+ destfile="$sourcebase/Makefile.am"
func_emit_lib_Makefile_am > "$testdir/$sourcebase/Makefile.am"
any_uses_subdirs="$uses_subdirs"
auxdir=`echo "$testsbase/"|sed 's%[^/][^/]*//*%../%g'`"$auxdir"
# Create $testsbase/Makefile.am.
use_libtests=false
+ destfile="$testsbase/Makefile.am"
func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am"
any_uses_subdirs="$any_uses_subdirs$uses_subdirs"
# Create $testsbase/configure.ac.
for m4base in $m4dirs; do
# Perform func_import in a subshell, so that variable values
# such as
- # local_gnulib_dir, avoidlist, sourcebase, m4base, pobase,
- # docbase, testsbase, inctests, libname, lgpl, makefile_name,
- # libtool, macro_prefix, po_domain, vc_files
+ # local_gnulib_dir, incobsolete, avoidlist, sourcebase, m4base,
+ # pobase, docbase, testsbase, inctests, libname, lgpl,
+ # makefile_name, libtool, macro_prefix, po_domain, vc_files
# don't propagate from one directory to another.
(func_import) || func_exit 1
done
done
;;
+ extract-status )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_status "$module"
+ fi
+ done
+ ;;
+
extract-notice )
for module
do