main.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. if((tfd = create(temp, ORDWR, 0600)) < 0){
  133. perror(temp);
  134. Exit();
  135. }
  136. Binit(&tb, tfd, OWRITE);
  137. }
  138. Bprint(&tb, "%s\n", argv[i]);
  139. *argv[i] = 0;
  140. }
  141. if(tfd >= 0){
  142. Bflush(&tb);
  143. LSEEK(tfd, 0L, 0);
  144. parse("command line args", tfd, 1);
  145. remove(temp);
  146. }
  147. if (buf->current != buf->start) {
  148. buf->current--;
  149. insert(buf, 0);
  150. }
  151. symlook("MKFLAGS", S_VAR, (void *) stow(buf->start));
  152. buf->current = buf->start;
  153. for(i = 0; argv[i]; i++){
  154. if(*argv[i] == 0) continue;
  155. if(i)
  156. insert(buf, ' ');
  157. bufcpy(buf, argv[i], strlen(argv[i]));
  158. }
  159. insert(buf, 0);
  160. symlook("MKARGS", S_VAR, (void *) stow(buf->start));
  161. freebuf(buf);
  162. if(f == files){
  163. if(access(MKFILE, 4) == 0)
  164. parse(MKFILE, open(MKFILE, 0), 0);
  165. } else
  166. for(ff = files; ff < f; ff++)
  167. parse(*ff, open(*ff, 0), 0);
  168. if(DEBUG(D_PARSE)){
  169. dumpw("default targets", target1);
  170. dumpr("rules", rules);
  171. dumpr("metarules", metarules);
  172. dumpv("variables");
  173. }
  174. if(whatif){
  175. insert(whatif, 0);
  176. timeinit(whatif->start);
  177. freebuf(whatif);
  178. }
  179. execinit();
  180. /* skip assignment args */
  181. while(*argv && (**argv == 0))
  182. argv++;
  183. catchnotes();
  184. if(*argv == 0){
  185. if(target1)
  186. for(w = target1; w; w = w->next)
  187. mk(w->s);
  188. else {
  189. fprint(2, "mk: nothing to mk\n");
  190. Exit();
  191. }
  192. } else {
  193. if(sflag){
  194. for(; *argv; argv++)
  195. if(**argv)
  196. mk(*argv);
  197. } else {
  198. Word *head, *tail, *t;
  199. /* fake a new rule with all the args as prereqs */
  200. tail = 0;
  201. t = 0;
  202. for(; *argv; argv++)
  203. if(**argv){
  204. if(tail == 0)
  205. tail = t = newword(*argv);
  206. else {
  207. t->next = newword(*argv);
  208. t = t->next;
  209. }
  210. }
  211. if(tail->next == 0)
  212. mk(tail->s);
  213. else {
  214. head = newword("command line arguments");
  215. addrules(head, tail, strdup(""), VIR, mkinline, 0);
  216. mk(head->s);
  217. }
  218. }
  219. }
  220. if(uflag)
  221. prusage();
  222. exits(0);
  223. }
  224. void
  225. badusage(void)
  226. {
  227. fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
  228. Exit();
  229. }
  230. void *
  231. Malloc(int n)
  232. {
  233. register void *s;
  234. s = malloc(n);
  235. if(!s) {
  236. fprint(2, "mk: cannot alloc %d bytes\n", n);
  237. Exit();
  238. }
  239. return(s);
  240. }
  241. void *
  242. Realloc(void *s, int n)
  243. {
  244. if(s)
  245. s = realloc(s, n);
  246. else
  247. s = malloc(n);
  248. if(!s) {
  249. fprint(2, "mk: cannot alloc %d bytes\n", n);
  250. Exit();
  251. }
  252. return(s);
  253. }
  254. void
  255. regerror(char *s)
  256. {
  257. if(patrule)
  258. fprint(2, "mk: %s:%d: regular expression error; %s\n",
  259. patrule->file, patrule->line, s);
  260. else
  261. fprint(2, "mk: %s:%d: regular expression error; %s\n",
  262. infile, mkinline, s);
  263. Exit();
  264. }