1*98a68993SDavid du ColombierBEGIN{ 2*98a68993SDavid du Colombier oargc = 0; 3*98a68993SDavid du Colombier for(argc = 1; argc < ARGC; argc++){ 4*98a68993SDavid du Colombier if(ARGV[argc] !~ /^-.+/ || ARGV[argc] ~ /--/) 5*98a68993SDavid du Colombier break; 6*98a68993SDavid du Colombier if(ARGV[argc] != "-D") 7*98a68993SDavid du Colombier oargv[ARGV[argc]] = oargc++; 8*98a68993SDavid du Colombier else 9*98a68993SDavid du Colombier DEBUG = 1; 10*98a68993SDavid du Colombier ARGV[argc] = ""; 11*98a68993SDavid du Colombier } 12*98a68993SDavid du Colombier 13*98a68993SDavid du Colombier objtype = ENVIRON["objtype"]; 14*98a68993SDavid du Colombier 15*98a68993SDavid du Colombier while(getline > 0){ 16*98a68993SDavid du Colombier if(/^[ \t]*$/ || /^#/) 17*98a68993SDavid du Colombier continue; 18*98a68993SDavid du Colombier 19*98a68993SDavid du Colombier if(/^[^ \t]/){ 20*98a68993SDavid du Colombier #section[$1] = 0; 21*98a68993SDavid du Colombier tag = $1; 22*98a68993SDavid du Colombier } 23*98a68993SDavid du Colombier if(!tag) 24*98a68993SDavid du Colombier continue; 25*98a68993SDavid du Colombier sub(/^[ \t]*/, ""); 26*98a68993SDavid du Colombier line[tag, section[tag]++] = $0; 27*98a68993SDavid du Colombier } 28*98a68993SDavid du Colombier 29*98a68993SDavid du Colombier o = ""; 30*98a68993SDavid du Colombier if(!oargc || ("-mkdevlist" in oargv)){ 31*98a68993SDavid du Colombier s = mkdevlist(); 32*98a68993SDavid du Colombier if(!("-mkdevlist" in oargv) || (oargc > 1)) 33*98a68993SDavid du Colombier s = "DEVS=" s; 34*98a68993SDavid du Colombier o = o s "\n"; 35*98a68993SDavid du Colombier } 36*98a68993SDavid du Colombier if((!oargc || ("-mkmach" in oargv)) && (objtype in section)){ 37*98a68993SDavid du Colombier s = mkmach(); 38*98a68993SDavid du Colombier if(!("-mkmach" in oargv) || (oargc > 1)) 39*98a68993SDavid du Colombier s = "MACH=" s; 40*98a68993SDavid du Colombier o = o s "\n"; 41*98a68993SDavid du Colombier } 42*98a68993SDavid du Colombier if((!oargc || ("-mklib" in oargv)) && ("lib" in section)){ 43*98a68993SDavid du Colombier s = mklib(); 44*98a68993SDavid du Colombier if(!("-mklib" in oargv) || (oargc > 1)) 45*98a68993SDavid du Colombier s = "LIB=" s; 46*98a68993SDavid du Colombier o = o s "\n"; 47*98a68993SDavid du Colombier } 48*98a68993SDavid du Colombier if((!oargc || ("-mkport" in oargv) ) && ("port" in section)){ 49*98a68993SDavid du Colombier s = mkport(); 50*98a68993SDavid du Colombier if(!("-mkport" in oargv) || (oargc > 1)) 51*98a68993SDavid du Colombier s = "PORT=" s; 52*98a68993SDavid du Colombier o = o s "\n"; 53*98a68993SDavid du Colombier } 54*98a68993SDavid du Colombier if("dbgflg" in section){ 55*98a68993SDavid du Colombier for(i = 1; i < section["dbgflg"]; i++){ 56*98a68993SDavid du Colombier n = split(line["dbgflg", i], a); 57*98a68993SDavid du Colombier if(n < 2 || n > 4 || a[2] !~ /'[a-zA-Z]'/) 58*98a68993SDavid du Colombier continue; 59*98a68993SDavid du Colombier if(n > 2 && a[3] !~ /'[a-zA-Z]'/) 60*98a68993SDavid du Colombier continue; 61*98a68993SDavid du Colombier if(n == 4 && (a[4] < 1 || a[4] >= 128)) 62*98a68993SDavid du Colombier continue; 63*98a68993SDavid du Colombier dbgc[a[1]] = a[2]; 64*98a68993SDavid du Colombier if(n == 4) 65*98a68993SDavid du Colombier dbgflg[a[3]] = a[4]; 66*98a68993SDavid du Colombier else if(n == 3) 67*98a68993SDavid du Colombier dbgflg[a[3]] = 1; 68*98a68993SDavid du Colombier } 69*98a68993SDavid du Colombier } 70*98a68993SDavid du Colombier if((!oargc || ("-mkrules" in oargv)) && ("dir" in section)){ 71*98a68993SDavid du Colombier o = o mkrules(".", exists, a, c, "-I."); 72*98a68993SDavid du Colombier for(i = 1; i < section["dir"]; i++){ 73*98a68993SDavid du Colombier n = split(line["dir", i], a); 74*98a68993SDavid du Colombier dir = "../" a[1]; 75*98a68993SDavid du Colombier if(n == 1) 76*98a68993SDavid du Colombier a[2] = "-I."; 77*98a68993SDavid du Colombier s = a[2]; 78*98a68993SDavid du Colombier o = o mkrules(dir, exists, a, c, s); 79*98a68993SDavid du Colombier l = listolate(a, "|"); 80*98a68993SDavid du Colombier if(l != ""){ 81*98a68993SDavid du Colombier o = o "^(" l ")\\.$O:R: " dir "/\\1.s\n"; 82*98a68993SDavid du Colombier o = o "\t$AS $AFLAGS " s " " dir "/$stem1.s\n"; 83*98a68993SDavid du Colombier } 84*98a68993SDavid du Colombier l = listolate(c, "|"); 85*98a68993SDavid du Colombier if(l != ""){ 86*98a68993SDavid du Colombier o = o "^(" l ")\\.$O:R: " dir "/\\1.c\n"; 87*98a68993SDavid du Colombier o = o "\t$CC $CFLAGS " s " " dir "/$stem1.c\n"; 88*98a68993SDavid du Colombier } 89*98a68993SDavid du Colombier } 90*98a68993SDavid du Colombier } 91*98a68993SDavid du Colombier if((!oargc || ("-mkrootrules" in oargv)) && ("rootdir" in section)){ 92*98a68993SDavid du Colombier mkrootrules(name, cname, src); 93*98a68993SDavid du Colombier s = ARGV[argc] ".root.s:D:"; 94*98a68993SDavid du Colombier for(i = 1; i < section["rootdir"]; i++) 95*98a68993SDavid du Colombier s = s " " src[i]; 96*98a68993SDavid du Colombier s = s "\n\tmkrootall\\\n"; 97*98a68993SDavid du Colombier for(i = 1; i < section["rootdir"]; i++) 98*98a68993SDavid du Colombier s = s "\t\t" name[i] " " cname[i] " " src[i] "\\\n"; 99*98a68993SDavid du Colombier s = s "\t>$target\n"; 100*98a68993SDavid du Colombier if(section["rootdir"] > 1) 101*98a68993SDavid du Colombier o = o s; 102*98a68993SDavid du Colombier } 103*98a68993SDavid du Colombier if((!oargc || ("-mkrrrules" in oargv)) && ("rr" in section)){ 104*98a68993SDavid du Colombier n = split(line["rr", 0], a); 105*98a68993SDavid du Colombier if(n == 1) 106*98a68993SDavid du Colombier a[2] = ARGV[argc] ".proto"; 107*98a68993SDavid du Colombier s = "$CONF.rr:\tmkrr $CONF " a[2] "\n"; 108*98a68993SDavid du Colombier s = s "\tmkrr $CONF " a[2] "\n"; 109*98a68993SDavid du Colombier for(i = 1; i < section["rr"]; i++) 110*98a68993SDavid du Colombier s = s "$CONF.rr:\t" line["rr", i] "\n"; 111*98a68993SDavid du Colombier o = o s; 112*98a68993SDavid du Colombier } 113*98a68993SDavid du Colombier if("-mkdevc" in oargv) 114*98a68993SDavid du Colombier o = o mkdevc(); 115*98a68993SDavid du Colombier if("-mkerrstr" in oargv) 116*98a68993SDavid du Colombier o = o mkerrstr(); 117*98a68993SDavid du Colombier if("-mksystab" in oargv) 118*98a68993SDavid du Colombier o = o mksystab(); 119*98a68993SDavid du Colombier if("-mkbootconf" in oargv) 120*98a68993SDavid du Colombier o = o mkbootconf(); 121*98a68993SDavid du Colombier 122*98a68993SDavid du Colombier # 123*98a68993SDavid du Colombier # to do: 124*98a68993SDavid du Colombier # bootmkfile 125*98a68993SDavid du Colombier # mkrootall (can it be done at all?) 126*98a68993SDavid du Colombier # 127*98a68993SDavid du Colombier printf o; 128*98a68993SDavid du Colombier 129*98a68993SDavid du Colombier exit 0; 130*98a68993SDavid du Colombier} 131*98a68993SDavid du Colombier 132*98a68993SDavid du Colombierfunction mkbootconf( a, n, s, t, u, c, d, p, r){ 133*98a68993SDavid du Colombier s = "#include <u.h>\n"; 134*98a68993SDavid du Colombier s = s "#include <libc.h>\n\n"; 135*98a68993SDavid du Colombier s = s "#include \"../boot/boot.h\"\n\n"; 136*98a68993SDavid du Colombier s = s "Method method[] = {\n"; 137*98a68993SDavid du Colombier 138*98a68993SDavid du Colombier c = "0"; 139*98a68993SDavid du Colombier d = "#S/sdC0/"; 140*98a68993SDavid du Colombier p = "boot"; 141*98a68993SDavid du Colombier r = "/root"; 142*98a68993SDavid du Colombier 143*98a68993SDavid du Colombier for(i = 0; i < section["boot"]; i++){ # NOTE: start at 0 144*98a68993SDavid du Colombier n = split(line["boot", i], a); 145*98a68993SDavid du Colombier if(a[1] == "boot"){ 146*98a68993SDavid du Colombier if(a[2] == "cpu"){ 147*98a68993SDavid du Colombier c = "1"; 148*98a68993SDavid du Colombier if(n == 4 && a[3] == "boot") 149*98a68993SDavid du Colombier d = a[4]; 150*98a68993SDavid du Colombier } 151*98a68993SDavid du Colombier else if(a[2] == "rootdir" && n == 3) 152*98a68993SDavid du Colombier r = a[3]; 153*98a68993SDavid du Colombier else if(a[2] ~ /^(bboot|dosboot|romboot)$/){ 154*98a68993SDavid du Colombier c = "1"; 155*98a68993SDavid du Colombier p = a[2]; 156*98a68993SDavid du Colombier } 157*98a68993SDavid du Colombier else if(a[2] == "boot" && n == 3) 158*98a68993SDavid du Colombier d = a[3]; 159*98a68993SDavid du Colombier continue; 160*98a68993SDavid du Colombier } 161*98a68993SDavid du Colombier s = s "\t{ \"" a[1] "\", config" a[1] ", connect" a[1] ", "; 162*98a68993SDavid du Colombier t = "nil"; 163*98a68993SDavid du Colombier if(n > 1){ 164*98a68993SDavid du Colombier u = line["boot", i]; 165*98a68993SDavid du Colombier if(sub(/^[_A-Za-z][_A-Za-z0-9]*[ \t]*/, "", u)){ 166*98a68993SDavid du Colombier if(match(u, /^".*"$/)) 167*98a68993SDavid du Colombier u = substr(u, RSTART+1, RLENGTH-2); 168*98a68993SDavid du Colombier t = "\"" u "\""; 169*98a68993SDavid du Colombier } 170*98a68993SDavid du Colombier } 171*98a68993SDavid du Colombier s = s t ", },\n"; 172*98a68993SDavid du Colombier } 173*98a68993SDavid du Colombier s = s "\t{ nil },\n};\n\n"; 174*98a68993SDavid du Colombier s = s "int cpuflag = " c ";\n"; 175*98a68993SDavid du Colombier s = s "char* rootdir = \"" r "\";\n"; 176*98a68993SDavid du Colombier s = s "char* bootdisk = \"" d "\";\n"; 177*98a68993SDavid du Colombier s = s "extern void " p "(int, char**);\n\n"; 178*98a68993SDavid du Colombier s = s "void\nmain(int argc, char **argv)\n"; 179*98a68993SDavid du Colombier s = s "{\n\t" p "(argc, argv);\n}\n" 180*98a68993SDavid du Colombier 181*98a68993SDavid du Colombier t = "int (*cfs)(int) = 0;\n"; 182*98a68993SDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 183*98a68993SDavid du Colombier if($1 !~ /\/bin\/cfs$/) 184*98a68993SDavid du Colombier continue; 185*98a68993SDavid du Colombier t = "int (*cfs)(int) = cache;\n"; 186*98a68993SDavid du Colombier break; 187*98a68993SDavid du Colombier } 188*98a68993SDavid du Colombier s = s t; 189*98a68993SDavid du Colombier 190*98a68993SDavid du Colombier return s; 191*98a68993SDavid du Colombier} 192*98a68993SDavid du Colombier 193*98a68993SDavid du Colombierfunction mksystab( a, i, f, n, s, t){ 194*98a68993SDavid du Colombier s = "#include \"/sys/src/libc/9syscall/sys.h\"\n\n"; 195*98a68993SDavid du Colombier s = s "typedef void Syscall(Ar0*, va_list);\n\n"; 196*98a68993SDavid du Colombier 197*98a68993SDavid du Colombier t = ""; 198*98a68993SDavid du Colombier while(getline < "/sys/src/libc/9syscall/sys.h"){ 199*98a68993SDavid du Colombier if($1 != "#define" || NF != 3) 200*98a68993SDavid du Colombier continue; 201*98a68993SDavid du Colombier 202*98a68993SDavid du Colombier f = "sys" tolower($2); 203*98a68993SDavid du Colombier if($2 == "SYSR1") 204*98a68993SDavid du Colombier f = "sysr1"; 205*98a68993SDavid du Colombier if($2 == "RENDEZVOUS") 206*98a68993SDavid du Colombier n = "Rendez"; 207*98a68993SDavid du Colombier else if($2 == "BRK_") 208*98a68993SDavid du Colombier n = "Brk"; 209*98a68993SDavid du Colombier else 210*98a68993SDavid du Colombier n = substr($2, 1, 1) tolower(substr($2, 2)); 211*98a68993SDavid du Colombier 212*98a68993SDavid du Colombier s = s "Syscall " f ";\n"; 213*98a68993SDavid du Colombier t = t "\t[" $2 "]\t"; 214*98a68993SDavid du Colombier if(length($2) < 6) 215*98a68993SDavid du Colombier t = t "\t"; 216*98a68993SDavid du Colombier t = t "{ \"" n "\", " f ", "; 217*98a68993SDavid du Colombier # 218*98a68993SDavid du Colombier # if($1 ~ "(FVERSION|FSTAT|STAT)") 219*98a68993SDavid du Colombier # t = t "{ .u = 0 } },\n"; 220*98a68993SDavid du Colombier # else 221*98a68993SDavid du Colombier # 222*98a68993SDavid du Colombier if($1 ~ "(BIND|MOUNT|FWSTAT|WSTAT)") 223*98a68993SDavid du Colombier t = t "{ .l = 0 } },\n"; 224*98a68993SDavid du Colombier else if($1 ~ "(EXEC|RENDEZVOUS|SEGBRK|SEGATTACH)") 225*98a68993SDavid du Colombier t = t "{ .v = (void*)-1 } },\n"; 226*98a68993SDavid du Colombier else 227*98a68993SDavid du Colombier t = t "{ .i = -1 } },\n"; 228*98a68993SDavid du Colombier } 229*98a68993SDavid du Colombier if("syscall" in section){ 230*98a68993SDavid du Colombier for(i = 1; i < section["syscall"]; i++){ 231*98a68993SDavid du Colombier if(split(line["syscall", i], a) != 8) 232*98a68993SDavid du Colombier continue; 233*98a68993SDavid du Colombier if(line["syscall", i] !~ /#define.*{ \.[ilpuv] = .* }$/) 234*98a68993SDavid du Colombier continue; 235*98a68993SDavid du Colombier 236*98a68993SDavid du Colombier f = "sys" tolower(a[2]); 237*98a68993SDavid du Colombier n = substr(a[2], 1, 1) tolower(substr(a[2], 2)); 238*98a68993SDavid du Colombier 239*98a68993SDavid du Colombier s = s "\nSyscall " f ";\n"; 240*98a68993SDavid du Colombier t = t a[1] " " a[2] "\t" a[3] "\n\t[" a[2] "]\t"; 241*98a68993SDavid du Colombier if(length(a[2]) < 6) 242*98a68993SDavid du Colombier t = t "\t"; 243*98a68993SDavid du Colombier split(line["syscall", i], a, "{"); 244*98a68993SDavid du Colombier t = t "{ \"" n "\", " f ", {" a[2] " },\n"; 245*98a68993SDavid du Colombier } 246*98a68993SDavid du Colombier } 247*98a68993SDavid du Colombier s = s "struct {\n\tchar*\tn;\n\tSyscall*f;\n\tAr0\tr;\n}"; 248*98a68993SDavid du Colombier s = s " systab[] = {\n" t "};\n\nint nsyscall = nelem(systab);\n"; 249*98a68993SDavid du Colombier 250*98a68993SDavid du Colombier return s; 251*98a68993SDavid du Colombier} 252*98a68993SDavid du Colombier 253*98a68993SDavid du Colombierfunction mkerrstr( a, s){ 254*98a68993SDavid du Colombier FS="[ \t;]+"; 255*98a68993SDavid du Colombier while(getline < "error.h"){ 256*98a68993SDavid du Colombier split($0, a, /\/\* | \*\//); 257*98a68993SDavid du Colombier s = s $2 " " $3 " = \"" a[2] "\";\n"; 258*98a68993SDavid du Colombier } 259*98a68993SDavid du Colombier FS=" "; 260*98a68993SDavid du Colombier 261*98a68993SDavid du Colombier return s; 262*98a68993SDavid du Colombier} 263*98a68993SDavid du Colombier 264*98a68993SDavid du Colombierfunction mkdevc( a, d, i, m, n, s, t, u, name, cname){ 265*98a68993SDavid du Colombier s = "#include \"u.h\"\n"; 266*98a68993SDavid du Colombier s = s "#include \"lib.h\"\n"; 267*98a68993SDavid du Colombier s = s "#include \"mem.h\"\n"; 268*98a68993SDavid du Colombier s = s "#include \"dat.h\"\n"; 269*98a68993SDavid du Colombier s = s "#include \"fns.h\"\n"; 270*98a68993SDavid du Colombier s = s "#include \"error.h\"\n\n"; 271*98a68993SDavid du Colombier s = s "#include \"io.h\"\n\n"; 272*98a68993SDavid du Colombier 273*98a68993SDavid du Colombier t = ""; 274*98a68993SDavid du Colombier for(i = 1; i < section["dev"]; i++){ 275*98a68993SDavid du Colombier split(line["dev", i], a); 276*98a68993SDavid du Colombier s = s "extern Dev " a[1] "devtab;\n"; 277*98a68993SDavid du Colombier t = t "\t&" a[1] "devtab,\n"; 278*98a68993SDavid du Colombier d[a[1]]++; 279*98a68993SDavid du Colombier } 280*98a68993SDavid du Colombier s = s "Dev* devtab[] = {\n" t "\tnil,\n};\n\n"; 281*98a68993SDavid du Colombier 282*98a68993SDavid du Colombier mkrootrules(name, cname, m); 283*98a68993SDavid du Colombier t = ""; 284*98a68993SDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 285*98a68993SDavid du Colombier s = s "extern uchar " cname[i] "code[];\n"; 286*98a68993SDavid du Colombier s = s "extern usize " cname[i] "len;\n"; 287*98a68993SDavid du Colombier t = t "\taddbootfile(\"" name[i] "\", " cname[i] "code, " cname[i] "len);\n"; 288*98a68993SDavid du Colombier } 289*98a68993SDavid du Colombier for(i = 1; i < section["link"]; i++){ 290*98a68993SDavid du Colombier split(line["link", i], a); 291*98a68993SDavid du Colombier s = s "extern void " a[1] "link(void);\n"; 292*98a68993SDavid du Colombier t = t "\t" a[1] "link();\n"; 293*98a68993SDavid du Colombier } 294*98a68993SDavid du Colombier s = s "void\nlinks(void)\n{\n" t "}\n\n"; 295*98a68993SDavid du Colombier 296*98a68993SDavid du Colombier if("ip" in d && "ip" in section){ 297*98a68993SDavid du Colombier t = ""; 298*98a68993SDavid du Colombier s = s "#include \"../ip/ip.h\"\n"; 299*98a68993SDavid du Colombier for(i = 1; i < section["ip"]; i++){ 300*98a68993SDavid du Colombier split(line["ip", i], a); 301*98a68993SDavid du Colombier s = s "extern void " a[1] "init(Fs*);\n"; 302*98a68993SDavid du Colombier t = t "\t" a[1] "init,\n"; 303*98a68993SDavid du Colombier } 304*98a68993SDavid du Colombier s = s "void (*ipprotoinit[])(Fs*) = {\n" t "\tnil,\n};\n\n"; 305*98a68993SDavid du Colombier } 306*98a68993SDavid du Colombier 307*98a68993SDavid du Colombier if("sd" in d && "sd" in section){ 308*98a68993SDavid du Colombier t = ""; 309*98a68993SDavid du Colombier s = s "#include \"sd.h\"\n"; 310*98a68993SDavid du Colombier for(i = 1; i < section["sd"]; i++){ 311*98a68993SDavid du Colombier split(line["sd", i], a); 312*98a68993SDavid du Colombier s = s "extern SDifc " a[1] "ifc;\n"; 313*98a68993SDavid du Colombier t = t "\t&" a[1] "ifc,\n"; 314*98a68993SDavid du Colombier } 315*98a68993SDavid du Colombier s = s "SDifc* sdifc[] = {\n" t "\tnil,\n};\n\n"; 316*98a68993SDavid du Colombier } 317*98a68993SDavid du Colombier 318*98a68993SDavid du Colombier if("uart" in d && "uart" in section){ 319*98a68993SDavid du Colombier t = ""; 320*98a68993SDavid du Colombier for(i = 1; i < section["uart"]; i++){ 321*98a68993SDavid du Colombier split(line["uart", i], a); 322*98a68993SDavid du Colombier a[1] = substr(a[1], 5, length(a[1])-4) "physuart"; 323*98a68993SDavid du Colombier s = s "extern PhysUart " a[1] ";\n"; 324*98a68993SDavid du Colombier t = t "\t&" a[1] ",\n"; 325*98a68993SDavid du Colombier } 326*98a68993SDavid du Colombier s = s "PhysUart* physuart[] = {\n" t "\tnil,\n};\n\n"; 327*98a68993SDavid du Colombier } 328*98a68993SDavid du Colombier 329*98a68993SDavid du Colombier t = ""; 330*98a68993SDavid du Colombier n = 0; 331*98a68993SDavid du Colombier if("physseg" in section){ 332*98a68993SDavid du Colombier for(i = 1; i < section["physseg"]; i++){ 333*98a68993SDavid du Colombier u = line["physseg", i]; 334*98a68993SDavid du Colombier if(u ~ /^\.[_A-Za-z][_A-Za-z0-9]*/) 335*98a68993SDavid du Colombier t = t "\t"; 336*98a68993SDavid du Colombier t = t "\t" u "\n"; 337*98a68993SDavid du Colombier if(sub(/.*\.pgalloc.*=[^_A-Za-z]*/, "", u)){ 338*98a68993SDavid du Colombier if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){ 339*98a68993SDavid du Colombier u = substr(u, RSTART, RLENGTH); 340*98a68993SDavid du Colombier s = s "extern Page *(*" u ")(Segment*, uintptr);\n"; 341*98a68993SDavid du Colombier } 342*98a68993SDavid du Colombier } 343*98a68993SDavid du Colombier else if(sub(/.*\.pgfree.*=[^_A-Za-z]*/, "", u)){ 344*98a68993SDavid du Colombier if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){ 345*98a68993SDavid du Colombier u = substr(u, RSTART, RLENGTH); 346*98a68993SDavid du Colombier s = s "extern void (*" u ")(Page*);\n"; 347*98a68993SDavid du Colombier } 348*98a68993SDavid du Colombier } 349*98a68993SDavid du Colombier if(match(u, /}/)) 350*98a68993SDavid du Colombier n++; 351*98a68993SDavid du Colombier } 352*98a68993SDavid du Colombier } 353*98a68993SDavid du Colombier s = s "Physseg physseg[" n+8 "] = {\n"; 354*98a68993SDavid du Colombier s = s "\t{\t.attr\t= SG_SHARED,\n"; 355*98a68993SDavid du Colombier s = s "\t\t.name\t= \"shared\",\n"; 356*98a68993SDavid du Colombier s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n"; 357*98a68993SDavid du Colombier s = s "\t{\t.attr\t= SG_BSS,\n"; 358*98a68993SDavid du Colombier s = s "\t\t.name\t= \"memory\",\n"; 359*98a68993SDavid du Colombier s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n"; 360*98a68993SDavid du Colombier s = s t "};\nint nphysseg = " n+8 ";\n\n"; 361*98a68993SDavid du Colombier 362*98a68993SDavid du Colombier s = s "char dbgflg[256]"; 363*98a68993SDavid du Colombier t = ""; 364*98a68993SDavid du Colombier for(u in dbgflg) 365*98a68993SDavid du Colombier t = t "\t[" u "]\t" dbgflg[u] ",\n"; 366*98a68993SDavid du Colombier if(t != "") 367*98a68993SDavid du Colombier s = s " = {\n" t "}"; 368*98a68993SDavid du Colombier s = s ";\n\n"; 369*98a68993SDavid du Colombier 370*98a68993SDavid du Colombier for(i in m) 371*98a68993SDavid du Colombier delete m[i]; 372*98a68993SDavid du Colombier 373*98a68993SDavid du Colombier for(i = 1; i < section["misc"]; i++){ 374*98a68993SDavid du Colombier split(line["misc", i], a); 375*98a68993SDavid du Colombier m[a[1]] = line["misc", i]; 376*98a68993SDavid du Colombier } 377*98a68993SDavid du Colombier if("cache" in m){ 378*98a68993SDavid du Colombier s = s "extern void cinit(void);\n"; 379*98a68993SDavid du Colombier s = s "extern void copen(Chan*);\n"; 380*98a68993SDavid du Colombier s = s "extern int cread(Chan*, uchar*, int, vlong);\n"; 381*98a68993SDavid du Colombier s = s "extern void cupdate(Chan*, uchar*, int, vlong);\n"; 382*98a68993SDavid du Colombier s = s "extern void cwrite(Chan*, uchar*, int, vlong);\n\n"; 383*98a68993SDavid du Colombier s = s "void (*mfcinit)(void) = cinit;\n"; 384*98a68993SDavid du Colombier s = s "void (*mfcopen)(Chan*) = copen;\n"; 385*98a68993SDavid du Colombier s = s "int (*mfcread)(Chan*, uchar*, int, vlong) = cread;\n"; 386*98a68993SDavid du Colombier s = s "void (*mfcupdate)(Chan*, uchar*, int, vlong) = cupdate;\n"; 387*98a68993SDavid du Colombier s = s "void (*mfcwrite)(Chan*, uchar*, int, vlong) = cwrite;\n\n"; 388*98a68993SDavid du Colombier } 389*98a68993SDavid du Colombier else{ 390*98a68993SDavid du Colombier s = s "void (*mfcinit)(void) = nil;\n"; 391*98a68993SDavid du Colombier s = s "void (*mfcopen)(Chan*) = nil;\n"; 392*98a68993SDavid du Colombier s = s "int (*mfcread)(Chan*, uchar*, int, vlong) = nil;\n"; 393*98a68993SDavid du Colombier s = s "void (*mfcupdate)(Chan*, uchar*, int, vlong) = nil;\n"; 394*98a68993SDavid du Colombier s = s "void (*mfcwrite)(Chan*, uchar*, int, vlong) = nil;\n\n"; 395*98a68993SDavid du Colombier } 396*98a68993SDavid du Colombier if(!("rdb" in misc)){ 397*98a68993SDavid du Colombier s = s "void\n"; 398*98a68993SDavid du Colombier s = s "rdb(void)\n"; 399*98a68993SDavid du Colombier s = s "{\n"; 400*98a68993SDavid du Colombier s = s "\tsplhi();\n"; 401*98a68993SDavid du Colombier s = s "\tiprint(\"rdb...not installed\\n\");\n"; 402*98a68993SDavid du Colombier s = s "\tfor(;;);\n"; 403*98a68993SDavid du Colombier s = s "}\n\n"; 404*98a68993SDavid du Colombier } 405*98a68993SDavid du Colombier 406*98a68993SDavid du Colombier if("conf" in section){ 407*98a68993SDavid du Colombier for(i = 1; i < section["conf"]; i++) 408*98a68993SDavid du Colombier s = s line["conf", i] "\n"; 409*98a68993SDavid du Colombier s = s "\n"; 410*98a68993SDavid du Colombier } 411*98a68993SDavid du Colombier t = "."; 412*98a68993SDavid du Colombier while("pwd" | getline > 0){ 413*98a68993SDavid du Colombier if($0 ~ /^\//) 414*98a68993SDavid du Colombier t = $0; 415*98a68993SDavid du Colombier } 416*98a68993SDavid du Colombier s = s "char* conffile = \"" t "/" ARGV[argc] "\";\n"; 417*98a68993SDavid du Colombier s = s "ulong kerndate = KERNDATE;\n"; 418*98a68993SDavid du Colombier 419*98a68993SDavid du Colombier return s; 420*98a68993SDavid du Colombier} 421*98a68993SDavid du Colombier 422*98a68993SDavid du Colombierfunction mkrootrules(name, cname, src, a, i, n){ 423*98a68993SDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 424*98a68993SDavid du Colombier n = split(line["rootdir", i], a); 425*98a68993SDavid du Colombier if(n >= 2) 426*98a68993SDavid du Colombier name[i] = a[2]; 427*98a68993SDavid du Colombier else 428*98a68993SDavid du Colombier name[i] = a[1]; 429*98a68993SDavid du Colombier sub(/.*\//, "", name[i]); 430*98a68993SDavid du Colombier cname[i] = a[1]; 431*98a68993SDavid du Colombier gsub(/[^a-zA-Z0-9_]/, "_", cname[i]); 432*98a68993SDavid du Colombier src[i] = a[1]; 433*98a68993SDavid du Colombier } 434*98a68993SDavid du Colombier} 435*98a68993SDavid du Colombier 436*98a68993SDavid du Colombierfunction mkrules(dir, exists, ameta, cmeta, flags, f, i, s, t){ 437*98a68993SDavid du Colombier for(i in ameta) 438*98a68993SDavid du Colombier delete ameta[i]; 439*98a68993SDavid du Colombier for(i in cmeta) 440*98a68993SDavid du Colombier delete cmeta[i]; 441*98a68993SDavid du Colombier 442*98a68993SDavid du Colombier s = ""; 443*98a68993SDavid du Colombier while("cd " dir "; /bin/ls *.[cs]" | getline > 0){ 444*98a68993SDavid du Colombier if($0 !~ /^[A-Za-z0-9]*\.[cs]$/) 445*98a68993SDavid du Colombier continue; 446*98a68993SDavid du Colombier f = $0; 447*98a68993SDavid du Colombier if(!sub(/\.[cs]$/, "")) 448*98a68993SDavid du Colombier continue; 449*98a68993SDavid du Colombier if($0 in exists) 450*98a68993SDavid du Colombier continue; 451*98a68993SDavid du Colombier exists[$0] = dir; 452*98a68993SDavid du Colombier if(f ~ /\.c$/){ 453*98a68993SDavid du Colombier if(!($0 in dbgc)){ 454*98a68993SDavid du Colombier cmeta[$0]++; 455*98a68993SDavid du Colombier continue; 456*98a68993SDavid du Colombier } 457*98a68993SDavid du Colombier t = "$CC $CFLAGS " flags; 458*98a68993SDavid du Colombier } 459*98a68993SDavid du Colombier else{ 460*98a68993SDavid du Colombier if(!($0 in dbgc)){ 461*98a68993SDavid du Colombier ameta[$0]++; 462*98a68993SDavid du Colombier continue; 463*98a68993SDavid du Colombier } 464*98a68993SDavid du Colombier t = "$AS $AFLAGS " flags; 465*98a68993SDavid du Colombier } 466*98a68993SDavid du Colombier s = s $0 ".$O:\t" dir "/" f "\n"; 467*98a68993SDavid du Colombier s = s "\t" t " -D'_DBGC_='" dbgc[$0] "'' " dir "/" f "\n"; 468*98a68993SDavid du Colombier } 469*98a68993SDavid du Colombier return s; 470*98a68993SDavid du Colombier} 471*98a68993SDavid du Colombier 472*98a68993SDavid du Colombierfunction mkport( array){ 473*98a68993SDavid du Colombier arrayify(array, "port", "", ".$O", 1); 474*98a68993SDavid du Colombier 475*98a68993SDavid du Colombier return listolate(array, " "); 476*98a68993SDavid du Colombier} 477*98a68993SDavid du Colombier 478*98a68993SDavid du Colombierfunction mklib( array){ 479*98a68993SDavid du Colombier arrayify(array, "lib", "/$objtype/lib/", ".a", 1); 480*98a68993SDavid du Colombier 481*98a68993SDavid du Colombier return listolate(array," "); 482*98a68993SDavid du Colombier} 483*98a68993SDavid du Colombier 484*98a68993SDavid du Colombierfunction mkmach( a, i, s){ 485*98a68993SDavid du Colombier s = ""; 486*98a68993SDavid du Colombier for(i = 1; i < section[objtype]; i++){ 487*98a68993SDavid du Colombier if(!split(line[objtype, i], a)) 488*98a68993SDavid du Colombier continue; 489*98a68993SDavid du Colombier if(s == "") 490*98a68993SDavid du Colombier s = a[1] ".$O"; 491*98a68993SDavid du Colombier else 492*98a68993SDavid du Colombier s = s " " a[1] ".$O"; 493*98a68993SDavid du Colombier } 494*98a68993SDavid du Colombier 495*98a68993SDavid du Colombier return s; 496*98a68993SDavid du Colombier} 497*98a68993SDavid du Colombier 498*98a68993SDavid du Colombierfunction mkdevlist( a, array, i, j, n, s){ 499*98a68993SDavid du Colombier for(s in section){ 500*98a68993SDavid du Colombier if(line[s, 0] !~ /[ \t]\+dev[^_A-Za-z0-9]*/) 501*98a68993SDavid du Colombier continue; 502*98a68993SDavid du Colombier if(s == "dev") 503*98a68993SDavid du Colombier arrayify(array, s, "dev", ".$O", 1); 504*98a68993SDavid du Colombier else if(s == objtype) 505*98a68993SDavid du Colombier arrayify(array, s, "", ".$O", 0); 506*98a68993SDavid du Colombier else 507*98a68993SDavid du Colombier arrayify(array, s, "", ".$O", 1); 508*98a68993SDavid du Colombier } 509*98a68993SDavid du Colombier 510*98a68993SDavid du Colombier return listolate(array, " "); 511*98a68993SDavid du Colombier} 512*98a68993SDavid du Colombier 513*98a68993SDavid du Colombierfunction listolate(array, sep, a, s){ 514*98a68993SDavid du Colombier s = ""; 515*98a68993SDavid du Colombier for(a in array){ 516*98a68993SDavid du Colombier if(s == "") 517*98a68993SDavid du Colombier s = a; 518*98a68993SDavid du Colombier else 519*98a68993SDavid du Colombier s = a sep s; 520*98a68993SDavid du Colombier } 521*98a68993SDavid du Colombier 522*98a68993SDavid du Colombier return s; 523*98a68993SDavid du Colombier} 524*98a68993SDavid du Colombier 525*98a68993SDavid du Colombierfunction arrayify(array, tag, prefix, suffix, one, a, i, j, n){ 526*98a68993SDavid du Colombier for(i = 1; i < section[tag]; i++){ 527*98a68993SDavid du Colombier n = split(line[tag, i], a); 528*98a68993SDavid du Colombier if(one) 529*98a68993SDavid du Colombier array[prefix a[1] suffix]++; 530*98a68993SDavid du Colombier for(j = 2; j <= n; j++){ 531*98a68993SDavid du Colombier if(a[$j] ~ /[+=-].*/) 532*98a68993SDavid du Colombier continue; 533*98a68993SDavid du Colombier array[a[j] suffix]++; 534*98a68993SDavid du Colombier } 535*98a68993SDavid du Colombier } 536*98a68993SDavid du Colombier} 537