|
|
1.1 ! root 1: #!/usr/bin/awk -f ! 2: BEGIN { ! 3: files = "files"; ! 4: templ = "templ"; ! 5: # out = stdout; ! 6: if (ARGC == 2 && ARGV[1] == "-") # ugh ! 7: ARGC--; ! 8: if (ARGC < 2) { ! 9: printf "usage: %s pat ...\n", ARGV[0]; ! 10: exit ! 11: } ! 12: for (i = 1; i < ARGC; i++) ! 13: atags[ARGV[i]] = ARGV[i]; ! 14: rdfiles(files, atags); ! 15: putmake(templ, out); ! 16: exit ! 17: } ! 18: ! 19: # ! 20: # read the list of component files ! 21: # pick out the ones we care about ! 22: # return ! 23: # src array of source filenames ! 24: # obj array of objects ! 25: # typ array of types ! 26: # nf number of names in the above arrays ! 27: # to preserve order, the arrays are indexed by numbers ! 28: # ! 29: ! 30: func rdfiles(files, atags) ! 31: { ! 32: nf = 0; ! 33: while ((getline f <files) > 0) { ! 34: if (split(f, ff, ":[ \t]*") != 4) { ! 35: printf "bad files line: %s\n", f; ! 36: continue; ! 37: } ! 38: if (split(ff[4], tags, "[ \t]+") < 1) { ! 39: printf "bad files line: %s\n", f; ! 40: continue; ! 41: } ! 42: mat = 0; ! 43: for (t in tags) ! 44: if (atags[tags[t]] != "") { ! 45: mat = 1; ! 46: break; ! 47: } ! 48: if (mat == 0) ! 49: continue; ! 50: nf++; ! 51: obj[nf] = ff[1]; ! 52: src[nf] = ff[2]; # perhaps a list ! 53: typ[nf] = ff[3]; ! 54: } ! 55: for (i = 1; i < nf; i++) ! 56: allobj=allobj " " obj[i]; ! 57: } ! 58: ! 59: # ! 60: # read the template makefile ! 61: # scoop up the rules; ! 62: # spit out lists; ! 63: # copy the literal part; ! 64: # spit out rules for our files ! 65: # ! 66: ! 67: func putmake(templ, out) ! 68: { ! 69: while ((getline l <templ) > 0) { ! 70: if (l == "%%") ! 71: break; ! 72: if (l ~ /^#/) ! 73: continue; ! 74: if ((i = index(l, ":")) == 0) { ! 75: printf "bad line in template: %s\n", l; ! 76: continue; ! 77: } ! 78: t = substr(l, 1, i - 1); ! 79: rule = ""; ! 80: while ((getline r <templ) > 0) { ! 81: if (r == "") ! 82: break; ! 83: rule = rule "\n" r; ! 84: } ! 85: if (rules[t] != "") ! 86: printf "dup rule for %s ignored\n", t; ! 87: else { ! 88: rules[t] = rule; ! 89: extra[t] = substr(l, i + 1, length(l)); ! 90: } ! 91: } ! 92: print "FILES=" allobj # >out ! 93: while ((getline l <templ) > 0) ! 94: print l # >out ! 95: print # >out ! 96: for (i = 1; i < nf; i++) ! 97: if (rules[typ[i]] == "") ! 98: print obj[i] ": " src[i]; ! 99: else ! 100: print obj[i] ": " src[i] " " extra[typ[i]] rules[typ[i]]; ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.