autoupdate
[gnulib.git] / gnulib-tool
index 89037fb..2e9f592 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004 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
@@ -22,7 +22,7 @@
 
 progname=$0
 package=gnulib
-cvsdatestamp='$Date: 2003-01-21 13:21:17 $'
+cvsdatestamp='$Date: 2004-08-17 23:36:21 $'
 last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'`
 version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'`
 
@@ -46,7 +46,7 @@ func_usage ()
 {
   echo "\
 Usage: gnulib-tool --list
-       gnulib-tool --import module1 ... moduleN
+       gnulib-tool --import [MODULE...]
        gnulib-tool --create-testdir --dir=directory module1 ... moduleN
        gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN]
        gnulib-tool --test --dir=directory module1 ... moduleN
@@ -79,8 +79,18 @@ Operation modes:
 
 Options:
       --dir=DIRECTORY       specify the target directory
-      --lib=libRARY         specify the library name
+                            For --import, this specify where your
+                            configure.ac can be found.  Defaults to current
+                            directory.
+      --lib=LIBRARY         Specify the library name.  Defaults to 'libgnu'.
+      --source-base=DIRECTORY
+                            Directory relative --dir where source code is
+                            placed (default \"lib\"), for --import.
+      --m4-base=DIRECTORY   Directory relative --dir where *.m4 macros are
+                            placed (default \"m4\"), for --import.
+      --libtool             Use libtool rules, for --import.
       --no-changelog        don't update or create ChangeLog files
+      --dry-run             For --import, only print what would have been done.
 
 Report bugs to <bug-gnulib@gnu.org>."
 }
@@ -110,12 +120,22 @@ func_fatal_error ()
 # - mode            list or import or create-testdir or create-megatestdir
 # - destdir         from --dir
 # - libname         from --lib
+# - sourcebase      from --source-base
+# - m4base          from --m4-base
+# - libtool         true if --libtool was given, blank otherwise
 # - do_changelog    false if --no-changelog was given, : otherwise
+# - dry_run         true if --dry-run was given, blank otherwise
 {
   mode=
   destdir=
-  libname=libfoo
+  libname=libgnu
+  sourcebase=
+  m4base=
+  libtool=
   do_changelog=:
+  dry_run=
+
+  supplied_opts="$@"
 
   while test $# -gt 0; do
     case "$1" in
@@ -156,13 +176,41 @@ func_fatal_error ()
           func_fatal_error "missing argument for --lib"
         fi
         libname=$1
+       supplied_libname=true
         shift ;;
       --lib=* )
         libname=`echo "X$1" | sed -e 's/^X--lib=//'`
+       supplied_libname=true
+        shift ;;
+      --source-base )
+        shift
+        if test $# = 0; then
+          func_fatal_error "missing argument for --source-base"
+        fi
+        sourcebase=$1
+        shift ;;
+      --source-base=* )
+        sourcebase=`echo "X$1" | sed -e 's/^X--source-base=//'`
+        shift ;;
+      --m4-base )
+        shift
+        if test $# = 0; then
+          func_fatal_error "missing argument for --m4-base"
+        fi
+        m4base=$1
+        shift ;;
+      --m4-base=* )
+        m4base=`echo "X$1" | sed -e 's/^X--m4-base=//'`
+        shift ;;
+      --libtool )
+        libtool=true
         shift ;;
       --no-changelog | --no-changelo | --no-changel | --no-change | --no-chang | --no-chan | --no-cha | --no-ch | --no-c )
         do_changelog=false
         shift ;;
+      --dry-run )
+        dry_run=true
+        shift ;;
       --help | --hel | --he | --h )
         func_usage
         exit 0 ;;
@@ -197,7 +245,7 @@ case "$0" in
      fi
      ;;
 esac
-while test -L "$self_abspathname"; do
+while test -h "$self_abspathname"; do
   # Resolve symbolic link.
   sedexpr1='s, -> ,#%%#,'
   sedexpr2='s,^.*#%%#\(.*\)$,\1,p'
@@ -231,11 +279,16 @@ func_verify_module ()
   fi
 }
 
-tags_regexp='\(Description\|Files\|Depends-on\|configure\.ac\|Makefile\.am\|Include\|Maintainer\)'
 sed_extract_prog=':[   ]*$/ {
   :a
     n
-    s/^'"$tags_regexp"':[      ]*$//
+    s/^Description:[   ]*$//
+    s/^Files:[         ]*$//
+    s/^Depends-on:[    ]*$//
+    s/^configure\.ac:[         ]*$//
+    s/^Makefile\.am:[  ]*$//
+    s/^Include:[       ]*$//
+    s/^Maintainer:[    ]*$//
     tb
     p
     ba
@@ -300,6 +353,11 @@ func_create_testdir ()
     for module in $modules; do
       func_verify_module
       if test -n "$module"; then
+        # Duplicate dependenies are harmless, but Jim wants a warning.
+        duplicated_deps=`func_get_dependencies $module | sort | uniq -d`
+        if test -n "$duplicated_deps"; then
+          echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2
+        fi
         xmodules="$xmodules $module "`func_get_dependencies $module`
       fi
     done
