This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch,AVR]: Use tr instead of set to canonicalize line endings for cmp


Richard Henderson wrote:

>> +# The avr-mmcu.texi we want to compare against / check into svn should
>> +# have unix-style line endings.  To make this work on MinGW, remove \r.
>> +# \r is not portable to Solaris tr, therefore we have a special case
>> +# for ASCII.  We use \r for other encodings like EBCDIC.
>>   s-avr-mmcu-texi: gen-avr-mmcu-texi$(build_exeext)
>> -    $(RUN_GEN) ./$<  | sed -e 's:\r::g'>  avr-mmcu.texi
>> +    $(RUN_GEN) ./$<  >  tmp-avr-mmcu.texi
>> +    case `echo X|tr X '\101'` in                     \
>> +      A) tr -d '\015'<  tmp-avr-mmcu.texi>  tmp2-avr-mmcu.texi ;;     \
>> +      *) tr -d '\r'<  tmp-avr-mmcu.texi>  tmp2-avr-mmcu.texi ;;     \
>> +    esac
> 
> Why not do this inside gen-avr-mmcu-texi.c instead?
> 
> Instead of writing to stdout, open the file to write, and open
> it in binary mode.  Seems much easier than fighting with conversion
> after the fact.

Here is an updated patch that prints to binary file.

Moreover, the rewritten gen-tool now sorts the MCUs alphabetically
and thus the texi output differs and must be regenerated.

However, this just solves 1/2 of the problem:
SVN identifies texi as text file and if checked out under, e.g.
Windows, SVN will adjust the line endings for Windows again.

If it's appropriate I would also set svn:mime-type to something
like application/foo but that seems bit odd.

Johann

	* config/avr/gen-avr-mmcu-texi.c: Rewrite:
	- Output to binary file	instead of as to stdout.
	- Take output file as command line parameter.
	- Sort MCUs.
	* config/avr/t-avr: Correct avr-mmcu.texi dependencies.
	(gen-avr-mmcu-texi): Use libiberty.
	(s-avr-mmcu-texi): Use new gen-avr-mmcu-texi interface.
	* doc/avr-mmcu.texi: Regenerate.
Index: config/avr/gen-avr-mmcu-texi.c
===================================================================
--- config/avr/gen-avr-mmcu-texi.c	(revision 188005)
+++ config/avr/gen-avr-mmcu-texi.c	(working copy)
@@ -20,25 +20,62 @@
 
 #include "avr-devices.c"
 
