automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FYI: simplify require_file_internal


From: Alexandre Duret-Lutz
Subject: FYI: simplify require_file_internal
Date: Mon, 12 Apr 2004 21:18:57 +0200
User-agent: Gnus/5.1003 (Gnus v5.10.3) Emacs/21.3.50 (gnu/linux)

I'm installing this on HEAD.

Automake now computes the aux directory outside
require_file_internal, so there is no need to loop over and
update @require_file_paths inside that function.


2004-04-12  Alexandre Duret-Lutz  <address@hidden>

        * automake.in (@config_aux_path, $config_aux_dir): Rename as ...
        ($config_aux_dir, $am_config_aux_dir): ... these.
        ($config_aux_dir_set_in_configure_in): Rename as ...
        ($config_aux_dir_set_in_configure_ac): ... this.
        (%require_file_found): Rename as ...
        (%required_file_not_found): ... this.
        (handle_languages, handle_texinfo_helper, handle_dist,
        handle_configure, handle_emacs_lisp, handle_python,
        scan_autoconf_traces, yacc_lex_finish_helper): Adjust to new names.
        (scan_autoconf_traces): Call locate_aux_dir.
        (locate_aux_dir): New function.
        (@require_file_paths): Remove, not used anymore.
        (require_file_internal): Look files in only one directory (instead
        of @require_file_internal) passed in argument.
        (require_file, require_conf_file): Pass the destination directory
        to require_file_internal.

Index: TODO
===================================================================
RCS file: /cvs/automake/automake/TODO,v
retrieving revision 1.422
diff -u -p -r1.422 TODO
--- TODO        8 Jan 2004 23:32:09 -0000       1.422
+++ TODO        12 Apr 2004 18:45:23 -0000
@@ -257,10 +257,6 @@ suffix rules.  So for instance if you ha
 saw a `.x' file, it would automatically build and install the
 corresponding `.y' file.]
 
-!! Must fix require_file stuff.  It is really gross, and I don't
-   understand it any more.
-   [ Seconded. ]
-
 Jim's idea: should look for @setfilename and warn if filenames too long
 * guess split size
 
Index: automake.in
===================================================================
RCS file: /cvs/automake/automake/automake.in,v
retrieving revision 1.1550
diff -u -p -r1.1550 automake.in
--- automake.in 10 Apr 2004 17:18:01 -0000      1.1550
+++ automake.in 12 Apr 2004 18:45:27 -0000
@@ -322,11 +322,15 @@ my @other_input_files = ();
 # The keys are the files created by these macros.
 my %ac_config_files_location = ();
 
-# List of directories to search for configure-required files.  This
-# can be set by AC_CONFIG_AUX_DIR.
-my @config_aux_path = qw(. .. ../..);
+# Directory to search for configure-required files.  This
+# will be computed by &locate_aux_dir and can be set using
+# AC_CONFIG_AUX_DIR in configure.ac.
+# $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree.
 my $config_aux_dir = '';
-my $config_aux_dir_set_in_configure_in = 0;
+my $config_aux_dir_set_in_configure_ac = 0;
+# $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used
+# in Makefiles.
+my $am_config_aux_dir = '';
 
 # Whether AM_GNU_GETTEXT has been seen in configure.ac.
 my $seen_gettext = 0;
@@ -423,11 +427,6 @@ my %required_targets =
 # should distribute depcomp -- has been generated.)
 my $automake_needs_to_reprocess_all_files = 0;
 
-# If a file name appears as a key in this hash, then it has already
-# been checked for.  This variable is local to the "require file"
-# functions.
-my %require_file_found = ();
-
 # The name of the Makefile currently being processed.
 my $am_file = 'BUG';
 
