⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 make.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *	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 + -