-int main (void)
+static const char*
+mcu_name[sizeof avr_mcu_types / sizeof avr_mcu_types[0]];
+
+static int
+comparator (const void *va, const void *vb)
+{
+  const char* const *a = (const char* const*) va;
+  const char* const *b = (const char* const*) vb;
+
+  return strcmp (*a, *b);
+} 
+
+static void
+print_mcus (FILE *fout, size_t n_mcus)
+{
+  size_t i;
+    
+  if (!n_mcus)
+    return;
+    
+  qsort (mcu_name, n_mcus, sizeof (char*), comparator);
+
+  fprintf (fout, "@*@var{mcu}@tie{}=");
+
+  for (i = 0; i < n_mcus; i++)
+    fprintf (fout, " @code{%s}%s", mcu_name[i], i == n_mcus-1 ? ".\n\n" : ",");
+}
+
+int main (int argc, char *argv[])
 {
   enum avr_arch arch = 0;
-  unsigned i, first = 1;
+  FILE *fout;
+  size_t i, n_mcus = 0;
   const struct mcu_type_s *mcu;
 
-  printf ("@c Copyright (C) 2012 Free Software Foundation, Inc.\n");
-  printf ("@c This is part of the GCC manual.\n");
-  printf ("@c For copying conditions, see the file "
-          "gcc/doc/include/fdl.texi.\n\n");
-
-  printf ("@c This file is generated automatically using\n");
-  printf ("@c gcc/config/avr/gen-avr-mmcu-texi.c from:\n");
-  printf ("@c    gcc/config/avr/avr-devices.c\n");
-  printf ("@c    gcc/config/avr/avr-mcus.def\n\n");
+  if (argc != 2
+      /* Write the texi output as binary so that line endings are the same
+         so matter what host we are on.  This is used in cmp -s in t-avr.  */
+      || !(fout = fopen (argv[1], "wb")))
+    {
+      fprintf (stderr, "\n%s: wrong usage\n", argv[0]);
+      return EXIT_FAILURE;
+    }
 
-  printf ("@c Please do not edit manually.\n\n");
+  fprintf (fout,
+           "@c Copyright (C) 2012 Free Software Foundation, Inc.\n"
+           "@c This is part of the GCC manual.\n"
+           "@c For copying conditions, see the file "
+           "gcc/doc/include/fdl.texi.\n\n"
+           "@c This file is generated automatically using\n"
+           "@c gcc/config/avr/gen-avr-mmcu-texi.c from:\n"
+           "@c    gcc/config/avr/avr-devices.c\n"
+           "@c    gcc/config/avr/avr-mcus.def\n\n"
+           "@c Please do not edit manually.\n\n");
 
-  printf ("@table @code\n\n");
+  fprintf (fout, "@table @code\n\n");
 
   for (mcu = avr_mcu_types; mcu->name; mcu++)
     {
@@ -46,28 +83,25 @@ int main (void)
         {
           arch = mcu->arch;
 
+          /* Start a new architecture:  Flush the MCUs collected so far.  */
+
+          print_mcus (fout, n_mcus);
+          n_mcus = 0;
+
           for (i = 0; i < sizeof (avr_texinfo) / sizeof (*avr_texinfo); i++)
-            {
-              if (arch == avr_texinfo[i].arch)
-                {
-                  if (mcu != avr_mcu_types)
-                    printf (".\n\n");
-                  printf ("@item %s\n%s\n", mcu->name, avr_texinfo[i].texinfo);
-                  printf ("@*@var{mcu}@tie{}=");
-                  first = 1;
-                  break;
-                }
-            }
+            if (arch == avr_texinfo[i].arch)
+              fprintf (fout, "@item %s\n%s\n",
+                       mcu->name, avr_texinfo[i].texinfo);
         }
       else if (arch == (enum avr_arch) mcu->arch)
         {
-          printf ("%s @code{%s}", first ? "" : ",", mcu->name);
-          first = 0;
+          mcu_name[n_mcus++] = mcu->name;
         }
     }
 
-  printf (".\n\n");
-  printf ("@end table\n");
+  print_mcus (fout, n_mcus);
+  fprintf (fout, "@end table\n");
+  fclose (fout);
 
   return EXIT_SUCCESS;
 }