@@ -1066,7 +1065,8 @@ sub handle_languages
        if (&saw_sources_p (0) && keys %dep_files)
        {
            # Set location of depcomp.
-           &define_variable ('depcomp', "\$(SHELL) $config_aux_dir/depcomp",
+           &define_variable ('depcomp',
+                             "\$(SHELL) $am_config_aux_dir/depcomp",
                              INTERNAL);
            &define_variable ('am__depfiles_maybe', 'depfiles', INTERNAL);
 
@@ -3041,7 +3041,7 @@ sub handle_texinfo_helper ($)
          ++$done;
 
          # This is ugly, but it is our historical practice.
-         if ($config_aux_dir_set_in_configure_in)
+         if ($config_aux_dir_set_in_configure_ac)
            {
              require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
                                            'mdate-sh');
@@ -3053,10 +3053,9 @@ sub handle_texinfo_helper ($)
            }
 
          my $conf_dir;
-         if ($config_aux_dir_set_in_configure_in)
+         if ($config_aux_dir_set_in_configure_ac)
            {
-             $conf_dir = $config_aux_dir;
-             $conf_dir .= '/' unless $conf_dir =~ /\/$/;
+             $conf_dir = "$am_config_aux_dir/";
            }
          else
            {
@@ -3088,9 +3087,9 @@ sub handle_texinfo_helper ($)
       $texinfodir = '$(top_srcdir)/../texinfo';
       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
     }
-  elsif ($config_aux_dir_set_in_configure_in)
+  elsif ($config_aux_dir_set_in_configure_ac)
     {
-      $texinfodir = $config_aux_dir;
+      $texinfodir = $am_config_aux_dir;
       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
       $need_texi_file = 2; # so that we require_conf_file later
     }
@@ -3363,12 +3362,10 @@ sub handle_dist ()
   # If the aux dir is set, and it does not have a Makefile.am, then
   # we check for these files there as well.
   my $check_aux = 0;
-  my $auxdir = '';
   if ($relative_dir eq '.'
-      && $config_aux_dir_set_in_configure_in)
+      && $config_aux_dir_set_in_configure_ac)
     {
-      ($auxdir = $config_aux_dir) =~ s,^\$\(top_srcdir\)/,,;
-      if (! &is_make_dir ($auxdir))
+      if (! &is_make_dir ($config_aux_dir))
        {
          $check_aux = 1;
        }
@@ -3384,9 +3381,9 @@ sub handle_dist ()
 
       # Don't use `elsif' here because a file might meaningfully
       # appear in both directories.
-      if ($check_aux && -f ($auxdir . '/' . $cfile))
+      if ($check_aux && -f "$config_aux_dir/$cfile")
        {
-         &push_dist_common ($auxdir . '/' . $cfile);
+         &push_dist_common ("$config_aux_dir/$cfile")
        }
     }
 
@@ -3809,14 +3806,14 @@ sub handle_configure ($$$@)
   # Distribute and define mkinstalldirs only if it is already present
   # in the package, for backward compatibility (some people my still
   # use $(mkinstalldirs)).
-  my $mkidpath = $config_aux_path[0] . '/mkinstalldirs';
+  my $mkidpath = "$config_aux_dir/mkinstalldirs";
   if (-f $mkidpath)
     {
       # Use require_file so that any existingscript gets updated
       # by --force-missing.
       require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs');
       define_variable ('mkinstalldirs',
-                      "\$(SHELL) $config_aux_dir/mkinstalldirs", INTERNAL);
+                      "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL);
     }
   else
     {
@@ -4413,7 +4410,7 @@ sub handle_emacs_lisp
   require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
                     'EMACS', 'lispdir');
   require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp');
-  &define_variable ('elisp_comp', $config_aux_dir . '/elisp-comp', INTERNAL);
+  &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL);
 }
 
 # Handle Python
@@ -4425,7 +4422,7 @@ sub handle_python
 
   require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
   require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
-  &define_variable ('py_compile', $config_aux_dir . '/py-compile', INTERNAL);
+  &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
 }
 
 # Handle Java.
