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