Index: config/avr/t-avr
===================================================================
--- config/avr/t-avr	(revision 188005)
+++ config/avr/t-avr	(working copy)
@@ -44,13 +44,23 @@ $(srcdir)/config/avr/avr-tables.opt: $(s
 	$(SHELL) $< $(AVR_MCUS) > $@
 
 gen-avr-mmcu-texi$(build_exeext): $(srcdir)/config/avr/gen-avr-mmcu-texi.c \
-  $(TM_H) $(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c
-	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< -o $@
+  $(TM_H) $(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c $(LIBIBERTY)
+	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< -o $@ $(LIBIBERTY)
 
-avr-devices.o: s-avr-mmcu-texi
+# Make sure that the -mmcu= documentation is in sync with the compiler.
+$(srcdir)/doc/avr-mmcu.texi: s-avr-mmcu-texi; @true
 
+# invoke.texi @includes avr-mmcu.texi.  Put this dependency here instead
+# of in the global Makefile so that developers of other backends are not
+# bothered with AVR stuff. 
+$(srcdir)/doc/invoke.texi: $(srcdir)/doc/avr-mmcu.texi
+
+# The avr-mmcu.texi we want to compare against / check into svn should
+# have unix-style line endings.  This is accomplished by gen-avr-mmcu-texi
+# that writes tmp-avr-mmcu.texi as binary file.
 s-avr-mmcu-texi: gen-avr-mmcu-texi$(build_exeext)
-	$(RUN_GEN) ./$< | sed -e 's:\r::g' > avr-mmcu.texi
+	$(RUN_GEN) ./$< tmp-avr-mmcu.texi
+	$(SHELL) $(srcdir)/../move-if-change tmp-avr-mmcu.texi avr-mmcu.texi
 	@if cmp -s $(srcdir)/doc/avr-mmcu.texi avr-mmcu.texi; then \
 	  $(STAMP) $@;		\
 	else			\
Index: doc/avr-mmcu.texi
===================================================================
--- doc/avr-mmcu.texi	(revision 187704)
+++ doc/avr-mmcu.texi	(working copy)
@@ -13,11 +13,11 @@
 
 @item avr2
 ``Classic'' devices with up to 8@tie{}KiB of program memory.
-@*@var{mcu}@tie{}= @code{at90s2313}, @code{at90s2323}, @code{at90s2333}, @code{at90s2343}, @code{attiny22}, @code{attiny26}, @code{at90s4414}, @code{at90s4433}, @code{at90s4434}, @code{at90s8515}, @code{at90c8534}, @code{at90s8535}.
+@*@var{mcu}@tie{}= @code{at90c8534}, @code{at90s2313}, @code{at90s2323}, @code{at90s2333}, @code{at90s2343}, @code{at90s4414}, @code{at90s4433}, @code{at90s4434}, @code{at90s8515}, @code{at90s8535}, @code{attiny22}, @code{attiny26}.
 
 @item avr25
 ``Classic'' devices with up to 8@tie{}KiB of program memory and with the @code{MOVW} instruction.
-@*@var{mcu}@tie{}= @code{ata6289}, @code{attiny13}, @code{attiny13a}, @code{attiny2313}, @code{attiny2313a}, @code{attiny24}, @code{attiny24a}, @code{attiny4313}, @code{attiny44}, @code{attiny44a}, @code{attiny84}, @code{attiny84a}, @code{attiny25}, @code{attiny45}, @code{attiny85}, @code{attiny261}, @code{attiny261a}, @code{attiny461}, @code{attiny461a}, @code{attiny861}, @code{attiny861a}, @code{attiny43u}, @code{attiny87}, @code{attiny48}, @code{attiny88}, @code{at86rf401}.
+@*@var{mcu}@tie{}= @code{at86rf401}, @code{ata6289}, @code{attiny13}, @code{attiny13a}, @code{attiny2313}, @code{attiny2313a}, @code{attiny24}, @code{attiny24a}, @code{attiny25}, @code{attiny261}, @code{attiny261a}, @code{attiny4313}, @code{attiny43u}, @code{attiny44}, @code{attiny44a}, @code{attiny45}, @code{attiny461}, @code{attiny461a}, @code{attiny48}, @code{attiny84}, @code{attiny84a}, @code{attiny85}, @code{attiny861}, @code{attiny861a}, @code{attiny87}, @code{attiny88}.
 
 @item avr3
 ``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of  program memory.
@@ -25,23 +25,23 @@
 
 @item avr31
 ``Classic'' devices with 128@tie{}KiB of program memory.
-@*@var{mcu}@tie{}= @code{atmega103}, @code{at43usb320}.
+@*@var{mcu}@tie{}= @code{at43usb320}, @code{atmega103}.
 
 @item avr35
 ``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory and with the @code{MOVW} instruction.
-@*@var{mcu}@tie{}= @code{at90usb82}, @code{at90usb162}, @code{atmega8u2}, @code{atmega16u2}, @code{atmega32u2}, @code{attiny167}.
+@*@var{mcu}@tie{}= @code{at90usb162}, @code{at90usb82}, @code{atmega16u2}, @code{atmega32u2}, @code{atmega8u2}, @code{attiny167}.
 
 @item avr4
 ``Enhanced'' devices with up to 8@tie{}KiB of program memory.
-@*@var{mcu}@tie{}= @code{atmega8}, @code{atmega48}, @code{atmega48a}, @code{atmega48p}, @code{atmega88}, @code{atmega88a}, @code{atmega88p}, @code{atmega88pa}, @code{atmega8515}, @code{atmega8535}, @code{atmega8hva}, @code{at90pwm1}, @code{at90pwm2}, @code{at90pwm2b}, @code{at90pwm3}, @code{at90pwm3b}, @code{at90pwm81}.
+@*@var{mcu}@tie{}= @code{at90pwm1}, @code{at90pwm2}, @code{at90pwm2b}, @code{at90pwm3}, @code{at90pwm3b}, @code{at90pwm81}, @code{atmega48}, @code{atmega48a}, @code{atmega48p}, @code{atmega8}, @code{atmega8515}, @code{atmega8535}, @code{atmega88}, @code{atmega88a}, @code{atmega88p}, @code{atmega88pa}, @code{atmega8hva}.
 
 @item avr5
 ``Enhanced'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory.
-@*@var{mcu}@tie{}= @code{atmega16}, @code{atmega16a}, @code{atmega161}, @code{atmega162}, @code{atmega163}, @code{atmega164a}, @code{atmega164p}, @code{atmega165}, @code{atmega165a}, @code{atmega165p}, @code{atmega168}, @code{atmega168a}, @code{atmega168p}, @code{atmega169}, @code{atmega169a}, @code{atmega169p}, @code{atmega169pa}, @code{atmega32}, @code{atmega323}, @code{atmega324a}, @code{atmega324p}, @code{atmega324pa}, @code{atmega325}, @code{atmega325a}, @code{atmega325p}, @code{atmega3250}, @code{atmega3250a}, @code{atmega3250p}, @code{atmega328}, @code{atmega328p}, @code{atmega329}, @code{atmega329a}, @code{atmega329p}, @code{atmega329pa}, @code{atmega3290}, @code{atmega3290a}, @code{atmega3290p}, @code{atmega406}, @code{atmega64}, @code{atmega640}, @code{atmega644}, @code{atmega644a}, @code{atmega644p}, @code{atmega644pa}, @code{atmega645}, @code{atmega645a}, @code{atmega645p}, @code{atmega6450}, @code{atmega6450a}, @code{atmega6450p}, @code{atmega649}, @code{atmega649a}, @code{atmega649p}, @code{atmega6490}, @code{atmega16hva}, @code{atmega16hva2}, @code{atmega16hvb}, @code{atmega32hvb}, @code{atmega64hve}, @code{at90can32}, @code{at90can64}, @code{at90pwm216}, @code{at90pwm316}, @code{atmega32c1}, @code{atmega64c1}, @code{atmega16m1}, @code{atmega32m1}, @code{atmega64m1}, @code{atmega16u4}, @code{atmega32u4}, @code{atmega32u6}, @code{at90scr100}, @code{at90usb646}, @code{at90usb647}, @code{at94k}, @code{m3000}.
+@*@var{mcu}@tie{}= @code{at90can32}, @code{at90can64}, @code{at90pwm216}, @code{at90pwm316}, @code{at90scr100}, @code{at90usb646}, @code{at90usb647}, @code{at94k}, @code{atmega16}, @code{atmega161}, @code{atmega162}, @code{atmega163}, @code{atmega164a}, @code{atmega164p}, @code{atmega165}, @code{atmega165a}, @code{atmega165p}, @code{atmega168}, @code{atmega168a}, @code{atmega168p}, @code{atmega169}, @code{atmega169a}, @code{atmega169p}, @code{atmega169pa}, @code{atmega16a}, @code{atmega16hva}, @code{atmega16hva2}, @code{atmega16hvb}, @code{atmega16m1}, @code{atmega16u4}, @code{atmega32}, @code{atmega323}, @code{atmega324a}, @code{atmega324p}, @code{atmega324pa}, @code{atmega325}, @code{atmega3250}, @code{atmega3250a}, @code{atmega3250p}, @code{atmega325a}, @code{atmega325p}, @code{atmega328}, @code{atmega328p}, @code{atmega329}, @code{atmega3290}, @code{atmega3290a}, @code{atmega3290p}, @code{atmega329a}, @code{atmega329p}, @code{atmega329pa}, @code{atmega32c1}, @code{atmega32hvb}, @code{atmega32m1}, @code{atmega32u4}, @code{atmega32u6}, @code{atmega406}, @code{atmega64}, @code{atmega640}, @code{atmega644}, @code{atmega644a}, @code{atmega644p}, @code{atmega644pa}, @code{atmega645}, @code{atmega6450}, @code{atmega6450a}, @code{atmega6450p}, @code{atmega645a}, @code{atmega645p}, @code{atmega649}, @code{atmega6490}, @code{atmega649a}, @code{atmega649p}, @code{atmega64c1}, @code{atmega64hve}, @code{atmega64m1}, @code{m3000}.
 
 @item avr51
 ``Enhanced'' devices with 128@tie{}KiB of program memory.
-@*@var{mcu}@tie{}= @code{atmega128}, @code{atmega1280}, @code{atmega1281}, @code{atmega1284p}, @code{atmega128rfa1}, @code{at90can128}, @code{at90usb1286}, @code{at90usb1287}.
+@*@var{mcu}@tie{}= @code{at90can128}, @code{at90usb1286}, @code{at90usb1287}, @code{atmega128}, @code{atmega1280}, @code{atmega1281}, @code{atmega1284p}, @code{atmega128rfa1}.
 
 @item avr6
 ``Enhanced'' devices with 3-byte PC, i.e.@: with more than 128@tie{}KiB of program memory.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]