@@ -4631,8 +4628,8 @@ sub scan_autoconf_traces ($)
        }
       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
        {
-         @config_aux_path = $args[1];
-         $config_aux_dir_set_in_configure_in = 1;
+         $config_aux_dir = $args[1];
+         $config_aux_dir_set_in_configure_ac = 1;
        }
       elsif ($macro eq 'AC_CONFIG_FILES')
        {
@@ -4836,16 +4833,15 @@ sub scan_autoconf_files ()
        }
     }
 
+  locate_aux_dir ();
   # Look for some files we need.  Always check for these.  This
   # check must be done for every run, even those where we are only
-  # looking at a subdir Makefile.  We must set relative_dir so that
-  # the file-finding machinery works.
-  # FIXME: Is this broken because it needs dynamic scopes.
-  # My tests seems to show it's not the case.
+  # looking at a subdir Makefile.  We must set relative_dir for
+  # maybe_push_required_file to work.
   $relative_dir = '.';
   require_conf_file ($configure_ac, FOREIGN, 'install-sh', 'missing');
   err_am "`install.sh' is an anachronism; use `install-sh' instead"
-    if -f $config_aux_path[0] . '/install.sh';
+    if -f $config_aux_dir . '/install.sh';
 
   # Preserve dist_common for later.
   $configure_dist_common = variable_value ('DIST_COMMON') || '';
@@ -5200,9 +5196,9 @@ sub yacc_lex_finish_helper
     # allow parallel builds to work correctly.  FIXME: for now, no
     # line number.
     require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
