tech-crypto archive

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

Re: lib/9702: Makefile lossage for crypto-intl



Simon Burge wrote:

> Aidan Cully wrote:
> 
> > On Wed, Mar 29, 2000 at 09:25:29PM +1000, Simon Burge wrote:
> > > Lennart Augustsson wrote:
> > > 
> > > > >Number:         9702
> > > > >Category:       lib
> > > > >Synopsis:       Makefile lossage for crypto-intl
> > > > 
> > > > >Description:
> > > >         There is a problem with the Makefiles for the crypto-intl stuff.
> > > >         It remakes things too often.
> > > > >How-To-Repeat:
> > > >                 cd src
> > > >                 make build
> > > >                 make UPDATE=Y build
> > > >         Watch how the second make recompiles a lot of the crypto 
> > > > libraries.
> > > >         This can't be necessary and it's very annoying on slow machines.
> > > > >Fix:
> > > >         Makefiles move mysteriously, meandering maliciously...
> > > 
> > > I _think_ from memory that this is because commands like compile_et and
> > > so on get rebuilt (because libc is updated) and they have dependancies
> > > on them so other files get rebuilt.  Do you get unnecessary recompiles
> > > if you "make UPDATE=y build" yet again?
> 
> I dug a bit deeper - it's asn1_compile that's the problem.  In my case
> after two complete builds on my Alpha:
> 
>       cd /NetBSD/src/crypto-intl/lib/libasn1
>       make
>       touch 
> /NetBSD/src/crypto-intl/lib/libasn1/asn1_compile/obj.alpha/asn1_compile
>       make
> 
> nothing happens after the first make and the second make will rebuild
> libasn1 again.  Doing a diff on the old .x files and the new .x files
> reveals no differences.  It sounds like we should get asn1_compile to
> generate the new files into temporary files and only move them to the
> right name if the correct file is either different or missing, ala the
> cmphdr() function in usr.sbin/config/mkheaders.c.

The following works for me.  Before this goes in, I need to check if
any copyright notices would need to be added because of the use of
config(8)'s cmphdr() function, here called compare_and_move().  I guess
it could be rewritten from scratch to avoid any problems -

        system("cmp tmp real || mv tmp real");

is probably cheating :-)  Any calls on this, anyone?

Simon.
--
Index: gen.c
===================================================================
RCS file: /cvsroot/cryptosrc-intl/crypto-intl/dist/heimdal/lib/asn1/gen.c,v
retrieving revision 1.1.1.1
diff -p -u -r1.1.1.1 gen.c
--- gen.c       2000/01/16 01:52:56     1.1.1.1
+++ gen.c       2000/04/14 03:41:08
@@ -41,18 +41,24 @@ FILE *headerfile, *codefile, *logfile;
 
 static char *orig_filename;
 static char header[1024];
+static char theader[1024];
 static char headerbase[1024] = STEM;
 
+static void compare_and_move(const char *, const char *);
+
 void
 init_generate (char *filename, char *base)
 {
+    char *tfilename;
+
     orig_filename = filename;
     if(base)
        strcpy(headerbase, base);
-    sprintf(header, "%s.h", headerbase);
-    headerfile = fopen (header, "w");
+    snprintf(header, sizeof(header), "%s.h", headerbase);
+    snprintf(theader, sizeof(theader), "tmp_%s.h", headerbase);
+    headerfile = fopen (theader, "w");
     if (headerfile == NULL)
-       err (1, "open %s", header);
+       err (1, "open %s", theader);
     fprintf (headerfile,
             "/* Generated from %s */\n"
             "/* Do not edit */\n\n",
@@ -85,9 +91,9 @@ init_generate (char *filename, char *bas
 #endif
             );
     fprintf (headerfile, "#endif\n\n");
-    logfile = fopen(STEM "_files", "w");
+    logfile = fopen("tmp_" STEM "_files", "w");
     if (logfile == NULL)
-       err (1, "open " STEM "_files");
+       err (1, "open tmp_" STEM "_files");
 }
 
 void
@@ -96,8 +102,10 @@ close_generate ()
     fprintf (headerfile, "#endif /* __%s_h__ */\n", headerbase);
 
     fclose (headerfile);
+    compare_and_move(theader, header);
     fprintf (logfile, "\n");
     fclose (logfile);
+    compare_and_move("tmp_" STEM "_files", STEM "_files");
 }
 
 void
@@ -318,14 +326,14 @@ generate_type_header (const Symbol *s)
 void
 generate_type (const Symbol *s)
 {
-    char *filename;
+    char *filename, *tfilename;
 
     asprintf (&filename, "%s_%s.x", STEM, s->gen_name);
-    codefile = fopen (filename, "w");
+    asprintf (&tfilename, "tmp_%s_%s.x", STEM, s->gen_name);
+    codefile = fopen (tfilename, "w");
     if (codefile == NULL)
-       err (1, "fopen %s", filename);
+       err (1, "fopen %s", tfilename);
     fprintf(logfile, "%s ", filename);
-    free(filename);
     fprintf (codefile, 
             "/* Generated from %s */\n"
             "/* Do not edit */\n\n"
@@ -348,4 +356,63 @@ generate_type (const Symbol *s)
     generate_glue (s);
     fprintf(headerfile, "\n\n");
     fclose(codefile);
+    compare_and_move(tfilename, filename);
+    free(filename);
+    free(tfilename);
+}
+
+/*
+ * This is lifted out of config(8)'s mkheaders.c.
+ */
+
+static void
+compare_and_move(const char *tfname, const char *nfname)
+{
+       char tbuf[BUFSIZ], nbuf[BUFSIZ];
+       FILE *tfp, *nfp;
+
+       if ((tfp = fopen(tfname, "r")) == NULL)
+               err(1, "open %s", tfname);
+
+       if ((nfp = fopen(nfname, "r")) == NULL)
+               goto moveit;
+
+       while (fgets(tbuf, sizeof(tbuf), tfp) != NULL) {
+               if (fgets(nbuf, sizeof(nbuf), nfp) == NULL) {
+                       /*
+                        * Old file has fewer lines.
+                        */
+                       goto moveit;
+               }
+               if (strcmp(tbuf, nbuf) != 0)
+                       goto moveit;
+       }
+
+       /*
+        * We've reached the end of the new file.  Check to see if new file
+        * has fewer lines than old.
+        */
+       if (fgets(nbuf, sizeof(nbuf), nfp) != NULL) {
+               /*
+                * New file has fewer lines.
+                */
+               goto moveit;
+       }
+
+       (void) fclose(nfp);
+       (void) fclose(tfp);
+       if (remove(tfname) == -1)
+               err(1, "remove %s", tfname);
+       return;
+
+ moveit:
+       /*
+        * They're different, or the file doesn't exist.
+        */
+       if (nfp)
+               (void) fclose(nfp);
+       if (tfp)
+               (void) fclose(tfp);
+       if (rename(tfname, nfname) == -1)
+               err(1, "rename %s %s", tfname, nfname);
 }



Home | Main Index | Thread Index | Old Index