diff options
Diffstat (limited to 'src/cmd/cc/lex.c')
-rw-r--r-- | src/cmd/cc/lex.c | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/src/cmd/cc/lex.c b/src/cmd/cc/lex.c index 71cc89bf0..dba8ff634 100644 --- a/src/cmd/cc/lex.c +++ b/src/cmd/cc/lex.c @@ -88,7 +88,7 @@ void main(int argc, char *argv[]) { char **defs, *p; - int c, ndef; + int nproc, nout, i, c, ndef; ensuresymb(NSYMB); memset(debug, 0, sizeof(debug)); @@ -142,10 +142,51 @@ main(int argc, char *argv[]) print("usage: %cc [-options] files\n", thechar); errorexit(); } - if(argc > 1){ - print("can't compile multiple files\n"); + if(argc > 1 && systemtype(Windows)){ + print("can't compile multiple files on windows\n"); errorexit(); } + if(argc > 1 && !systemtype(Windows)) { + nproc = 1; + /* + * if we're writing acid to standard output, don't compile + * concurrently, to avoid interleaving output. + */ + if(((!debug['a'] && !debug['q'] && !debug['Q']) || debug['n']) && + (p = getenv("NPROC")) != nil) + nproc = atol(p); /* */ + c = 0; + nout = 0; + for(;;) { + Waitmsg *w; + + while(nout < nproc && argc > 0) { + i = fork(); + if(i < 0) { + print("cannot create a process\n"); + errorexit(); + } + if(i == 0) { + fprint(2, "%s:\n", *argv); + if (compile(*argv, defs, ndef)) + errorexit(); + exits(0); + } + nout++; + argc--; + argv++; + } + w = wait(); + if(w == nil) { + if(c) + errorexit(); + exits(0); + } + if(w->msg[0]) + c++; + nout--; + } + } if(argc == 0) c = compile("stdin", defs, ndef); @@ -160,7 +201,7 @@ main(int argc, char *argv[]) int compile(char *file, char **defs, int ndef) { - char *ofile; + char *ofile, incfile[20]; char *p, **av, opt[256]; int i, c, fd[2]; static int first = 1; @@ -195,6 +236,15 @@ compile(char *file, char **defs, int ndef) outfile = "/dev/null"; } + if(p = getenv("INCLUDE")) { + setinclude(p); + } else { + if(systemtype(Plan9)) { + sprint(incfile, "/%s/include", thestring); + setinclude(strdup(incfile)); + setinclude("/sys/include"); + } + } if (first) Binit(&diagbuf, 1, OWRITE); /* |