This patch complements a new set of macros that I recently submitted
to autoconf-patches.

At this point, I'm mainly submitting it to give a clearer understanding
of the autoconf patch's intention (but I think it doesn't break anything
in automake).

It gives autoconf the control whether .F files are to be compiled 
directly into object files with a sufficiently smart compiler, 
or whether independent preprocessing is used to produce "pure" fortran
(.f files) first (if the compiler understands no or only rudimentary cpp).

Regards,
Martin

-- 
Martin Wilck <[EMAIL PROTECTED]>
Institute for Tropospheric Research, Permoserstr. 15, D-04318 Leipzig, Germany
Tel. +49-341-2352151 / Fax +49-341-2352361

Index: ChangeLog
===================================================================
RCS file: /cvs/automake/ChangeLog,v
retrieving revision 1.874
diff -u -r1.874 ChangeLog
--- ChangeLog   2000/07/02 21:55:44     1.874
+++ ChangeLog   2000/07/13 17:11:00
@@ -1,3 +1,15 @@
+2000-07-13 Martin Wilck <[EMAIL PROTECTED]>
+
+       * automake.in: Improve support for ppf77 through new autoconf
+       macros.
+       (main): change call for &register_language ('ppf77').
+       (scan_one_configure_file): look for AC_PROG_FPP.
+       (lang_ppf77_rewrite): remember ppf77 filenames.
+       (lang_f77_finish): work around the FIXME (routine called more than
+       once).
+       (lang_ppf77_finish): override a lot of stuff from
+       finish_languages, because direct .F.o compilation may be impossible.
+
 2000-07-02  Jim Meyering  <[EMAIL PROTECTED]>
 
        * automake.in (scan_one_configure_file): Recognize AC_LIBOBJ.
Index: automake.in
===================================================================
RCS file: /cvs/automake/automake.in,v
retrieving revision 1.787
diff -u -r1.787 automake.in
--- automake.in 2000/07/02 21:55:20     1.787
+++ automake.in 2000/07/13 17:03:11
@@ -355,10 +355,9 @@
                    'compiler-name=F77COMPILE',
                    'output-arg=-c -o $@',
                    'f', 'for', 'f90');
