main.c 5.1 KB

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