@@ -421,6 +479,10 @@ func_create_testdir ()
      echo "AC_GNU_SOURCE"
      echo
    fi
+   if grep gl_USE_SYSTEM_EXTENSIONS "$testdir"/m4/*.m4 > /dev/null; then
+     echo "gl_USE_SYSTEM_EXTENSIONS"
+     echo
+   fi
    for module in $modules; do
      func_verify_module
      if test -n "$module"; then
@@ -520,7 +582,239 @@ case $mode in
     ;;
 
   import )
-    func_fatal_error "NYI" ;;
+       # Where to import.
+       if test -z "$destdir"; then
+           destdir=.
+       fi
+       test -d "$destdir" \
+           || func_fatal_error "destination directory does not exist: $destdir"
+
+        # Prefer configure.ac to configure.in
+       test -f $destdir/configure.in && configure_ac=$destdir/configure.in
+       test -f $destdir/configure.ac && configure_ac=$destdir/configure.ac
+       test -f "$configure_ac" \
+            || func_fatal_error "cannot find $destdir/configure.ac"
+
+       # Get settings.
+       my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
+        /gl_MODULES[^_]/  {
+            s,^.*gl_MODULES([[   ]*\([^])]*\).*$,ac_modules="\1",; p;
+        };
+        /gl_SOURCE_BASE/   {
+            s,^.*gl_SOURCE_BASE([[         ]*\([^])]*\).*$,ac_sourcebase="\1",; p;
+        };
+        /gl_M4_BASE/   {
+            s,^.*gl_M4_BASE([[         ]*\([^])]*\).*$,ac_m4base="\1",; p;
+        };
+        /gl_LIB/   {
+            s,^.*gl_LIB([[         ]*\([^])]*\).*$,ac_libname="\1",; p;
+        };
+        /A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; };
+        /LT_INIT/            { s,^.*$,seen_libtool=:,; p; };
+        d;'
+       eval `cat $configure_ac | sed "$my_sed_traces"`
+
+       # Override libname?
+       if test -z "$supplied_libname" && test -n "$ac_libname"; then
+           libname="$ac_libname"
+       fi
+
+       # Set up source base.
+       test -z "$sourcebase" && sourcebase="$ac_sourcebase"
+       test -z "$sourcebase" && sourcebase="lib"
+       test -d "$destdir/$sourcebase" || \
+           (test -z "$dry_run" && mkdir "$destdir/$sourcebase") || \
+           func_fatal_error "source base $destdir/$sourcebase doesn't exist"
+
+       # Set up m4 base.
+       test -z "$m4base" && m4base="$ac_m4base"
+       test -z "$sourcebase" && m4base="m4"
+       test -d "$destdir/$m4base" || \
+           (test -z "$dry_run" && mkdir "$destdir/$m4base") || \
+           func_fatal_error "m4 base $destdir/$m4base doesn't exist"
+
+       # Using libtool?
+       if test x$seen_libtool != x; then
+           libtool=true
+       fi
+
+       # What modules to extract.
+       supplied_modules="$*"
+       modules=`for m in $supplied_modules; do echo $m; done | sort | uniq`
+       if test -z "$modules"; then
+           modules="$ac_modules"
+       fi
+
+        # Determine final module list.
+       while true; do
+           xmodules=
+           for module in $modules; do
+               func_verify_module
+               if test -n "$module"; then
+                    # Duplicate dependenies are harmless, but Jim wants a warning.
+                   duplicated_deps=`func_get_dependencies $module | sort | uniq -d`
+                   if test -n "$duplicated_deps"; then
+                       echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2
+                   fi
+                   xmodules="$xmodules $module "`func_get_dependencies $module`
+               fi
+           done
+           xmodules=`for m in $xmodules; do echo $m; done | sort | uniq`
+           if test "$xmodules" = "$modules"; then
+               break
+           fi
+           modules="$xmodules"
+       done
+       echo "Module list with included dependencies:"
+       echo "$modules" | sed -e 's/^/  /'
+
+        # Determine final file list.
+       files=
+       for module in $modules; do
+           func_verify_module
+           if test -n "$module"; then
+               files="$files "`func_get_filelist $module`
+           fi
+       done
+       files=`for f in $files; do echo $f; done | sort | uniq`
+       echo "File list:"
+       echo "$files" | sed -e 's/^/  /'
+
+       test -n "$files" \
+           || func_fatal_error "refusing to do nothing"
+
+        # Copy files.
+       for f in $files; do
+           case "$f" in
+               config/*) g=`echo "$f" | sed -e 's,^config/,,'` ;;
+               lib/*) g=`echo "$f" | sed -e "s,^lib/,$sourcebase/,"` ;;
+               m4/*) g=`echo "$f" | sed -e "s,^m4/,$m4base/,"` ;;
+               *) g="$f" ;;
+           esac
+           test -n "$dry_run" && dry=echo
+           $dry cp -p "$gnulib_dir/$f" "$destdir/$g"
+       done
+
+       # Commands printed in a comment in generated files.
+       cmd="gnulib-tool $supplied_opts"
+       opt_libtool=
+       if test -n "$libtool"; then
+           opt_libtool="--libtool"
+       fi
+       actioncmd="gnulib-tool --import --dir=$destdir --lib=$libname --source-base=$sourcebase --m4-base=$m4base $opt_libtool `echo $modules`"
+
+        # Create lib/Makefile.am.
+       echo "Creating $destdir/$sourcebase/Makefile.am..."
+       if test -n "$libtool"; then
+           libext=la
+           perhapsLT=LT
+       else
+           libext=a
+           perhapsLT=
+       fi
+       (
+           if test -z "$dry_run"; then
+               exec > $destdir/$sourcebase/Makefile.am
+           else
+               echo "# $destdir/$sourcebase/Makefile.am"
+           fi
+           echo "## Process this file with automake to produce Makefile.in."
+           echo "# Copyright (C) 2004 Free Software Foundation, Inc."
+           echo "#"
+           echo "# This file is free software, distributed under the terms of the GNU"
+           echo "# General Public License.  As a special exception to the GNU General"
+           echo "# Public License, this file may be distributed as part of a program"
+           echo "# that contains a configuration script generated by Automake, under"
+           echo "# the same distribution terms as the rest of that program."
+           echo "#"
+           echo "# Generated by gnulib-tool."
+           echo "#"
+           echo "# Invoked as: $cmd"
+           echo "# Reproduce by: $actioncmd"
+           echo
+           echo "AUTOMAKE_OPTIONS = 1.8 gnits"
+           echo
+           echo "noinst_${perhapsLT}LIBRARIES = $libname.$libext"
+           echo
+           echo "${libname}_${libext}_SOURCES ="
+           echo "${libname}_${libext}_LIBADD = @${perhapsLT}LIBOBJS@"
+           echo "EXTRA_DIST ="
+           echo "BUILT_SOURCES ="
+           echo "SUFFIXES ="
+           echo "MOSTLYCLEANFILES ="
+           echo "CLEANFILES ="
+           echo "DISTCLEANFILES ="
+           echo "MAINTAINERCLEANFILES ="
+           for module in $modules; do
+               func_verify_module
+               if test -n "$module"; then
+                   func_get_automake_snippet "$module" | sed -e "s,lib_SOURCES,${libname}_${libext}_SOURCES,g" -e "s,lib_OBJECTS,${libname}_${libext}_OBJECTS,g"
+                   if test "$module" = 'alloca'; then
+                       echo "${libname}_${libext}_LIBADD += @ALLOCA@"
+                   fi
+               fi
+           done
+           echo
+           echo "# Makefile.am ends here"
+       )
+
+        # Create gnulib.m4.
+       echo "Creating $destdir/$m4base/gnulib.m4..."
+       (
+           if test -z "$dry_run"; then
+               exec > $destdir/$m4base/gnulib.m4
+           else
+               echo "# $destdir/$m4base/gnulib.m4"
+           fi
+           echo "# Copyright (C) 2004 Free Software Foundation, Inc."
+           echo "# This file is free software, distributed under the terms of the GNU"
+           echo "# General Public License.  As a special exception to the GNU General"
+           echo "# Public License, this file may be distributed as part of a program"
+           echo "# that contains a configuration script generated by Autoconf, under"
+           echo "# the same distribution terms as the rest of that program."
+           echo "#"
+           echo "# Generated by gnulib-tool."
+           echo "#"
+           echo "# Invoked as: $cmd"
+           echo "# Reproduce by: $actioncmd"
+           echo
+           echo "AC_DEFUN([gl_EARLY],"
+           echo "["
+           if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 > /dev/null; then
+               echo "  AC_GNU_SOURCE"
+           fi
+           if grep gl_USE_SYSTEM_EXTENSIONS "$destdir"/$m4base/*.m4 > /dev/null; then
+               echo "  gl_USE_SYSTEM_EXTENSIONS"
+           fi
+           echo "])"
+           echo
+           echo "AC_DEFUN([gl_INIT],"
+           echo "["
+           for module in $modules; do
+               func_verify_module
+               if test -n "$module"; then
+                   func_get_autoconf_snippet "$module" | sed -e '/^$/d;' -e 's/^/  /' -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./'
+               fi
+           done
+           echo "])"
+           echo
+           echo "dnl Usage: gl_MODULES(module1 module2 ...)"
+           echo "AC_DEFUN([gl_MODULES], [])"
+           echo
+           echo "dnl Usage: gl_SOURCE_BASE(DIR)"
+           echo "AC_DEFUN([gl_SOURCE_BASE], [])"
+           echo
+           echo "dnl Usage: gl_M4_BASE(DIR)"
+           echo "AC_DEFUN([gl_M4_BASE], [])"
+           echo
+           echo "# gnulib.m4 ends here"
+       )
+       echo "Finished."
+       echo
+       echo "Don't forget to add \"$sourcebase/Makefile\""
+       echo "to AC_CONFIG_FILES in \"$configure_ac\" and to mention"
+       echo "\"`basename $sourcebase`\" in SUBDIRS in some Makefile.am."
+       ;;
 
   create-testdir )
     if test -z "$destdir"; then