+# For ppf77, we must override automakes's default behaviour
+# (see comments for lang_ppf77_finish)
 &register_language ('ppf77', 'linker=F77LINK', 'flags=FFLAGS',
-                   'compile=$(F77) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(AM_FFLAGS) $(FFLAGS)',
-                   'compiler-name=PPF77COMPILE',
-                   'output-arg=-c -o $@',
                    'F');
 &register_language ('ratfor', 'linker=F77LINK',
                    'flags=RFLAGS', # FIXME also FFLAGS.
@@ -4568,7 +4567,7 @@
            &am_conf_line_warning ($filename, $., "automake requires \`AM_PROG_LEX', 
not \`AC_PROG_LEX'");
        }
 
-       if (/AC_PROG_(F77|YACC|RANLIB|CC|CXXCPP|CXX|LEX|AWK|CPP|LN_S)/)
+       if (/AC_PROG_(F77|FPP|YACC|RANLIB|CC|CXXCPP|CXX|LEX|AWK|CPP|LN_S)/)
        {
            $configure_vars{$1} = $filename . ':' . $.;
        }
@@ -4910,7 +4909,17 @@
 # Rewrite a single preprocessed Fortran 77 file.
 sub lang_ppf77_rewrite
 {
-    return $LANG_PROCESS;
+    local ($directory, $base, $ext) = @_;
+
+    local ($r) = &lang_f77_rewrite ($directory, $base, $ext);
+    local ($pfx) = '';
+    if ($r == $LANG_SUBDIR)
+    {
+       $pfx = $directory . '/';
+    }
+    $ppf77_sources{$pfx . $base . '.' . $ext} = 1;
+    &saw_extension ('f');
+    return $r;
 }
 
 # Rewrite a single ratfor file.
@@ -5143,42 +5152,100 @@
 
 sub lang_f77_finish
 {
-    # FIXME: this function can be called more than once.  We should
-    # arrange for it to only do anything the first time through.
-
     local ($ltcompile, $ltlink) = &libtool_compiler;
 
-    &define_variable ('F77LD', '$(F77)');
-    &define_variable ('F77LINK', $ltlink . '$(F77LD) $(AM_FFLAGS) $(FFLAGS) 
$(AM_LDFLAGS) $(LDFLAGS) -o $@');
+    if (!$content_seen{'F77LD'})
+       {
+           &define_variable ('F77LD', '$(F77)');
+           &define_variable ('F77LINK', $ltlink . '$(F77LD) $(AM_FFLAGS) $(FFLAGS) 
+$(AM_LDFLAGS) $(LDFLAGS) -o $@');
+           
+           if (! defined $configure_vars{'F77'})
+               {
+                   &am_error ("Fortran 77 source seen but \`F77' not defined in 
+\`configure.in'");
+               }
+       };
 
-    if (! defined $configure_vars{'F77'})
-    {
-       &am_error ("Fortran 77 source seen but \`F77' not defined in \`configure.in'");
-    }
 }
 
 # Preprocessed Fortran 77
-#
-# The current support for preprocessing Fortran 77 just involves passing
-# `$(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)' as additional flags
-# to the Fortran 77 compiler, since this is how GNU Make does it; see
-# the `GNU Make Manual, Edition 0.51 for `make' Version 3.76 Beta'
-# (specifically, from info file `(make)Catalogue of Rules').
 #
-# A better approach would be to write an Autoconf test
-# (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all
-# Fortran 77 compilers know how to do preprocessing.  The Autoconf macro
-# AC_PROG_FPP should test the Fortran 77 compiler first for
+# The autoconf macro AC_PROG_FPP tests the Fortran 77 compiler first for
 # preprocessing capabilities, and then fall back on cpp (if cpp were
 # available).
+#
+# If Fortran 77 doesn't handle cpp, but cpp (or equivalent) is available
+# as an external program, we must override make's "direct" .F.o rule in 
+# order to do "indirect" compilation (.F.f, .f.o). To do that in a
+# portable manner, we write an explicit rule for each .F file.
+#
+# It's up to autoconf to decide whether indirect or direct compilation works
+# better; this is achieved through the @FPP_SOURCE_EXT@ and @FPP_MAKE_FLAGS@
+# configure-time variables.
 sub lang_ppf77_finish
 {
+    local $file, @files;
+    local $ofile, $objfile, $lofile, $base;
+    local $ppf77_compile="\$(F77) \$(FPP_MAKE_FLAGS) \$(AM_FFLAGS) \$(FFLAGS)";
+    local $output_arg="-c -o";
+    local ($ltcompile, $ltlink) = &libtool_compiler;
+
     &lang_f77_finish;
+ 
+    if (! defined $configure_vars{'FPP'})
+       {
+           &am_error ("Preprocessed Fortran 77 source seen but \`FPP' not defined in 
+\`configure.in'");
+       }
+
+# FPP_OUTPUT is needed because some preprocessers print output to 
+# stdout, others to (base).f
+
+# this is a hack - autoconf strictly refuses to handle variable AM_CPPFLAGS
+    define_variable('ALL_CPPFLAGS','$(CPPFLAGS) $(AM_CPPFLAGS)');
+    define_configure_variable('FPPFLAGS');
+    define_configure_variable('FPP_MAKE_FLAGS');
+    define_configure_variable('FPP_SOURCE_EXT');
 
-    # We also handle the case of preprocessing `.F' files into `.f'
-    # files.
-    $output_rules .= (".F.f:\n"
-                     . "\t\$(F77COMPILE) -F \$<\n");
+    &define_compiler_variable ('PPF77COMPILE',
+                              $ltcompile, $ppf77_compile);
+
+    local ($full) = ("\t\$(PPF77COMPILE) $output_arg \$@");
+    
+# To override make's builtin .F.o rule and stay compatible,
+# we need to print explicit rules for each source file
+    foreach  $file (sort keys %ppf77_sources)
+       {
+           ($base=$file) =~ s/\.F$//;
+           $ofile= $base . ".o";
+           $lofile= $base . ".lo";
+           $objfile= $base . ".obj";
+
+           $output_rules .= ("$ofile:\t$base.\@FPP_SOURCE_EXT\@\n"
+                             . $full
+                             . " \$<\n");
+           $output_rules .= ("\@objfile:\t$base.\@FPP_SOURCE_EXT\@\n"
+                             . $full
+                             . " \$<\n")
+               if $seen_objext;
+
+           $output_rules .= ("$lofile:\t$base.\@FPP_SOURCE_EXT\@\n"
+                             . "\t\$(LTPPF77COMPILE) $output_arg"
+                             . " \$<\n")
+               if $seen_libtool;
+       }
+
+    $output_rules .= (".F.f:\t\n"
+                     . "\t\$(FPP) \$(DEFS) \$(INCLUDES) \$(FPPFLAGS) \$(AM_CPPFLAGS) 
+\$(CPPFLAGS)\$< \@FPP_OUTPUT\@\n\n");
+
+    @files = sort keys %ppf77_sources;
+    map ($_=~s/.F$/.f/, @files);
+    $output_rules .= "mostlyclean-PPF77:\n";
+    pretty_print_rule ("\t-rm -f","\t  ", @files);
+    $output_rules .= "\n";
+    
+    push (@clean, 'PPF77');
+    &push_phony_cleaners ('PPF77');
+    
+    
 }
 
 sub lang_ratfor_finish

Reply via email to