main.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #include "mk.h"
  2. #define MKFILE "mkfile"
  3. static char *version = "@(#)mk general release 4 (plan 9)";
  4. int debug;
  5. Rule *rules, *metarules;
  6. int nflag = 0;
  7. int tflag = 0;
  8. int iflag = 0;
  9. int kflag = 0;
  10. int aflag = 0;
  11. int uflag = 0;
  12. char *explain = 0;
  13. Word *target1;
  14. int nreps = 1;
  15. Job *jobs;
  16. Biobuf bout;
  17. Rule *patrule;
  18. void badusage(void);
  19. #ifdef PROF
  20. short buf[10000];
  21. #endif
  22. void
  23. main(int argc, char **argv)
  24. {
  25. Word *w;
  26. char *s, *temp;
  27. char *files[256], **f = files, **ff;
  28. int sflag = 0;
  29. int i;
  30. int tfd = -1;
  31. Biobuf tb;
  32. Bufblock *buf;
  33. Bufblock *whatif;
  34. /*
  35. * start with a copy of the current environment variables
  36. * instead of sharing them
  37. */
  38. Binit(&bout, 1, OWRITE);
  39. buf = newbuf();
  40. whatif = 0;
  41. USED(argc);
  42. for(argv++; *argv && (**argv == '-'); argv++)
  43. {
  44. bufcpy(buf, argv[0], strlen(argv[0]));
  45. insert(buf, ' ');
  46. switch(argv[0][1])
  47. {
  48. case 'a':
  49. aflag = 1;
  50. break;
  51. case 'd':
  52. if(*(s = &argv[0][2]))
  53. while(*s) switch(*s++)
  54. {
  55. case 'p': debug |= D_PARSE; break;
  56. case 'g': debug |= D_GRAPH; break;
  57. case 'e': debug |= D_EXEC; break;
  58. }
  59. else
  60. debug = 0xFFFF;
  61. break;
  62. case 'e':
  63. explain = &argv[0][2];
  64. break;
  65. case 'f':
  66. if(*++argv == 0)
  67. badusage();
  68. *f++ = *argv;
  69. bufcpy(buf, argv[0], strlen(argv[0]));
  70. insert(buf, ' ');
  71. break;
  72. case 'i':
  73. iflag = 1;
  74. break;
  75. case 'k':
  76. kflag = 1;
  77. break;
  78. case 'n':
  79. nflag = 1;
  80. break;
  81. case 's':
  82. sflag = 1;
  83. break;
  84. case 't':
  85. tflag = 1;
  86. break;
  87. case 'u':
  88. uflag = 1;
  89. break;
  90. case 'w':
  91. if(whatif == 0)
  92. whatif = newbuf();
  93. else
  94. insert(whatif, ' ');
  95. if(argv[0][2])
  96. bufcpy(whatif, &argv[0][2], strlen(&argv[0][2]));
  97. else {
  98. if(*++argv == 0)
  99. badusage();
  100. bufcpy(whatif, &argv[0][0], strlen(&argv[0][0]));
  101. }
  102. break;
  103. default:
  104. badusage();
  105. }
  106. }
  107. #ifdef PROF
  108. {
  109. extern etext();
  110. monitor(main, etext, buf, sizeof buf, 300);
  111. }
  112. #endif
  113. if(aflag)
  114. iflag = 1;
  115. usage();
  116. syminit();
  117. initenv();
  118. usage();
  119. /*
  120. assignment args become null strings
  121. */
  122. temp = 0;
  123. for(i = 0; argv[i]; i++) if(utfrune(argv[i], '=')){
  124. bufcpy(buf, argv[i], strlen(argv[i]));
  125. insert(buf, ' ');
  126. if(tfd < 0){
  127. temp = maketmp();
  128. if(temp == 0) {
  129. perror("temp file");
  130. Exit();
  131. }
  132. close(create(temp, OWRITE, 0600));
  133. if((tfd = open(temp, 2)) < 0){
  134. perror(temp);
  135. Exit();
  136. }
  137. Binit(&tb, tfd, OWRITE);
  138. }
  139. Bprint(&tb, "%s\n", argv[i]);
  140. *argv[i] = 0;
  141. }
  142. if(tfd >= 0){
  143. Bflush(&tb);
  144. LSEEK(tfd, 0L, 0);
  145. parse("command line args", tfd, 1);
  146. remove(temp);
  147. }
  148. if (buf->current != buf->start) {
  149. buf->current--;
  150. insert(buf, 0);
  151. }
  152. symlook("MKFLAGS", S_VAR, (void *) stow(buf->start));
  153. buf->current = buf->start;
  154. for(i = 0; argv[i]; i++){
  155. if(*argv[i] == 0) continue;
  156. if(i)
  157. insert(buf, ' ');
  158. bufcpy(buf, argv[i], strlen(argv[i]));
  159. }
  160. insert(buf, 0);
  161. symlook("MKARGS", S_VAR, (void *) stow(buf->start));
  162. freebuf(buf);
  163. if(f == files){
  164. if(access(MKFILE, 4) == 0)
  165. parse(MKFILE, open(MKFILE, 0), 0);
  166. } else
  167. for(ff = files; ff < f; ff++)
  168. parse(*ff, open(*ff, 0), 0);
  169. if(DEBUG(D_PARSE)){
  170. dumpw("default targets", target1);
  171. dumpr("rules", rules);
  172. dumpr("metarules", metarules);
  173. dumpv("variables");
  174. }
  175. if(whatif){
  176. insert(whatif, 0);
  177. timeinit(whatif->start);
  178. freebuf(whatif);
  179. }
  180. execinit();
  181. /* skip assignment args */
  182. while(*argv && (**argv == 0))
  183. argv++;
  184. catchnotes();
  185. if(*argv == 0){
  186. if(target1)
  187. for(w = target1; w; w = w->next)
  188. mk(w->s);
  189. else {
  190. fprint(2, "mk: nothing to mk\n");
  191. Exit();
  192. }
  193. } else {
  194. if(sflag){
  195. for(; *argv; argv++)
  196. if(**argv)
  197. mk(*argv);
  198. } else {
  199. Word *head, *tail, *t;
  200. /* fake a new rule with all the args as prereqs */
  201. tail = 0;
  202. t = 0;
  203. for(; *argv; argv++)
  204. if(**argv){
  205. if(tail == 0)
  206. tail = t = newword(*argv);
  207. else {
  208. t->next = newword(*argv);
  209. t = t->next;
  210. }
  211. }
  212. if(tail->next == 0)
  213. mk(tail->s);
  214. else {
  215. head = newword("command line arguments");
  216. addrules(head, tail, strdup(""), VIR, mkinline, 0);
  217. mk(head->s);
  218. }
  219. }
  220. }
  221. if(uflag)
  222. prusage();
  223. exits(0);
  224. }
  225. void
  226. badusage(void)
  227. {
  228. fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
  229. Exit();
  230. }
  231. void *
  232. Malloc(int n)
  233. {
  234. register void *s;
  235. s = malloc(n);
  236. if(!s) {
  237. fprint(2, "mk: cannot alloc %d bytes\n", n);
  238. Exit();
  239. }
  240. return(s);
  241. }
  242. void *
  243. Realloc(void *s, int n)
  244. {
  245. if(s)
  246. s = realloc(s, n);
  247. else
  248. s = malloc(n);
  249. if(!s) {
  250. fprint(2, "mk: cannot alloc %d bytes\n", n);
  251. Exit();
  252. }
  253. return(s);
  254. }
  255. void
  256. regerror(char *s)
  257. {
  258. if(patrule)
  259. fprint(2, "mk: %s:%d: regular expression error; %s\n",
  260. patrule->file, patrule->line, s);
  261. else
  262. fprint(2, "mk: %s:%d: regular expression error; %s\n",
  263. infile, mkinline, s);
  264. Exit();
  265. }