Make a little more effort to avoid touching certain generated files if

they were not changed.  This makes 'make depend' more useful.
This commit is contained in:
Peter Wemm 1996-01-12 08:57:10 +00:00
parent d007c60359
commit d8f19d9417
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13400
6 changed files with 84 additions and 11 deletions

View File

@ -192,6 +192,7 @@ char *get_word();
char *get_quoted_word();
char *path();
char *raise();
void moveifchanged();
int do_trace;

View File

@ -44,8 +44,11 @@ static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <stdio.h>
#include <ctype.h>
#include <err.h>
#include <sysexits.h>
#include "y.tab.h"
#include "config.h"
@ -328,3 +331,65 @@ path(file)
}
return (cp);
}
/*
* moveifchanged --
* compare two files; rename if changed.
*/
void
moveifchanged(const char *from_name, const char *to_name)
{
char *p, *q;
int changed;
size_t tsize;
struct stat from_sb, to_sb;
int from_fd, to_fd;
changed = 0;
if ((from_fd = open(from_name, O_RDONLY)) < 0)
err(EX_OSERR, "moveifchanged open(%s)", from_name);
if ((to_fd = open(to_name, O_RDONLY)) < 0)
changed++;
if (!changed && fstat(from_fd, &from_sb) < 0)
err(EX_OSERR, "moveifchanged fstat(%s)", from_name);
if (!changed && fstat(to_fd, &to_sb) < 0)
err(EX_OSERR, "moveifchanged fstat(%s)", to_name);
if (!changed && from_sb.st_size != to_sb.st_size)
changed++;
tsize = (size_t)from_sb.st_size;
if (!changed) {
p = mmap(NULL, tsize, PROT_READ, 0, from_fd, (off_t)0);
if ((long)p == -1)
err(EX_OSERR, "mmap %s", from_name);
q = mmap(NULL, tsize, PROT_READ, 0, to_fd, (off_t)0);
if ((long)q == -1)
err(EX_OSERR, "mmap %s", to_name);
changed = memcmp(p, q, tsize);
munmap(p, tsize);
munmap(q, tsize);
}
if (changed) {
if (rename(from_name, to_name) < 0)
err(EX_OSERR, "rename(%s, %s)", from_name, to_name);
} else {
if (unlink(from_name) < 0)
err(EX_OSERR, "unlink(%s, %s)", from_name);
}
#ifdef DIAG
if (changed)
printf("CHANGED! rename (%s, %s)\n", from_name, to_name);
else
printf("SAME! unlink (%s)\n", from_name);
#endif
return;
}

View File

@ -346,9 +346,9 @@ vector()
int dev_id;
FILE *fp;
fp = fopen(path("vector.h"), "w");
fp = fopen(path("vector.h.new"), "w");
if (fp == NULL) {
perror(path("vector.h"));
perror(path("vector.h.new"));
exit(1);
}
fprintf(fp, "/*\n");
@ -367,6 +367,7 @@ vector()
fprintf(fp, "\"\n\n");
fprintf(fp, "#define\tNR_DEVICES\t%d\n", dev_id);
(void) fclose(fp);
moveifchanged(path("vector.h.new"), path("vector.h"));
}
vector_devtab(fp, table, dev_idp)

View File

@ -608,9 +608,9 @@ i386_ioconf()
static char *old_d_name;
static char old_shandler[32 + 1];
fp = fopen(path("ioconf.c"), "w");
fp = fopen(path("ioconf.c.new"), "w");
if (fp == 0) {
perror(path("ioconf.c"));
perror(path("ioconf.c.new"));
exit(1);
}
fprintf(fp, "/*\n");
@ -622,9 +622,9 @@ i386_ioconf()
fprintf(fp, "#include \"ioconf.h\"\n");
fprintf(fp, "\n");
fprintf(fp, "#define C (caddr_t)\n");
fp1 = fopen(path("ioconf.h"), "w");
fp1 = fopen(path("ioconf.h.new"), "w");
if (fp1 == 0) {
perror(path("ioconf.h"));
perror(path("ioconf.h.new"));
exit(1);
}
fprintf(fp1, "/*\n");
@ -701,6 +701,8 @@ i386_ioconf()
fprintf(fp1, "\n");
fprintf(fp1, "#endif /* IOCONF_H */\n");
(void) fclose(fp1);
moveifchanged(path("ioconf.c.new"), path("ioconf.c"));
moveifchanged(path("ioconf.h.new"), path("ioconf.h"));
}
isa_biotab(fp, table)

View File

@ -150,9 +150,9 @@ makefile()
perror(line);
exit(1);
}
ofp = fopen(path("Makefile"), "w");
ofp = fopen(path("Makefile.new"), "w");
if (ofp == 0) {
perror(path("Makefile"));
perror(path("Makefile.new"));
exit(1);
}
fprintf(ofp, "KERN_IDENT=%s\n", raise(ident));
@ -234,6 +234,7 @@ makefile()
}
(void) fclose(ifp);
(void) fclose(ofp);
moveifchanged(path("Makefile.new"), path("Makefile"));
#ifdef notyet
if (warn_make_clean) {
printf("WARNING: Unknown options used (not in ../../conf/options or ./options.%s).\n", machinename);

View File

@ -66,6 +66,7 @@ do_swap(fl)
register struct file_list *fl;
{
FILE *fp;
char newswapname[80];
char swapname[80];
register struct file_list *swap;
dev_t dev;
@ -75,9 +76,10 @@ do_swap(fl)
return (fl->f_next);
}
(void) sprintf(swapname, "swap%s.c", fl->f_fn);
fp = fopen(path(swapname), "w");
(void) sprintf(newswapname, "swap%s.c.new", fl->f_fn);
fp = fopen(path(newswapname), "w");
if (fp == 0) {
perror(path(swapname));
perror(path(newswapname));
exit(1);
}
fprintf(fp, "#include <sys/param.h>\n");
@ -90,7 +92,7 @@ do_swap(fl)
*/
swap = fl->f_next;
if (swap == 0 || swap->f_type != SWAPSPEC) {
(void) unlink(path(swapname));
(void) unlink(path(newswapname));
fclose(fp);
return (swap);
}
@ -107,6 +109,7 @@ do_swap(fl)
fprintf(fp, "\n");
fprintf(fp, "void\nsetconf()\n{\n}\n");
fclose(fp);
moveifchanged(path(newswapname), path(swapname));
return (swap);
}