Eric Blake wrote: > > I would propose to > > - Rename the current --import option to --add-import, > > - Introduce a new --import option, that is like the previous --import > > option except that it ignores the contents of gnulib-cache.m4, > > - Add a --remove-import option that can be used to remove a module > > from the list of modules (before dependency computation). > > > > 'bootstrap' would not have to change, because it already invokes > > 'gnulib-tool --import'. > > > > Opinions? Objections? > > Sounds good to me. It would certainly help both camps of users.
OK, I'm changing gnulib-tool as described, along with the documentation, to answer the concern you made in <http://lists.gnu.org/archive/html/bug-gnulib/2010-09/msg00055.html>. 2010-09-04 Bruno Haible <[email protected]> gnulib-tool: Change --import. New options --add/remove-import. * gnulib-tool: New options --add-import, --remove-import. (func_usage): Document them. (have_associative): Define always. (func_import): In import mode, don't merge the specified settings with the cached settings. Implement remove-import mode. * doc/gnulib-tool.texi (Modified imports): Mention the new options. Explain when to use them versus --import. (Simple update): Use --add-import instead of --import. * NEWS: Mention the change. diff --git a/NEWS b/NEWS index 2015502..e062efa 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,12 @@ Important notes --------------- +2010-09-04 gnulib-tool The option '--import' is no longer cumulative; it + now expects the complete list of modules and other + options on the command line. If you want to + augment (not set) the list of modules, use the + new option '--add-import' instead of '--import'. + User visible incompatible changes --------------------------------- diff --git a/doc/gnulib-tool.texi b/doc/gnulib-tool.texi index e9c376e..e4908e8 100644 --- a/doc/gnulib-tool.texi +++ b/doc/gnulib-tool.texi @@ -302,30 +302,48 @@ is built from the contents of a different variable, usually You can at any moment decide to use Gnulib differently than the last time. -If you only want to use more Gnulib modules, simply invoke -...@command{gnulib-tool --import @var{new-modules}}. @code{gnulib-tool} -remembers which modules were used last time. The list of modules that -you pass after @samp{--import} is @emph{added} to the previous list of -modules. +There are two ways to change how Gnulib is used. Which one you'll use, +depends on where you keep track of options and module names that you pass +to @code{gnulib-tool}. -For most changes, such as added or removed modules, or even different -choices of @samp{--lib}, @samp{--source-base} or @samp{--aux-dir}, there -are two ways to perform the change. - -The standard way is to modify manually the file @file{gnulib-cache.m4} -in the M4 macros directory, then launch @samp{gnulib-tool --import}. +...@itemize @bullet +...@item +If you store the options and module names in a file under your own +control, such as @file{autogen.sh}, @file{bootstrap}, +...@file{bootstrap.conf}, or similar, simply invoke @command{gnulib-tool} +again, with modified options and more or fewer module names. -The other way is to call @command{gnulib-tool} again, with the changed -command-line options. Note that this doesn't let you remove modules, -because as you just learned, the list of modules is always cumulated. -Also this way is often impractical, because you don't remember the way -you invoked @code{gnulib-tool} last time. +...@item +...@code{gnulib-tool} remembers which modules were used last time. If you +want to rely on @code{gnulib-tool}'s own memory of the last used +options and module names, you can use the commands +...@command{gnulib-tool --add-import} and +...@command{gnulib-tool --remove-import}. + +So, if you only want to use more Gnulib modules, simply invoke +...@command{gnulib-tool --add-import @var{new-modules}}. The list of +modules that you pass after @samp{--add-import} is @emph{added} to the +previous list of modules. + +Similarly, if you want to use fewer Gnulib modules, simply invoke +...@command{gnulib-tool --remove-import @var{unneeded-modules}}. The list +of modules that you pass after @samp{--remove-import} is @emph{removed} +from the previous list of modules. Note that if a module is then still +needed as dependency of other modules, it will be used nevertheless. +If you want to @emph{really} not use a module any more, regardless of +whether other modules may need it, you need to use the @samp{--avoid} +option. + +For other changes, such as different choices of @samp{--lib}, +...@samp{--source-base} or @samp{--aux-dir}, the normal way is to +modify manually the file @file{gnulib-cache.m4} in the M4 macros +directory, then launch @samp{gnulib-tool --add-import}. The only change for which this doesn't work is a change of the @samp{--m4-base} directory. Because, when you pass a different value of @samp{--m4-base}, @code{gnulib-tool} will not find the previous -...@file{gnulib-cache.m4} file any more... A possible solution is to manually -copy the @file{gnulib-cache.m4} into the new M4 macro directory. +...@file{gnulib-cache.m4} file any more... A possible solution is to +manually copy the @file{gnulib-cache.m4} into the new M4 macro directory. In the @file{gnulib-cache.m4}, the macros have the following meaning: @table @code @@ -372,6 +390,7 @@ The argument is the prefix to use for macros in the @file{gnulib-comp.m4} file. Corresponds to the @samp{--macro-prefix} command line argument. @end table +...@end itemize @node Simple update @section Simple update @@ -381,7 +400,7 @@ changing the list of modules or other parameters, a simple call does it: @smallexample -$ gnulib-tool --import +$ gnulib-tool --add-import @end smallexample @noindent diff --git a/gnulib-tool b/gnulib-tool index b809dd1..a0a0112 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -127,6 +127,8 @@ func_usage () Usage: gnulib-tool --list gnulib-tool --find filename gnulib-tool --import [module1 ... moduleN] + gnulib-tool --add-import [module1 ... moduleN] + gnulib-tool --remove-import [module1 ... moduleN] gnulib-tool --update gnulib-tool --create-testdir --dir=directory [module1 ... moduleN] gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN] @@ -151,9 +153,13 @@ Usage: gnulib-tool --list Operation modes: --list print the available module names --find find the modules which contain the specified file - --import import the given modules into the current package; + --import import the given modules into the current package + --add-import augment the list of imports from gnulib into the + current package, by adding the given modules; if no modules are specified, update the current package from the current gnulib + --remove-import reduce the list of imports from gnulib into the + current package, by removing the given modules --update update the current package, restore files omitted from version control --create-testdir create a scratch package with the given modules @@ -861,7 +867,8 @@ fi # Command-line option processing. # Removes the OPTIONS from the arguments. Sets the variables: -# - mode list or import or create-testdir or create-megatestdir +# - mode list or import or add-import or remove-import or update +# or create-testdir or create-megatestdir # - destdir from --dir # - local_gnulib_dir from --local-dir # - modcache true or false, from --cache-modules/--no-cache-modules @@ -957,6 +964,12 @@ fi --import | --impor | --impo | --imp | --im | --i ) mode=import shift ;; + --add-import | --add-impor | --add-impo | --add-imp | --add-im | --add-i | --add- | --add | --ad ) + mode=add-import + shift ;; + --remove-import | --remove-impor | --remove-impo | --remove-imp | --remove-im | --remove-i | --remove- | --remove | --remov | --remo | --rem | --re | --r ) + mode=remove-import + shift ;; --update | --updat | --upda | --upd | --up | --u ) mode=update shift ;; @@ -1214,10 +1227,10 @@ fi esac done - if test "$mode" = import; then + if case "$mode" in import | add-import | remove-import) true;; *) false;; esac; then if test -n "$excl_cxx_tests" || test -n "$excl_longrunning_tests" \ || test -n "$excl_privileged_tests" || test -n "$excl_unportable_tests"; then - echo "gnulib-tool: invalid options for 'import' mode" 1>&2 + echo "gnulib-tool: invalid options for '$mode' mode" 1>&2 echo "Try 'gnulib-tool --help' for more information." 1>&2 func_exit 1 fi @@ -1264,7 +1277,8 @@ fi DEFAULT_AUTOCONF_MINVERSION="2.59" autoconf_minversion= configure_ac= - if { test "$mode" = import || test "$mode" = update; } && test -n "$destdir"; then + if case "$mode" in import | add-import | remove-import | update) true;; *) false;; esac \ + && test -n "$destdir"; then if test -f "$destdir"/configure.ac; then configure_ac="$destdir/configure.ac" else @@ -1350,6 +1364,15 @@ for signal in 1 2 3 13 15; do done signal=0 +# Note: The 'eval' silences stderr output in dash. +if (declare -A x && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }) 2>/dev/null; then + # Zsh 4 and Bash 4 have associative arrays. + have_associative=true +else + # For other shells, use 'eval' with computed shell variable names. + have_associative=false +fi + # func_lookup_file file # looks up a file in $local_gnulib_dir or $gnulib_dir, or combines it through # 'patch'. @@ -1533,15 +1556,6 @@ sed_extract_field_header=' if $modcache; then - # Note: The 'eval' silences stderr output in dash. - if (declare -A x && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }) 2>/dev/null; then - # Zsh 4 and Bash 4 have associative arrays. - have_associative=true - else - # For other shells, use 'eval' with computed shell variable names. - have_associative=false - fi - if $have_associative; then # Declare the associative arrays. @@ -3308,6 +3322,7 @@ func_emit_initmacro_done () # func_import modules # Uses also the variables +# - mode import or add-import or remove-import or update # - destdir target directory # - local_gnulib_dir from --local-dir # - modcache true or false, from --cache-modules/--no-cache-modules @@ -3351,6 +3366,8 @@ func_emit_initmacro_done () func_import () { # Get the cached settings. + # In 'import' mode, we read them only for the purpose of knowing the old + # installed file list, and don't use them as defaults. cached_local_gnulib_dir= cached_specified_modules= cached_incobsolete= @@ -3480,6 +3497,11 @@ func_import () fi fi + if test "$mode" = import; then + # In 'import' mode, the new set of specified modules overrides the cached + # set of modules. Ignore the cached settings. + specified_modules="$1" + else # Merge the cached settings with the specified ones. # The m4base must be the same as expected from the pathname. if test -n "$cached_m4base" && test "$cached_m4base" != "$m4base"; then @@ -3503,9 +3525,47 @@ func_import () esac fi fi + case $mode in + add-import) # Append the cached and the specified module names. So that - # "gnulib-tool --import foo" means to add the module foo. + # "gnulib-tool --add-import foo" means to add the module foo. specified_modules="$cached_specified_modules $1" + ;; + remove-import) + # Take the cached module names, minus the specified module names. + specified_modules= + if $have_associative; then + # Use an associative array, for O(N) worst-case run time. + declare -A to_remove + for m in $1; do + to_remove[$m]=yes + done + for module in $cached_specified_modules; do + if test -z "${to_remove[$module]}"; then + func_append specified_modules "$module " + fi + done + else + # This loop has O(N²) worst-case run time. + for module in $cached_specified_modules; do + to_remove= + for m in $1; do + if test "$m" = "$module"; then + to_remove=yes + break + fi + done + if test -z "$to_remove"; then + func_append specified_modules "$module " + fi + done + fi + ;; + update) + # Take the cached module names. There are no specified module names. + specified_modules="$cached_specified_modules" + ;; + esac # Included obsolete modules among the dependencies if specified either way. if test -z "$incobsolete"; then incobsolete="$cached_incobsolete" @@ -3527,11 +3587,6 @@ func_import () if test -z "$inc_all_tests"; then inc_all_tests="$cached_inc_all_tests" fi - # --without-*-tests options are not supported here. - excl_cxx_tests= - excl_longrunning_tests= - excl_privileged_tests= - excl_unportable_tests= # 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` @@ -3604,6 +3659,12 @@ func_import () if test -z "$vc_files"; then vc_files="$cached_vc_files" fi + fi + # --without-*-tests options are not supported here. + excl_cxx_tests= + excl_longrunning_tests= + excl_privileged_tests= + excl_unportable_tests= # Canonicalize the list of specified modules. specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u` @@ -5429,7 +5490,7 @@ s/\([.*$]\)/[\1]/g' done ;; - import | update ) + import | add-import | remove-import | update ) # Where to import. if test -z "$destdir"; then @@ -5469,6 +5530,18 @@ s/\([.*$]\)/[\1]/g' fi # Determine where to apply func_import. + if test "$mode" = import; then + # Apply func_import to a particular gnulib directory. + # The command line contains the complete specification; don't look at + # the contents of gnulib-cache.m4. + test -n "$supplied_libname" || supplied_libname=true + test -n "$sourcebase" || sourcebase="lib" + test -n "$m4base" || m4base="m4" + test -n "$docbase" || docbase="doc" + test -n "$testsbase" || testsbase="tests" + test -n "$macro_prefix" || macro_prefix="gl" + func_import "$*" + else if test -n "$m4base"; then # Apply func_import to a particular gnulib directory. # Any number of additional modules can be given. @@ -5563,6 +5636,7 @@ s/\([.*$]\)/[\1]/g' fi fi fi + fi ;; create-testdir )
