modifedTime.h
#ifndef MODIFIEDTIME_H #define MODIFIEDTIME_H #include <sys/types.h> #include <sys/stat.h> time_t modifedTime(char *path); #endif /* MODIFIEDTIME_H */
modifiedTime.c
modifiedTime以time_t返回文件最后一次修改的时间
#include "modifedTime.h" #include <sys/types.h> #include <sys/stat.h> #include <time.h> time_t modifedTime(char *path) { struct stat attr; if (stat(path, &attr) == 0) { return attr.st_mtime; } exit(1); return 0; }
doCommand.c
doCommand执行Unix命令,无异常返回true,否则false。
#include <stdlib.h> typedef enum { false, true } bool; bool doCommand(char *line) { if (system(line) == -1) { return false; } return true; }
hasChanged.c
hasChanged 接受“预编译文件:依赖1 依赖2 依赖3 …” 如有任何一个依赖比预编译更新,则返回true,如果预编译/依赖不存在,也返回true。
#include "modifedTime.h" #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #include <stdlib.h> typedef enum { false, true } bool; bool hasChanged(char *line) { //Compare the modification time of each depends with this. //If any of it's modification time is later than this. regenerate this. time_t this_last_modifed, depends_last_modifed; int i = 0; char str[100]; strcpy(str, line); char *pch; pch = strtok(str, ": "); long double start, end; FILE* fp; while (pch != NULL) { if (i == 0) { fp = fopen(pch, "r"); //if .o doesn't exist if (fp == NULL) return true; else { fclose(fp); this_last_modifed = modifedTime(pch); i++; } } else { fp = fopen(pch, "r"); if (fp == NULL) return true; fclose(fp); depends_last_modifed = modifedTime(pch); if (difftime(depends_last_modifed, this_last_modifed) > 0) { return true; } } pch = strtok(NULL, " \n"); } return false; }
spcMake.c
主程序接收一个-v用于显示执行的Unix命令
#include "modifedTime.h" #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> typedef enum { false, true } bool; main(int argC, char* argV[]) { FILE* fp; char buffer[511]; const char colon[] = ":"; bool verbose = false; bool execute = false; if (argC == 2) { if (strcmp(argV[1], "-v") == 0) verbose = true; else { printf("Option %s isn't supported", argV[1]); exit(1); } } else if (argC != 1) { printf("Error option"); exit(1); } fp = fopen("makefile", "r"); if (fp == NULL) { printf("Error: No makefile found. Exiting...\n"); exit(1); } while (fgets(buffer, 511, fp)) { if (buffer[0] == '\n') { execute = false; } if (execute) { if (verbose) printf("%s", buffer); if (!doCommand(buffer)) { printf("Error Excuting %s", buffer); exit(1); } } if (strstr(buffer, colon) != NULL) { if (hasChanged(buffer)) { execute = true; } } } fclose(fp); exit(0); }
makefile
doCommand.o: doCommand.c echo compiling doCommand gcc -c -o doCommand.o doCommand.c hasChanged.o: hasChanged.c echo compiling hasChanged gcc -c -o hasChanged.o hasChanged.c modifedTime.o: modifedTime.h modifedTime.c echo compiling modifedTime gcc -c -o modifedTime.o modifedTime.c spcMake: spcMake.c doCommand.c hasChanged.c modifiedTime.c modifiedTime.h spcMake.c echo compiling/linking prog gcc -o spcMake doCommand.c hasChanged.c modifedTime.c modifedTime.h spcMake.c
编译:
gcc -o spcMake doCommand.c hasChanged.c modifedTime.c modifedTime.h spcMake.c
[wpedon id=”461″ align=”center”]