-    if ($config_aux_dir_set_in_configure_in)
+    if ($config_aux_dir_set_in_configure_ac)
     {
-       &define_variable ('YLWRAP', $config_aux_dir . "/ylwrap", INTERNAL);
+       &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
     }
     else
     {
@@ -6631,8 +6627,31 @@ sub is_make_dir
 
 ################################################################
 
-# This variable is local to the "require file" set of functions.
-my @require_file_paths = ();
+# Find the aux dir.  This should match the algorithm used by
+# ./configure. (See the Autoconf documentation for for
+# AC_CONFIG_AUX_DIR.)
+sub locate_aux_dir ()
+{
+  if (! $config_aux_dir_set_in_configure_ac)
+    {
+      # The default auxiliary directory is the first
+      # of ., .., or ../.. that contains install-sh.
+      # Assume . if install-sh doesn't exist yet.
+      for my $dir (qw (. .. ../..))
+       {
+         if (-f "$dir/install-sh")
+           {
+             $config_aux_dir = $dir;
+             last;
+           }
+       }
+      $config_aux_dir = '.' unless $config_aux_dir;
+    }
+  # Avoid unsightly '/.'s.
+  $am_config_aux_dir =
+    '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
+  $am_config_aux_dir =~ s,/*$,,;
+}
 
 
 # &maybe_push_required_file ($DIR, $FILE, $FULLFILE)
@@ -6690,148 +6709,127 @@ sub maybe_push_required_file
 }
 
 
-# &require_file_internal ($WHERE, $MYSTRICT, @FILES)
-# --------------------------------------------------
-# Verify that the file must exist in the current directory.
+# If a file name appears as a key in this hash, then it has already
+# been checked for.  This allows us not to report the same error more
+# than once.
+my %required_file_not_found = ();
+
+# &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES)
+# --------------------------------------------------------------
+# Verify that the file must exist in $DIRECTORY, or install it.
 # $MYSTRICT is the strictness level at which this file becomes required.
-#
-# Must set require_file_paths before calling this function.
-# require_file_paths is set to hold a single directory (the one in
-# which the first file was found) before return.
-sub require_file_internal ($$@)
+sub require_file_internal ($$$@)
 {
-    my ($where, $mystrict, @files) = @_;
+  my ($where, $mystrict, $dir, @files) = @_;
 
-    foreach my $file (@files)
+  foreach my $file (@files)
     {
-       my $fullfile;
-       my $errdir;
-       my $errfile;
-       my $save_dir;
+      my $fullfile = "$dir/$file";
+      my $found_it = 0;
+      my $dangling_sym = 0;
 
-       my $found_it = 0;
-       my $dangling_sym = 0;
-       foreach my $dir (@require_file_paths)
+      if (-l $fullfile && ! -f $fullfile)
        {
-           $fullfile = $dir . "/" . $file;
-           $errdir = $dir unless $errdir;
-
-           # Use different name for "error filename".  Otherwise on
-           # an error the bad file will be reported as e.g.
-           # `../../install-sh' when using the default
-           # config_aux_path.
-           $errfile = $errdir . '/' . $file;
-
-           if (-l $fullfile && ! -f $fullfile)
-           {
-               $dangling_sym = 1;
-               last;
-           }
-           elsif (-f $fullfile)
-           {
-               $found_it = 1;
-               maybe_push_required_file ($dir, $file, $fullfile);
-               $save_dir = $dir;
-               last;
-           }
+         $dangling_sym = 1;
+       }
+      elsif (-f $fullfile)
+       {
+         $found_it = 1;
+         maybe_push_required_file ($dir, $file, $fullfile);
        }
 
-       # `--force-missing' only has an effect if `--add-missing' is
-       # specified.
-       if ($found_it && (! $add_missing || ! $force_missing))
+      # `--force-missing' only has an effect if `--add-missing' is
+      # specified.
+      if ($found_it && (! $add_missing || ! $force_missing))
        {
-           # Prune the path list.
-           @require_file_paths = $save_dir;
+         next;
        }
-       else
+      else
        {
-           # If we've already looked for it, we're done.  You might
-           # wonder why we don't do this before searching for the
-           # file.  If we do that, then something like
-           # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
-           # DIST_COMMON.
-           if (! $found_it)
+         # If we've already looked for it, we're done.  You might
+         # wonder why we don't do this before searching for the
+         # file.  If we do that, then something like
+         # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
+         # DIST_COMMON.
+         if (! $found_it)
            {
-               next if defined $require_file_found{$fullfile};
-               $require_file_found{$fullfile} = 1;
+             next if defined $required_file_not_found{$fullfile};
+             $required_file_not_found{$fullfile} = 1;
            }
 
-           if ($strictness >= $mystrict)
+         if ($strictness >= $mystrict)
            {
-               if ($dangling_sym && $add_missing)
+             if ($dangling_sym && $add_missing)
                {
-                   unlink ($fullfile);
+                 unlink ($fullfile);
                }
 
-               my $trailer = '';
-               my $suppress = 0;
+             my $trailer = '';
+             my $suppress = 0;
 
-               # Only install missing files according to our desired
-               # strictness level.
-               my $message = "required file `$errfile' not found";
-               if ($add_missing)
+             # Only install missing files according to our desired
+             # strictness level.
+             my $message = "required file `$fullfile' not found";
+             if ($add_missing)
                {
-                   if (-f ("$libdir/$file"))
+                 if (-f ("$libdir/$file"))
                    {
-                       $suppress = 1;
+                     $suppress = 1;
 
-                       # Install the missing file.  Symlink if we
-                       # can, copy if we must.  Note: delete the file
-                       # first, in case it is a dangling symlink.
-                       $message = "installing `$errfile'";
-                       # Windows Perl will hang if we try to delete a
-                       # file that doesn't exist.
-                       unlink ($errfile) if -f $errfile;
-                       if ($symlink_exists && ! $copy_missing)
+                     # Install the missing file.  Symlink if we
+                     # can, copy if we must.  Note: delete the file
+                     # first, in case it is a dangling symlink.
+                     $message = "installing `$fullfile'";
+                     # Windows Perl will hang if we try to delete a
+                     # file that doesn't exist.
+                     unlink ($fullfile) if -f $fullfile;
+                     if ($symlink_exists && ! $copy_missing)
                        {
-                           if (! symlink ("$libdir/$file", $errfile))
+                         if (! symlink ("$libdir/$file", $fullfile))
                            {
-                               $suppress = 0;
-                               $trailer = "; error while making link: $!";
+                             $suppress = 0;
+                             $trailer = "; error while making link: $!";
                            }
                        }
-                       elsif (system ('cp', "$libdir/$file", $errfile))
+                     elsif (system ('cp', "$libdir/$file", $fullfile))
                        {
-                           $suppress = 0;
-                           $trailer = "\n    error while copying";
+                         $suppress = 0;
+                         $trailer = "\n    error while copying";
                        }
                    }
 
-                   if (! maybe_push_required_file (dirname ($errfile),
-                                                    $file, $errfile))
+                 if (! maybe_push_required_file (dirname ($fullfile),
+                                                 $file, $fullfile))
                    {
-                       if (! $found_it)
+                     if (! $found_it)
                        {
-                           # We have added the file but could not push it
-                           # into DIST_COMMON (probably because this is
-                           # an auxiliary file and we are not processing
-                           # the top level Makefile). This is unfortunate,
-                           # since it means we are using a file which is not
-                           # distributed!
-
-                           # Get Automake to be run again: on the second
-                           # run the file will be found, and pushed into
-                           # the toplevel DIST_COMMON automatically.
-                           $automake_needs_to_reprocess_all_files = 1;
+                         # We have added the file but could not push it
+                         # into DIST_COMMON (probably because this is
+                         # an auxiliary file and we are not processing
+                         # the top level Makefile). This is unfortunate,
+                         # since it means we are using a file which is not
+                         # distributed!
+
+                         # Get Automake to be run again: on the second
+                         # run the file will be found, and pushed into
+                         # the toplevel DIST_COMMON automatically.
+                         $automake_needs_to_reprocess_all_files = 1;
                        }
                    }
-
-                   # Prune the path list.
-                   @require_file_paths = &dirname ($errfile);
                }
 
-               # If --force-missing was specified, and we have
-               # actually found the file, then do nothing.
-               next
-                   if $found_it && $force_missing;
-
-               # If we couldn' install the file, but it is a target in
-               # the Makefile, don't print anything.  This allows files
-               # like README, AUTHORS, or THANKS to be generated.
-               next
-                 if !$suppress && rule $file;
+             # If --force-missing was specified, and we have
+             # actually found the file, then do nothing.
+             next
+               if $found_it && $force_missing;
+
+             # If we couldn' install the file, but it is a target in
+             # the Makefile, don't print anything.  This allows files
+             # like README, AUTHORS, or THANKS to be generated.
+             next
+               if !$suppress && rule $file;
 
-               msg ($suppress ? 'note' : 'error', $where, "$message$trailer");
+             msg ($suppress ? 'note' : 'error', $where, "$message$trailer");
            }
        }
     }
@@ -6842,8 +6840,7 @@ sub require_file_internal ($$@)
 sub require_file ($$@)
 {
     my ($where, $mystrict, @files) = @_;
-    @require_file_paths = $relative_dir;
-    require_file_internal ($where, $mystrict, @files);
+    require_file_internal ($where, $mystrict, $relative_dir, @files);
 }
 
 # &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
@@ -6862,12 +6859,7 @@ sub require_file_with_macro ($$$@)
 sub require_conf_file ($$@)
 {
     my ($where, $mystrict, @files) = @_;
-    @require_file_paths = @config_aux_path;
-    require_file_internal ($where, $mystrict, @files);
-    my $dir = $require_file_paths[0];
-    @config_aux_path = @require_file_paths;
-     # Avoid unsightly '/.'s.
-    $config_aux_dir = '$(top_srcdir)' . ($dir eq '.' ? "" : "/$dir");
+    require_file_internal ($where, $mystrict, $config_aux_dir, @files);
 }
 
 

-- 
Alexandre Duret-Lutz





reply via email to

[Prev in Thread] Current Thread [Next in Thread]