📄 file.c
字号:
If SIG is nonzero, this was caused by a fatal signal, meaning that a different message will be printed, and the message will go to stderr rather than stdout. */voidremove_intermediates (sig) int sig;{ register int i; register struct file *f; char doneany; if (question_flag || touch_flag) return; if (sig && just_print_flag) return; doneany = 0; for (i = 0; i < FILE_BUCKETS; ++i) for (f = files[i]; f != 0; f = f->next) if (f->intermediate && (f->dontcare || !f->precious) && !f->secondary) { int status; if (f->update_status == -1) /* If nothing would have created this file yet, don't print an "rm" command for it. */ continue; else if (just_print_flag) status = 0; else { status = unlink (f->name); if (status < 0 && errno == ENOENT) continue; } if (!f->dontcare) { if (sig) error (NILF, _("*** Deleting intermediate file `%s'"), f->name); else if (!silent_flag) { if (! doneany) { fputs ("rm ", stdout); doneany = 1; } else putchar (' '); fputs (f->name, stdout); fflush (stdout); } if (status < 0) perror_with_name ("unlink: ", f->name); } } if (doneany && !sig) { putchar ('\n'); fflush (stdout); }}/* For each dependency of each file, make the `struct dep' point at the appropriate `struct file' (which may have to be created). Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT, and various other special targets. */voidsnap_deps (){ register struct file *f, *f2; register struct dep *d; register int i; /* Enter each dependency name as a file. */ for (i = 0; i < FILE_BUCKETS; ++i) for (f = files[i]; f != 0; f = f->next) for (f2 = f; f2 != 0; f2 = f2->prev) for (d = f2->deps; d != 0; d = d->next) if (d->name != 0) { d->file = lookup_file (d->name); if (d->file == 0) d->file = enter_file (d->name); else free (d->name); d->name = 0; } for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev) for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) f2->precious = 1; for (f = lookup_file (".PHONY"); f != 0; f = f->prev) for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) { /* Mark this file as phony and nonexistent. */ f2->phony = 1; f2->last_mtime = (FILE_TIMESTAMP) -1; f2->mtime_before_update = (FILE_TIMESTAMP) -1; } for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev) { /* .INTERMEDIATE with deps listed marks those deps as intermediate files. */ for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) f2->intermediate = 1; /* .INTERMEDIATE with no deps does nothing. Marking all files as intermediates is useless since the goal targets would be deleted after they are built. */ } for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev) { /* .SECONDARY with deps listed marks those deps as intermediate files in that they don't get rebuilt if not actually needed; but unlike real intermediate files, these are not deleted after make finishes. */ if (f->deps) { for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) f2->intermediate = f2->secondary = 1; } /* .SECONDARY with no deps listed marks *all* files that way. */ else { int i; for (i = 0; i < FILE_BUCKETS; i++) for (f2 = files[i]; f2; f2= f2->next) f2->intermediate = f2->secondary = 1; } } f = lookup_file (".EXPORT_ALL_VARIABLES"); if (f != 0 && f->is_target) export_all_variables = 1; f = lookup_file (".IGNORE"); if (f != 0 && f->is_target) { if (f->deps == 0) ignore_errors_flag = 1; else for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) f2->command_flags |= COMMANDS_NOERROR; } f = lookup_file (".SILENT"); if (f != 0 && f->is_target) { if (f->deps == 0) silent_flag = 1; else for (d = f->deps; d != 0; d = d->next) for (f2 = d->file; f2 != 0; f2 = f2->prev) f2->command_flags |= COMMANDS_SILENT; } f = lookup_file (".POSIX"); if (f != 0 && f->is_target) posix_pedantic = 1;}/* Set the `command_state' member of FILE and all its `also_make's. */voidset_command_state (file, state) struct file *file; int state;{ struct dep *d; file->command_state = state; for (d = file->also_make; d != 0; d = d->next) d->file->command_state = state;}/* Get and print file timestamps. */FILE_TIMESTAMPfile_timestamp_now (){#if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME struct timespec timespec; if (clock_gettime (CLOCK_REALTIME, ×pec) == 0) return FILE_TIMESTAMP_FROM_S_AND_NS (timespec.tv_sec, timespec.tv_nsec);#endif return FILE_TIMESTAMP_FROM_S_AND_NS (time ((time_t *) 0), 0);}voidfile_timestamp_sprintf (p, ts) char *p; FILE_TIMESTAMP ts;{ time_t t = FILE_TIMESTAMP_S (ts); struct tm *tm = localtime (&t); if (tm) sprintf (p, "%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); else if (t < 0) sprintf (p, "%ld", (long) t); else sprintf (p, "%lu", (unsigned long) t); p += strlen (p); /* Append nanoseconds as a fraction, but remove trailing zeros. We don't know the actual timestamp resolution, since clock_getres applies only to local times, whereas this timestamp might come from a remote filesystem. So removing trailing zeros is the best guess that we can do. */ sprintf (p, ".%09ld", (long) FILE_TIMESTAMP_NS (ts)); p += strlen (p) - 1; while (*p == '0') p--; p += *p != '.'; *p = '\0';}/* Print the data base of files. */static voidprint_file (f) struct file *f;{ register struct dep *d; putchar ('\n'); if (!f->is_target) puts (_("# Not a target:")); printf ("%s:%s", f->name, f->double_colon ? ":" : ""); for (d = f->deps; d != 0; d = d->next) printf (" %s", dep_name (d)); putchar ('\n'); if (f->precious) puts (_("# Precious file (prerequisite of .PRECIOUS).")); if (f->phony) puts (_("# Phony target (prerequisite of .PHONY).")); if (f->cmd_target) puts (_("# Command-line target.")); if (f->dontcare) puts (_("# A default or MAKEFILES makefile.")); printf (_("# Implicit rule search has%s been done.\n"), f->tried_implicit ? "" : _(" not")); if (f->stem != 0) printf (_("# Implicit/static pattern stem: `%s'\n"), f->stem); if (f->intermediate) puts (_("# File is an intermediate prerequisite.")); if (f->also_make != 0) { fputs (_("# Also makes:"), stdout); for (d = f->also_make; d != 0; d = d->next) printf (" %s", dep_name (d)); putchar ('\n'); } if (f->last_mtime == 0) puts (_("# Modification time never checked.")); else if (f->last_mtime == (FILE_TIMESTAMP) -1) puts (_("# File does not exist.")); else { char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; file_timestamp_sprintf (buf, f->last_mtime); printf (_("# Last modified %s\n"), buf); } printf (_("# File has%s been updated.\n"), f->updated ? "" : _(" not")); switch (f->command_state) { case cs_running: puts (_("# Commands currently running (THIS IS A BUG).")); break; case cs_deps_running: puts (_("# Dependencies commands running (THIS IS A BUG).")); break; case cs_not_started: case cs_finished: switch (f->update_status) { case -1: break; case 0: puts (_("# Successfully updated.")); break; case 1: assert (question_flag); puts (_("# Needs to be updated (-q is set).")); break; case 2: puts (_("# Failed to be updated.")); break; default: puts (_("# Invalid value in `update_status' member!")); fflush (stdout); fflush (stderr); abort (); } break; default: puts (_("# Invalid value in `command_state' member!")); fflush (stdout); fflush (stderr); abort (); } if (f->variables != 0) print_file_variables (f); if (f->cmds != 0) print_commands (f->cmds);}voidprint_file_data_base (){ register unsigned int i, nfiles, per_bucket; register struct file *file; puts (_("\n# Files")); per_bucket = nfiles = 0; for (i = 0; i < FILE_BUCKETS; ++i) { register unsigned int this_bucket = 0; for (file = files[i]; file != 0; file = file->next) { register struct file *f; ++this_bucket; for (f = file; f != 0; f = f->prev) print_file (f); } nfiles += this_bucket; if (this_bucket > per_bucket) per_bucket = this_bucket; } if (nfiles == 0) puts (_("\n# No files.")); else { printf (_("\n# %u files in %u hash buckets.\n"), nfiles, FILE_BUCKETS);#ifndef NO_FLOAT printf (_("# average %.3f files per bucket, max %u files in one bucket.\n"), ((double) nfiles) / ((double) FILE_BUCKETS), per_bucket);#endif }}/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -