📄 make.c
字号:
/* * Get the modification time of a file. If the first * doesn't exist, it's modtime is set to 0. */void modtime(np)struct name *np;{#ifdef unix struct stat info; int r; if (is_archive_ref(np->n_name)) { r = archive_stat(np->n_name, &info); } else { r = stat(np->n_name, &info); } if (r < 0) { if (errno != ENOENT) fatal("Can't open %s; error %d", np->n_name, errno); np->n_time = 0L; } else { np->n_time = info.st_mtime; np->n_flag |= N_EXISTS; }#endif#ifdef tos struct DOSTIME fm; int fd; if((fd=Fopen(np->n_name,0)) < 0) { np->n_time = 0L; } else { Fdatime(&fm,fd,0); Fclose(fd); np->n_time = mstonix((unsigned int)fm.date,(unsigned int)fm.time); np->n_flag |= N_EXISTS; }#endif#ifdef eon struct stat info; int fd; if ((fd = open(np->n_name, 0)) < 0) { if (errno != ER_NOTF) fatal("Can't open %s; error %02x", np->n_name, errno); np->n_time = 0L; } else if (getstat(fd, &info) < 0) fatal("Can't getstat %s; error %02x", np->n_name, errno); else { np->n_time = info.st_mod; np->n_flag |= N_EXISTS; } close(fd);#endif#ifdef os9 struct sgtbuf info; int fd; if ((fd = open(np->n_name, 0)) < 0) { if (errno != E_PNNF) fatal("Can't open %s; error %02x", np->n_name, errno); np->n_time = 0L; } else if (getmdate(fd, &info) < 0) fatal("Can't getstat %s; error %02x", np->n_name, errno); else { np->n_time = cnvtime(&info); np->n_flag |= N_EXISTS; } close(fd);#endif}/* * Update the mod time of a file to now. */void touch(np)struct name *np;{ char c; int fd; if (!domake || !silent) printf("touch(%s)\n", np->n_name); if (domake) {#ifdef unix struct utimbuf a; a.actime = a.modtime = time((time_t *)NULL); if (utime(np->n_name, &a) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name);#endif#ifdef tos struct DOSTIME fm; int fd; if((fd=Fopen(np->n_name,0)) < 0) { printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); } else { fm.date = Tgetdate(); fm.time = Tgettime(); Fdatime(&fm,fd,1); Fclose(fd); }#endif#ifdef eon if ((fd = open(np->n_name, 0)) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); else { uread(fd, &c, 1, 0); uwrite(fd, &c, 1); } close(fd);#endif#ifdef os9 /* * Strange that something almost as totally useless * as this is easy to do in os9! */ if ((fd = open(np->n_name, S_IWRITE)) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); close(fd);#endif }}/* * Recursive routine to make a target. */int make(np, level)struct name *np;int level;{ register struct depend *dp; register struct line *lp; register struct depend *qdp; time_t dtime = 0; bool dbgfirst = TRUE; char *basename = (char *) 0; char *inputname = (char *) 0; if (np->n_flag & N_DONE) { if(dbginfo) dbgprint(level,np,"already done"); return 0; } if (!(np->n_flag & N_EXISTS)) modtime(np); /* Gets modtime of this file */ if (rules) { for (lp = np->n_line; lp; lp = lp->l_next) if (lp->l_cmd) break; if (!lp) dyndep(np,&basename,&inputname); } if (!(np->n_flag & (N_TARG | N_EXISTS))) { fprintf(stderr,"%s: Don't know how to make %s\n", myname, np->n_name); if (conterr) { np->n_flag |= N_ERROR; if (dbginfo) dbgprint(level,np,"don't know how to make"); return 0; } else exit(1); } for (qdp = (struct depend *)0, lp = np->n_line; lp; lp = lp->l_next) { for (dp = lp->l_dep; dp; dp = dp->d_next) { if(dbginfo && dbgfirst) { dbgprint(level,np," {"); dbgfirst = FALSE; } make(dp->d_name, level+1); if (np->n_time < dp->d_name->n_time) qdp = newdep(dp->d_name, qdp); dtime = max(dtime, dp->d_name->n_time); if (dp->d_name->n_flag & N_ERROR) np->n_flag |= N_ERROR; if (dp->d_name->n_flag & N_EXEC ) np->n_flag |= N_EXEC; } if (!quest && (np->n_flag & N_DOUBLE) && (np->n_time < dtime || !( np->n_flag & N_EXISTS))) { execflag = FALSE; make1(np, lp, qdp, basename, inputname); /* free()'s qdp */ dtime = 0; qdp = (struct depend *)0; if(execflag) np->n_flag |= N_EXEC; } } np->n_flag |= N_DONE; if (quest) { time_t t; t = np->n_time; time(&np->n_time); return (t < dtime); } else if ((np->n_time < dtime || !( np->n_flag & N_EXISTS)) && !(np->n_flag & N_DOUBLE)) { execflag = FALSE; make1(np, (struct line *)0, qdp, basename, inputname); /* free()'s qdp */ time(&np->n_time); if ( execflag) np->n_flag |= N_EXEC; } else if ( np->n_flag & N_EXEC ) { time(&np->n_time); } if (dbginfo) { if(dbgfirst) { if(np->n_flag & N_ERROR) dbgprint(level,np,"skipped because of error"); else if(np->n_flag & N_EXEC) dbgprint(level,np,"successfully made"); else dbgprint(level,np,"is up to date"); } else { if(np->n_flag & N_ERROR) dbgprint(level,(struct name *)0,"} skipped because of error"); else if(np->n_flag & N_EXEC) dbgprint(level,(struct name *)0,"} successfully made"); else dbgprint(level,(struct name *)0,"} is up to date"); } } if (level == 0 && !(np->n_flag & N_EXEC)) printf("%s: '%s' is up to date\n", myname, np->n_name); if(basename) free(basename); return 0;}void make1(np, lp, qdp, basename, inputname)struct name *np;struct line *lp;register struct depend *qdp;char *basename;char *inputname;{ register struct depend *dp; if (dotouch) touch(np); else if (!(np->n_flag & N_ERROR)) { strcpy(str1, ""); if(!inputname) { inputname = str1; /* default */ if (ambigmac) implmacros(np,lp,&basename,&inputname); } setDFmacro("<",inputname); if(!basename) basename = str1; setDFmacro("*",basename); for (dp = qdp; dp; dp = qdp) { if (strlen(str1)) strcat(str1, " "); strcat(str1, dp->d_name->n_name); qdp = dp->d_next; free(dp); } setmacro("?", str1); setDFmacro("@", np->n_name); if (lp) /* lp set if doing a :: rule */ docmds1(np, lp); else docmds(np); }}void implmacros(np,lp, pbasename,pinputname)struct name *np;struct line *lp;char **pbasename; /* Name without suffix */char **pinputname;{ struct line *llp; register char *p; register char *q; register char *suff; /* Old suffix */ int baselen; struct depend *dp; bool dpflag = FALSE; /* get basename out of target name */ p = str2; q = np->n_name; suff = suffix(q); while ( *q && (q < suff || !suff)) *p++ = *q++; *p = '\0'; if ((*pbasename = (char *) malloc(strlen(str2)+1)) == (char *)0 ) fatal("No memory for basename",(char *)0,0); strcpy(*pbasename,str2); baselen = strlen(str2); if ( lp) llp = lp; else llp = np->n_line; while (llp) { for (dp = llp->l_dep; dp; dp = dp->d_next) { if( strncmp(*pbasename,dp->d_name->n_name,baselen) == 0) { *pinputname = dp->d_name->n_name; return; } if( !dpflag) { *pinputname = dp->d_name->n_name; dpflag = TRUE; } } if (lp) break; llp = llp->l_next; }#if NO_WE_DO_WANT_THIS_BASENAME free(*pbasename); /* basename ambiguous or no dependency file */ *pbasename = (char *)0;#endif return;}void dbgprint(level,np,comment)int level;struct name *np;char *comment;{ char *timep; if(np) { timep = ctime(&np->n_time); timep[24] = '\0'; fputs(&timep[4],stdout); } else fputs(" ",stdout); fputs(" ",stdout); while(level--) fputs(" ",stdout); if (np) { fputs(np->n_name,stdout); if (np->n_flag & N_DOUBLE) fputs(" :: ",stdout); else fputs(" : ",stdout); } fputs(comment,stdout); putchar((int)'\n'); fflush(stdout); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -