Blob
- Date:
- Message:
- mk: provide a mechanism to default to `rc` For cross-compiling plan9 from Unix, provide a way to force `mk` to use `rc` instead of `sh` without setting `MKSHELL` in individual `mkfile`s. If the environment variable `FORCERCFORMK` is set, `mk` will default to using `rc`, not `sh`. Signed-off-by: Dan Cross <cross@gajendra.net>
- Actions:
- History | Blame | Raw File
1 #include "mk.h"3 static Shell *shells[] = {4 &rcshell,5 &shshell6 };8 Shell *shelldefault = &shshell;10 Shell *shellt;11 Word *shellcmd;13 typedef struct Shellstack Shellstack;14 struct Shellstack15 {16 Shell *t;17 Word *w;18 Shellstack *next;19 };21 Shellstack *shellstack;23 char*24 setshell(Word *w)25 {26 int i;28 if(w->s == nil)29 return "shell name not found on line";31 for(i=0; i<nelem(shells); i++)32 if(shells[i]->matchname(w->s))33 break;34 if(i == nelem(shells))35 return "cannot determine shell type";36 shellt = shells[i];37 shellcmd = w;38 return nil;39 }41 void42 initshell(void)43 {44 if(getenv("FORCERCFORMK") != nil)45 shelldefault = &rcshell;46 shellcmd = stow(shelldefault->name);47 shellt = shelldefault;48 setvar("MKSHELL", shellcmd);49 }51 void52 pushshell(void)53 {54 Shellstack *s;56 /* save */57 s = Malloc(sizeof *s);58 s->t = shellt;59 s->w = shellcmd;60 s->next = shellstack;61 shellstack = s;63 initshell(); /* reset to defaults */64 }66 void67 popshell(void)68 {69 Shellstack *s;71 if(shellstack == nil){72 fprint(2, "internal shellstack error\n");73 Exit();74 }76 s = shellstack;77 shellstack = s->next;78 shellt = s->t;79 shellcmd = s->w;80 setvar("MKSHELL", shellcmd);81 free(s);82 }