##########################################################
# MG: A UNIX Tool to generate new MAKEFILES from
# shell commands
# A. Kumar, ATT-BL, CB-2454, 3C-291
# THIS TOOL IS NOT SUPPORTED at this time
# Sept. 1, 1988
# However, please send any suggestions/bugs/enhancements
# to me (cblph!ajy) for future generics.
##########################################################
###############################################################
# AT&T BELL LABS - PROPRIETARY #
# Use pursuant to company Instructions #
# This source code is a proprietary information of #
# AT&T and it is not for use or disclosure #
# outside company except written agreement. #
###############################################################
BEGIN {
#YOU COULD ADD to these lists for command recognition
#do not give full path names, only the name of the command
CC_cmds="cc m32cc m15cc m32ld ld ceccc cecc m4"
AR_cmds="ar m32ar"
CP_cmds="cp mv ln"
CPMV_cmds="cpmv move"
CHMOD_cmds="chmod"
STRIP_cmds="strip m32strip"
MKLN_cmds="mkln 3b2mkln"
PAT_cmds="ppmkpat nepat pat"
if (dl == "")
{
dl="_"
debug_level=0
}
else
{
debug_level=dl
}
#changing this debug level will print more stuff.
#this is for future debugging...
if (oOPT == 0)
{
format_slash=0
MAXPERLINE=50
}
else
{
format_slash=1
MAXPERLINE=oOPT
}
#change this variable to =1 for backslash output...
DSTYLE="ajy"
Style_new = 0
if (sOPT == 0) Style=DSTYLE
else if (sOPT == 1)
{
print "new style"
Style_new = 1
Style = sOPT
}
else
{
print "using default version! Bad Style=" sOPT
Style=DSTYLE
}
########################
if (mOPT <= 0) FUZZYMATCH=2
else
{
printf("FUZZYMATCH=%d", mOPT)
FUZZYMATCH=mOPT
}
#FUZZYMATCH=4
#how far in the line could an executable exist on $0
# for example
# + x cc will not be recoginized with FUZZYMATCH=2
# but
# x cc will be recoginixzed...
debug(1, "%s \n", "pass 1: begin", 0);
if (varfile == "") varfile="_"
if (invarfile == "" ) invarfile="_"
if (premakefile == "" ) premakefile="_"
#value TO define name/variable function
if (fv2n == "" ) fv2n="_"
NULL=""
#used by var_i,val_i arrays.
iIN=0
iCMD=0;
CMD = 0
var[CMD] = "COMMANDS"
Vmake="M"
iMAKE = 0
#edge list for include files (i,j)
# where i and j are include directories.
iEDGES = 0
# used by lib directory lists
iaEDGES = 0
resth["1"]=""
resta["1"]=""
resto["1"]=""
restc["1"]=""
iINCDIR=0
iLIBDIR=0
iCMD=0 #noof commands in the install script.
kCMD=0 #noof comamnds in the install script. insorder[1..kCMD]
CONINVAR="INSTDIR"
## if you have an initial list of vars, put in invar array.
#shell variables are input here,
XCMDNAME="CMD"
VXCMDNAME="VCMD"
resto["1"]=""
restc["1"]=""
iVAR++
#assert iVAR=1
PAT="PATTERNS" #hardcoded at .ALLlist #MAJOR KLUDGE
var[1]=PAT
val[1]=""
shenv();
varfill();
invarfill();
#lint files in LINTFILES
iVAR++
iLINT=iVAR
var[iLINT]="LINTFILES"
val[iLINT]=""
###test
}
END {
debug(1, "%s \n", "pass 2: begin", 0);
ts_makefile();
# build the variable list, typically install dirs INSTDIR1, ...and others
bld_invar();
#builds Sdep lines for SOURCE.a..etc. and also variables.
bld_SOURCE();
# build COMMAND and LIBxxx and LIBxxxFILES variables
# var is only concerned with variables and not with any install dirs
bld_var();
# build the dependency lines, such as .ALL:, a:: rules etc
bld_dep();
# print the above list
# print_invar MUST follow all bld's because all install directories not
# used are not printed by default
print_invar();
# build and print the SOURCE, .a lists
print_SOURCE();
# print the above
print_var();
print_dep();
# print the above dep lines
print_install2(); #print the install directory, after gathering common installs
# also, as a sideeffect generate .CMD options
print_CMD(); #print the .CMD command set
}
#chmod xxx tar tar tar ...
# j j+1 j+2
#strip tar tar tar ...
# j J+1
#mkln tar tar tar ...
# j j+1
{ #BEGIN OF MAIN PROGRAM
lmatch=0
debug(9, "L:%s\n", $0)
for (idi=1; ((idi<=FUZZYMATCH) && (idi <= NF)) ; idi++){
#global variable cmdtype is set by get_cmds.
debug(1, "idi=%d $idi=%s\n", idi, $idi);
cmd=get_cmds($idi)
if (cmd == "")
continue
#reaching here means command is recognized, get index
debug(1, "cmd=%s type=%s idi=%d\n", cmd, cmdtype, idi)
iindex=idi
if (cmdtype == "CC_cmds") {
call_CC_cmds($0, NF, cmd, cmdtype, iindex)
lmatch=1
break
}
else if (cmdtype == "AR_cmds") {
call_AR_cmds($0, NF, cmd, cmdtype, iindex)
lmatch=1
break
}
else if ((cmdtype == "CP_cmds") || (cmdtype=="CPMV_cmds")) {
call_CP_cmds($0, NF, cmd, cmdtype, iindex)
lmatch=1
break
}
else if ((cmdtype == "CHMOD_cmds") || (cmdtype == "STRIP_cmds") || (cmdtype == "MKLN_cmds") ) {
call_CH_cmds($0, NF, cmd, cmdtype, iindex)
lmatch=1
break
}
else if (cmdtype == "PAT_cmds" ) {
call_PAT_cmds($0, NF, cmd, cmdtype, iindex)
lmatch=1
break
}
else {
print "[internal error]" 1023394830498
debug(1, "internal error\n");
}
}#end of for loop for checking args..
if (lmatch == 0) {
#print "ignored:\n" $0
ignore($0)
}
} #END OF MAIN PROGRAM
#returns the actual command matched
#cmd from *_cmds arrays defined earlier
#GLOBALS:also cmdtype is set
function get_cmds(str, i,j,k,jj,ii,kk,arr,tmp)
{
debug(9, "get_cmds %s\n", str)
basename(str); bstr=base
dirname(str); dstr=dir
if (isin(CC_cmds, base) > 0 ) {
cmdtype="CC_cmds"
cmd=base
return(cmd)
}
if (isin(CP_cmds,base) > 0 ) {
cmdtype="CP_cmds"
cmd=base
return(cmd)
}
if (isin(CPMV_cmds, base) > 0 ) {
cmdtype="CPMV_cmds"
cmd=base
return(cmd)
}
if (isin(AR_cmds, base) > 0 ) {
cmdtype="AR_cmds"
cmd=base
return(cmd)
}
if (isin(CH_cmds, base) > 0 ) {
cmdtype="CH_cmds"
cmd=base
return(cmd)
}
if (isin(CHMOD_cmds, base) > 0 ) {
cmdtype="CHMOD_cmds"
cmd=base
return(cmd)
}
if (isin(STRIP_cmds, base) > 0 ) {
cmdtype="STRIP_cmds"
cmd=base
return(cmd)
}
if (isin(MKLN_cmds, base) > 0 ) {
cmdtype="MKLN_cmds"
cmd=base
return(cmd)
}
if (isin(PAT_cmds, base) > 0 ) {
cmdtype="PAT_cmds"
cmd=base
return(cmd)
}
cmd=""
cmdtype=""
return(cmd);
}#end of function 1
#/chmod / || /strip / m32strip or mkln
function call_CH_cmds(lin, nlin, cmd, cmdtype, iindex, i,j,k,arr,tmp,opt)
{
if (cmdtype == "CHMOD_cmds") {
opt=$(iindex+1)
starti=iindex+2
}
else if (cmdtype== "STRIP_cmds") {
opt=""
for (k=iindex+1; k<=NF; k++)
if ($(k) ~ /^\-.*/ )
opt=opt " " $(k)
else {
starti=k
break
}
}
else if (cmdtype == "MKLN_cmds") {
opt=$(iindex+1)
starti=iindex+1
}
debug(2, "cmd=%s opt=%s starti=%d\n", cmd, opt, starti)
for (k=starti; k <= NF; k++) {
tar = $(k)
#find if the target already exists?
#loop over targets :
if (tar in target) {
#this is a change on that target...
#must have an installation ?
basename(tar); src=base
#src= src is the ???
for(i=1; icmd[src,i]!=""; i++);
#KLUDGE : $(<) or $(>) find it from target.
if (src == tar)
direct = "$(>)"
else
direct = "$(<)"
icmd[src, i]=sprintf("\t %s %s %s", vcommand(cmd), opt, direct);
icmd[src, i+1] = "" #mark the end of list!
debug(1, "mod on target=%s icmd[%s,%d]\n", tar, src,i);
}
else if ((ic=destins(tar)) > 0 ) {
for(i=1; kcmd[ic, i]!=""; i++);
kcmd[ic, i] =sprintf("\t %s %s $(<)", vcommand(cmd), opt);
debug(1, "destins\n");
} else {
#now the object is neither in target list, nor in install list, so must
#be something not dependent on anything, need a ins[] line here?
if (cmdtype == "MKLN_cmds" ) {
val[iLINT]=val[iLINT] " " nbasename(any2ln(tar))
var_cnt[iLINT]++
spath(tar)
} else {
print "[NOTFOUND] confused at line:" $0 " target=? " tar
print "no dependency why have it in this makefile"
ignore($0)
} #mkln chk.
} #the last else
} # for all targets
} #e_o_f:call_CH_cmds
function call_CC_cmds(lin, nlin, cmd, cmdtype, iindex, i,j,k,arr,tmp,opt)
{
j=smatch($0, "-o")
if (j > 0) {
#this is a cc line with -o
debug(5, "cc -o line%s \n", $0)
tar=$(j+1)
if (tar ~ /^\.\/.*/ )
sub(/^\.\//,"",tar)
tar_in_ins(tar)
debug(5, "checked tarinins\n");
if (tar in target) {
print "ERROR: multiple target definition: " tar
ignore($0)
next
}
else {
target[tar] = tar
tlist = tlist " " tar
}
#convert all .o to .c
#also any .c's are put in the _cli list.
#side effects are to build .SOURCE.c,.o in future versions
dot_o2c($0)
cdep[tar] = _cli
#process any libraries
#side effects are to build .SOURCE.a (ok)
dot_as($0)
adep[tar] = _ali
#process any header file dependency
#side effects are to build .SOURCE (ok)
dot_Is($0)
dflags($0)
if (_Dli != "") {
print "(FLAG) rule"
#new dependency is here
Ddep[tar] = _Dli
}
} #end of -o processing
else { # this is a normal compilation, NO a.outs please
# usually -c option
dot_o2c($0)
dot_Is($0)
dflags($0)
if (_Dli != "") {
#gsf# print ".o : rule"
j1=smatch($0, "-c")
if (j1 > 0) {
#this is a cc line with -c
#may want to do a check if more .c on line
for(ii=1; ii<=NF; ii++) {
if (isc($ii) > 0 ) {
basename($ii); tar=base
gsub(/\.c$/,"",tar)
tar=tar ".o"
#gsf# print ".o " tar _Dli
target[tar] = tar
cdep[tar] = ""
adep[tar] = ""
Ddep[tar] = _Dli
}
}
#tar=
} else {
#gsf# print "what is =" $0
}
#new dependency is here
}
} #end of -c processing
debug(5, "exit:call_CC_cmds()\n");
}#e_o_f:CC_cmds
#if ($0 ~ /mv / || /cp / || /ln / || /move / || /cpmv / )
function call_CP_cmds(lin, nlin, cmd, cmdtype, iindex, i,j,k,arr,tmp,opt, kloop, command, src, dest, starti, ddest, dsrc, bdest, bsrc, opt, u)
{
command=cmd
j=iindex
if (cmdtype == "CP_cmds") {
src=$(j+1)
dest=$(j+2)
starti=j+2
}
if (cmdtype == "CPMV_cmds") {
src=$(j+1)
dest=$(j+5)
starti=j+5
}
opt=""
for(kloop=starti;kloop <= NF; kloop++) {
dest=$(kloop)
if (dest ~ /^\-.*/ ) {
opt=opt " " dest
continue
}
debug(1,"%s -> %s\n", src, dest);
basename(src);bsrc=base
dirname(src); dsrc=dir
#print bsrc "\ " dsrc
if (dsrc== "./") dsrc=""
if (tOPT == 1) { #test the destination direcotry
debug(7,"1: %s %s\n", dsrc, ddest);
if (isfile(dest) > 0) {
basename(dest); bdest= base
dirname(dest); ddest=dir
debug(7,"2: %s %s\n", dsrc, ddest);
} else {
bdest=bsrc
ddest=dest
print "WARNING: destination is a dir=" dest
}
} else { #donot test any directories, assume fullpath name
basename(dest); bdest= base
dirname(dest); ddest=dir
debug(7,"3: %s %s\n", dsrc, ddest);
}
if (ddest== "./") ddest=""
if (ddest ~ /^\.\/.*/) {
sub(/^\.\//,"", ddest)
}
if ((bdest== ".") || (bdest == "") || (bdest == " ") ) bdest=bsrc
debug(7,"8: %s %s\n", dsrc, ddest);
kCMD++;
#check to see if bsrc is built here, and any precommands exist.
#such as a m32strip, chmod etc.
if (icmd[bsrc,1] != "" ) {
print "bsrc was modified"
for(u=1; icmd[bsrc, u]!=""; u++) {
for(k=1; kcmd[kCMD,k]!=""; k++);
kcmd[kCMD,k] = icmd[bsrc,u];
#print "putting:" icmd[bsrc,u] " TO " k
}
for(u=1; icmd[bsrc,u]!=""; u++)
icmd[bsrc,u]="" #empty it out
}
#call subinvar simply to increment the count, to make sure these
# variables are used...
debug(7,"sub: %s %s\n", dsrc, ddest);
subinvar(dsrc); subinvar(ddest);
ins[dsrc, bsrc, ddest, bdest] = kCMD
insorder[kCMD]=dsrc SUBSEP bsrc SUBSEP ddest SUBSEP bdest
instype[kCMD]="install"
#print "insorder" kCMD " {}-"insorder[kCMD]
for(k=1; kcmd[kCMD,k]!=""; k++);
if (cmdtype == "CPMV_cmds")
kcmd[kCMD,k] = sprintf("\t %s $(>) %s %s %s $(<)",
vcommand(command), $(j+2), $(j+3), $(j+4));
else if (cmdtype == "CP_cmds" )
kcmd[kCMD,k] = sprintf("\t %s $(>) $(<)",
vcommand(command) )
else {
plogic("arrr!WHATCMD");
debug(1, "failed terribly %s\n", cmdtype);
}
instdir[ddest]=""
} #for loop for each destination
} #e_o_f:CP_cmds
#/ar /
function call_AR_cmds(lin, nlin, cmd, cmdtype, iindex, i,j,k,arr,tmp,opt, kloop, command, src, dest, starti, ddest, dsrc, bdest, bsrc, opt, u,jj)
{
j=iindex
tar=$(j+2)
if (tar in target) {
#print "Warning:multiple archive (ar) target: " tar
dot_o2c($0)
chklist = _cli
x=split(chklist, arr, " ")
if (x > 0 ) {
for (jj=1; jj<=x; jj++)
if (isin(cdep[tar], arr[jj]) < 0) {
newstr=cdep[tar] " " arr[jj]
cdep[tar] = newstr
}
}
} else {
target[tar]=tar
#AR command processing, build the list
dot_o2c($0)
cdep[tar] = _cli
}
}#e_o_f:AR_cmds
function call_PAT_cmds(lin, nlin, cmd, cmdtype, iindex, i,j,k,arr,tmp,opt)
{
cin="";
cout="";
find_in_out($0)
debug(1, "in=%s out=%s\n", cin , cout)
rule_pat($0, cmd, iindex)
}
function ignore(thisline)
{
print "note " thisline
}
function print_CMD(s, ar, cmd, ic)
{
for (s in cmdl) {
printf("\n\n")
cmd=sprintf(".CMD.%d",cmdl[s])
printf("%s : .USE\n", cmd)
split(s, ar, "/")
printf("\tcpmv $(>) %s %s %s $(<)", ar["1"], ar["2"], ar["3"])
printf("\n")
}
for (s in ccmdl) {
printf("\n\n")
printf(".CMD.%d : .USE\n", s)
ic = ccmdl[s] # the iindex for some icmd arrary
for(k=1; icmd[ic,k]!=""; k++)
printf("%s\n", icmd[ic,k]) ;
}
for (s in kcmdl) {
ic = kcmdl[s] # the index for some icmd arrary
#print "s="s "ic="ic
if (s in normal_kkcmd) {
printf("\n\n")
printf(".%s.%d : .USE\n",XCMDNAME, s)
for(k=1; kcmd[ic,k]!=""; k++)
printf("%s\n", kcmd[ic,k]) ;
}else;
#print "not used"
}
for (s in kcmdl) {
ic = kcmdl[s] # the index for some icmd arrary
#print "s="s "ic="ic
if (s in virtual_kkcmd) {
printf("\n\n")
printf(".%s.%d : .USE\n",VXCMDNAME, s)
for(k=1; kcmd[ic,k]!=""; k++)
printf("%s\n", vircnv(kcmd[ic,k]) ) ;
}else ;
#print "not used"
}
}
#prints the SOURCE.h, .a lists
function bld_SOURCE()
{
top_sort("Check: INCLUDE directory list in SOURCE.h", snode, enode, iEDGES);
hdrlist = _SOURCEh
notonlist(hdrlist, incdir, iINCDIR, resth)
if ((hdrlist == "" ) && (resth["1"] == "" ) )
#dont print SOURCE.h
#print "empty SOURCE.h"
#noop();
Sdeph=""
else {
# printf(".SOURCE.h:%s %s\n\n", v2(hdrlist), v2(resth["1"]))
Sdeph=sprintf(".SOURCE.h:%s %s\n\n", v2(hdrlist), v2(resth["1"]))
}
top_sort("Check: LIB directory in SOURCE.a", sanode, eanode, iaEDGES);
hdrlist = _SOURCEh
debug(1,"hdr=%s", hdrlist);
notonlist(hdrlist, libdir, iLIBDIR, resta)
if ((hdrlist == "" ) && (resta["1"] == "" ) )
#dont print SOURCE.h
#print "empty SOURCE.a"
#noop();
Sdepa=""
else
#printf(".SOURCE.a:%s %s\n\n", v2(hdrlist), v2(resta["1"]))
Sdepa=sprintf(".SOURCE.a:%s %s\n\n", v2(hdrlist), v2(resta["1"]))
top_sort("Check: OBJ directory in SOURCE.o", sonode, eonode, ioEDGES);
hdrlist = _SOURCEh
notonlist(hdrlist, objdir, iOBJDIR, resto)
if ((hdrlist == "" ) && (resto["1"] == "" ) )
#dont print SOURCE.h
#print "empty SOURCE.a"
#noop();
Sdepo=""
else
Sdepo=sprintf(".SOURCE.o:%s %s\n\n", v2(hdrlist), v2(resto["1"]))
#printf(".SOURCE.o:%s %s\n\n", v2(hdrlist), v2(resta["1"]))
top_sort("Check: .c directory list in SOURCE.c", sonode, eonode, ioEDGES);
hdrlist = _SOURCEh
notonlist(hdrlist, dotcdir, iDOTCDIR, restc)
if ((hdrlist == "" ) && (restc["1"] == "" ) )
#dont print SOURCE.h
#print "empty SOURCE.a"
#noop();
Sdepc=""
else
Sdepc=sprintf(".SOURCE.c:%s %s\n\n", v2(hdrlist), v2(restc["1"]))
#printf(".SOURCE.c:%s %s\n\n", v2(hdrlist), v2(restc["1"]))
}
function print_SOURCE()
{
if (Sdeph != "")
printf("%s", Sdeph)
if (Sdepa != "")
printf("%s", Sdepa)
if (Sdepc != "")
printf("%s", Sdepc)
if (Sdepo != "")
printf("%s", Sdepo)
}
#print install directory variable names
function print_invar(vardir)
{
for (vardir in invar ) {
if (vardir in noprintvar) { #if on this list of donotprint
debug(5,"noprint: %s\n", vardir)
continue
}
if (invar_cnt[vardir] <= 0 ){
debug(5, "nouse: %s\n", vardir)
continue
}
if (invar[vardir] == "" )
printf("%s=%s\n", vardir, "./") ;
else
printf("%s=%s\n", vardir, invar[vardir]) ;
}
printf("\n") ;
}
function bld_invar(i,j,dir, found)
{
#instdir[dir(path] = VAR
#invar[VAR] = val
#generate a define, and assign it
#longest common substring, number of times used etc.
for (dir in instdir ) {
xdir=dir
found=0
for (vardir in invar)
if (dir == invar[vardir] ){
#print "1"
found=1
}
else if (dir"/" == invar[vardir] ) {
#print "2"
found=1
}
else if (compress(xdir) == invar[vardir] ) {
#print "3"
found=1
}
else if (dir != subinvar(dir) ) {
#print "v sub match" dir "->" subinvar(dir)
found=1
}
#either found or not found
if (found == 0 ) { #not found, build a new name
iINVAR++
newvar = sprintf("%s%s",CONINVAR, iINVAR);
invar[newvar] = compress(dir)
invar_cnt[newvar]++
# instdir[dir] = compress(newvar)
debug(6, " new var %s%s=%s\n", CONINVAR, iINVAR, dir);
} else
invar_cnt[vardir]++
#instdir[dir] = vardir
} # for
}
#add a new invar[xx] = dir type variable ...
function add_invar(dir, i,j,dir, found)
{
found=0
for (vardir in invar)
if (dir == invar[vardir] )
found=1
#either found or not found
if (found == 0 ) { #not found, build a new name
iINVAR++
newvar = sprintf("%s%s",CONINVAR, iINVAR);
invar[newvar] = compress(dir)
# instdir[dir] = newvar
debug(6, "new var %s%s=%s\n", CONINVAR, iINVAR, dir);
} else
#instdir[dir] = vardir
}
#version 2.0 nmake install uses an explicit install: dependency rule
# print_install2( i,j, dir, found[A#version 2.0 nmake install uses an explicit install: dependency r
function print_install2( i,j, dir, found, vardir, ic, nm)
{
debug(5, "install2: enter\n");
#first build install: dependency line
#next print each specific dependency line as a .CMD command
#may be in future combine all installdirectories as one variable.
#in ins, all extra commands.
install_list = install_list " " v_install_list
for (iorder=1; iorder<=kCMD ; iorder++) {
jj=insorder[iorder] #jj is the unique install option
itype = instype[iorder]
jjn = split(jj, arr, SUBSEP);
debug(9, "jj=%s\n", jj);
dir = arr["3"]
#AJYBLANK printf("\n");
nm=subinvar(dir);
if (dir != nm ) {
#print "sub: " dir " -> " nm
found=1
myvardir=compress(nm) #removes "//" etc.
}
else
{
found=0
for (vardir in invar)
if (invar[vardir] == dir)
#KLUDGE (compress(invar[vardir]) == compress(dir))
{
print "FOUND" vardir ":"dir":" invar[vardir]
if ((dir == "") || (dir== "./") )
myvardir=""
else
myvardir="$("vardir ")"
found = 1
invar_cnt[vardir]++
break;
}
if (found ==1)
print ".." myvardir
}
if ((myvardir == "") || (myvardir == "./") )
pmyvardir=""
else
pmyvardir= compress(myvardir) "/"
debug(9, "install2:pmy=%s b=%s\n", pmyvardir, arr["4"])
if ((found == 1) && (itype == "install" ) ) {
if ((Style_new==1) &&(virtual_ins[iorder]==1) )
install_list=install_list " " virtual_n(pmyvardir,arr["4"], arr["2"])
else
install_list=install_list " " pmyvardir arr["4"]
#install_list=install_list " $("tayvardir")/"arr["4"]
#printf("\nINSTALLDIR=$(%s)\n", myvardir)
} else {
;
#print "WARNING: empty install: rule"
}
#print "LOGIC ERROR:call author immediately"
#printf("\nINSTALLDIR=%s\n", dir)
# now we have the install line
# now find the actual load line
if (itype=="pattern") { #KLUDGE =i="" {
if ((arr["1"] == "") || (arr["1"] == "./") || (arr["1"] == "." ) ) #no sub
printf("%s : %s", arr["4"], arr["2"]) ;
else
printf("%s : %s", arr["4"], subinvar(arr["1"] "/" arr["2"]) ) ;
}
if ((itype == "install") && (Style_new == 1) && (virtual_ins[iorder]==1) ) {
if ((arr["1"] == "") || (arr["1"] == "./") ) #no sub
printf("%s : %s%s", virtual_g(pmyvardir, arr["4"], arr["2"]), pmyvardir, arr["4"] ) ;
else
printf("%s : %s", virtual_g(pmyvardir, arr["4"], arr["2"]), compress(subinvar(arr["1"]) "/" arr["2"]) ) ;
}
if (((itype == "install") && (Style_new != 1) ) || ((Style_new==1) && (virtual_ins[iorder] != 1) && (itype== "install" )) ) {
if ((arr["1"] == "") || (arr["1"] == "./") ) #no sub
printf("%s%s : %s",pmyvardir, arr["4"], arr["2"] ) ;
else
printf("%s%s : %s", pmyvardir, arr["4"], compress(subinvar(arr["1"]) "/" arr["2"]) ) ;
}
kkcmd = ins[jj]
ic = getkcmdi(kkcmd);
if ((Style_new==1) && (virtual_ins[iorder] == 1) ) {
printf(" .%s.%d",VXCMDNAME, ic) ;
printf(" .VIRTUAL\n") ;
virtual_kkcmd[ic]=1
} else {
normal_kkcmd[ic]=1
printf(" .%s.%d",XCMDNAME, ic) ;
printf("\n") ;
}
}
#now the install line:
if (format_slash == 0) { #this is
printf("\ninstall: %s\n", install_list) ;
} else {
printf("\ninstall: \\\n") ;
nl(install_list) ;
}
}
function print_install( i,j, dir, found, vardir, ic)
{
print "&*^%$#FATAL ERROR : nosuchfunction exists"
}
function print_dep(tar, i)
{
for (i=0; i<=iDEP; i++)
if ((ldep[i] != "") && (COMD[ldep[i]] != 1) && (iso(ldep[i]) <= 0) )
ALLlist = ALLlist " " ldep[i]
#gsf# if ((val[CMD] != "") && (COMD[ldep[i]] != 1))
#gsf# ALLlist = ALLlist " $(COMMANDS) "
#MAJOR KLUDGE::
if ((var[1] == PAT) && (val[1] != "") ) {
ALLlist = ALLlist " $(PATTERNS) "
}
for (i=0; i<=iDEP; i++)
if (ldep[i] != "" && rdep[i] !~ "(.*)") {
#distinguish between :: and : rules
if (iso(ldep[i]) > 0 )
operator=":"
else
operator="::"
if (format_slash==0) { #hello
printf("%s %s %s %s\n\n", ldep[i],
f_ldep_more(i),
operator, rdep[i])
} else {
#use "backslash for formatting.
printf("%s %s %s \\\n", ldep[i],
f_ldep_more(i), operator )
nl(rdep[i])
}
}
if (val[iLINT]!="") {
printf("slint: %s\n\n", "$(" var[iLINT] ")" ) ;
print "WARNING: following rule be defined:"
print " *.ln : *.c "
print " mkln $(>) "
}
for (i=0; i<=viDEP; i++)
if (vldep[i] != "" ) {
printf("%s : %s .VIRTUAL\n", vldep[i], vrdep[i]) ;
basename(vrdep[i])
for (j=1; icmd[base, j] != ""; j++)
printf("%s\n", vircnv(icmd[base,j]) );
}
}
#builds dep lines
#uses global lists
function bld_dep( i, tar, tmp, blib, jj, jjn, arr, tmp,iorder)
{
for (tar in target)
if (isa(tar) > 0) {
blib = tar
sub(/\.a/, "", blib)
sub("^lib","", blib)
i = ivar[tar]
iDEP++
ldep[iDEP] = "$(" var[i] ")"
rdep[iDEP] = val[i+1] #KLUDGE : i+1 is libfiles.
} else {
# a command from .c,.o
#i = ivar[tar]
iDEP++
ldep[iDEP] = subinvar(tar)
rdep[iDEP] = cdep[tar] " " adep[tar] " " Ddep[tar]
COMD[subinvar(tar)]=1
basename(tar)
#XAJY print tar "**" base "***" icmd[tar,1]
if (icmd[base,1] != "") {
viDEP++
print "NEED A VIRTUAL=%s", base
vldep[viDEP] = "VV_"base
vrdep[viDEP] = ldep[iDEP]
v_install_list = v_install_list " " vldep[viDEP]
}
}
#XAJY for(i=0;i<=iDEP; i++) print i"="ldep[i]
#go thru all targets...if new style
if (Style_new==1) {
for (iorder=1; iorder<=kCMD ; iorder++) {
jj=insorder[iorder] #jj is the unique install option
itype = instype[iorder]
jjn = split(jj, arr, SUBSEP);
##ins[dsrc, bsrc, ddest, bdest] = kCMD
dsrc=arr["1"]
bsrc=arr["2"]
ddest=arr["3"]
bdest=arr["4"]
#print "NEW STYLE:" iDEP
for(jjj=0;jjj<=iDEP;jjj++) {
#print "LDEP=" ldep[jjj]
basename(ldep[jjj])
dirname(ldep[jjj])
if ((dir=="") || (dir=="./")) dir=""
if (!(dir ~ /^\$.*/) && (dir != "") )
dir=compress(subinvar(dir))
if ((dsrc=="") || (dsrc=="./")) dirins=dsrc
if (!(dirins ~ /^\$.*/) && (dirins != "") )
dirins=compress(subinvar(dir))
debug(1, "CK:dsrc=%s bsrc=%s dir=%s base=%s\n",
dirins, bsrc, dir, base)
if ((dirins == dir) && (bsrc == base) ) {
print "virtual:" dsrc "-" bsrc
virtual_ins[iorder]=1
destdir=ddest
if ((destdir=="") || (destdir=="./")) destdir=""
if (!(destdir ~ /^\$.*/) && (destdir != "") )
destdir=compress(subinvar(destdir))
if (destdir != "")
ldep_more[jjj]=ldep_more[jjj] ", " compress(destdir "/" bdest)
else
ldep_more[jjj]=ldep_more[jjj] ", " compress(bdest)
}#if match!
}#forloop
}#fo all install tars
}
}
function print_var(i)
{
for (i=2; i<=iVAR; i++) {
if (var[i] in noprintvar) { #if on this list of donotprint
debug(5, "noprint: %s\n", var[i])
continue
}
if (var_cnt[i] <= 0 ) { #if not used
debug(5, "nouse: %s\n", var[i])
continue
}
if (var[i] != "" ) #if no variable oops
if (val[i] != "" ) # print nonnull fields
printf("setv %s %s\n", var[i], val[i])
}
}
#builds var list
#uses global lists...
function bld_var( i, tar, tmp, blib)
{
for (tar in target ) {
tar_in_ins(tar);
if (isa(tar) > 0) {
#print tar "is lib"
#is a library!
if (tar in ivar)
printf "multiple target definition: " tar
else {
blib = tar
basename(blib); blib=base;
sub(/\.a/, "", blib)
sub("^lib","", blib)
iVAR++
ivar[tar] = iVAR
var[iVAR] = "LIB" blib
val[iVAR] = "lib" blib ".a"
var_cnt[iVAR]++
iVAR++
#ivar[tar] = iVAR
var[iVAR] = "LIB" blib "FILES"
val[iVAR] = cdep[tar]
var_cnt[iVAR]++
noprintvar[var[iVAR]]=""
}
}else if (iso(tar) > 0 ) {
; #donot put in commands line, nouse
} else {
#if command from .c,.osas usual
# var[CMD] = "CMDS" as defined
#substitute with subinvar, if tar has a dir?
dirname(tar);
basename(tar);
nm=subinvar(dir)
if (dir == nm )
val[CMD] = val[CMD] " " tar
else {
print "dir match by (sub)invar"
val[CMD] = val[CMD] " " compress(nm "/"base)
}
var_cnt[CMD]++
COMD[tar] = 1
#iVAR++
#ivar[tar] = iVAR
#var[iVAR] = "CMD" tar "FILES"
#val[iVAR] = cdep[tar]
}
} #for
}
function chkcmd(s, n, t, i, bas)
{
for(i=1; i<=n; i++) {
basename($i); bas=base;
#print "bas=" bas " test=" t
if(bas == t)
return i
}
return -1
}
function getcmdi(ar1 , ti) {
if (ar1 in cmdl ) {
return (cmdl[ar1 ])
}
else {
cmdl[ar1 ]=iCMD++;
return (cmdl[ar1 ])
}
}
function getccmdi(ic, i, iass,k, xmatch) {
for (i in ccmdl ) {
iass = ccmdl[i]
# print "checking " iass
xmatch=1
for (k=1; icmd[ic,k]!=""; k++)
if (icmd[ic,k] != icmd[iass,k])
xmatch=0
if (xmatch == 1 )
if (icmd[iass,k] != "" )
xmatch =0
#check if matched, or else go over next one
if (xmatch == 1) {
#print "match" ic i
return(i)
}
}
#if we reach here, means we found no match.
iCCMD++
ccmdl[iCCMD] = ic
return(iCCMD)
}
function getkcmdi(ic, i, iass,k, xmatch) {
for (i in kcmdl ) {
iass = kcmdl[i]
# print "checking " iass
xmatch=1
for (k=1; kcmd[ic,k]!=""; k++)
if (kcmd[ic,k] != kcmd[iass,k])
xmatch=0
if (xmatch == 1 )
if (kcmd[iass,k] != "" )
xmatch =0
#check if matched, or else go over next one
if (xmatch == 1) {
#print "match" ic i
return(i)
}
}
#if we reach here, means we found no match.
iKCMD++
kcmdl[iKCMD] = ic
return(iKCMD)
}
function smatch(s, t, i)
{
for(i=1; i<=NF; i++)
if($i == t)
return i
return -1
}
function print_Is(i)
{
for (i=0; i<=iEDGES; i++)
print "("snode[i] "," enode[i] ")"
}
function dot_Is(s, bincl, k, prev)
{
debug(6, "enter:dot_Is()\n");
prev=""
_Ili=""
for(k=1; k<=NF; k++)
if (isI($k) > 0) {
bincl = $k
sub(/\-I/,"", bincl)
if ((bincl == "") || (bincl == "-") || (bincl == ".") )
continue;
_Ili = _Ili " " bincl
if (!(bincl in incdir_a) ) {
incdir_a[bincl]="y"
iINCDIR++
incdir[iINCDIR]=bincl
}
if (prev == "")
prev=bincl
else {
iEDGES++
snode[iEDGES] = prev
enode[iEDGES] = bincl
prev = bincl
}
}
debug(6, "exit:dot_Ts()\n");
}
function dot_as(s, blib,k,prev)
{
debug(6, "entered dot_as\n");
prev=""
_ali=""
for(k=1; k<=NF; k++) {
if (isa($k) > 0) {
basename($k)
blib=base
dirname($k)
dlib=dir
sub(/\.a/, "", blib)
sub("^lib","", blib)
_ali=_ali " " "-l"blib
if (!(dir in libdir_a) ) {
libdir_a[dir] = "y"
iLIBDIR++
libdir[iLIBDIR]=dir
}
if (prev == "")
prev=dlib
else {
iaEDGES++
sanode[iaEDGES] = prev
eanode[iaEDGES] = dlib
prev = bincl
}
}
if (isl($k) > 0) {
basename($k)
blib=base
dirname($k)
dlib=dir
sub(/^\-l/,"", blib)
_ali=_ali " " "-l"blib
if (dlib == "./") dlib=""
if (dlib != "" ) {
if (!(dir in libdir_a) ) {
libdir_a[dir] = "y"
iLIBDIR++
libdir[iLIBDIR]=dir
}
if (prev == "")
prev=dlib
else {
iaEDGES++
sanode[iaEDGES] = prev
eanode[iaEDGES] = dlib
prev = bincl
}
}#if dlib is not= ""
}
} #for all members in the line
debug(6, "exit: dot_as()\n");
}
#_cli is a global variable.
function dot_o2c(s, ss, arr, k, ssdir)
{
debug(6, "enter:dot_o2c()\n")
#print $0
_cli=""
prev_o=""
prev_c=""
for(k=1; k<=NF; k++) {
tar_in_ins($k);
if (iso($k) > 0) { #if a .o file name
ss = arr[split($k, arr, "/")]
if (sub(/\.o/,"", ss) == 1 ) {
_cli=_cli " " ss".c"
} #if
dirname($k); ssdir=dir;
sub(/\/\//, "", ssdir);
if ((ssdir == "") || (ssdir == ".") || (ssdir == "./") )
noop();
else {
if (!(ssdir in objdir_a) ) {
objdir_a[ssdir]="y"
iOBJDIR++
objdir[iOBJDIR]=ssdir
}
if (prev_o == "")
prev_o=ssdir
else {
ioEDGES++
sonode[ioEDGES] = prev_o
eonode[ioEDGES] = ssdir
prev_o = ssdir
}
}
} #if a .o
if (isc($k) > 0) { #if a .c file name
basename($k);
_cli = _cli " " base
dirname($k); ssdir=dir;
sub(/\/\//, "", ssdir);
if ((ssdir == "") || (ssdir == ".") || (ssdir == "./") )
noop();
else {
if (!(ssdir in dotcdir_a) ) {
dotcdir_a[ssdir]="y"
iDOTCDIR++
dotcdir[iDOTCDIR]=ssdir
}
if (prev_c == "")
prev_c=ssdir
else {
icEDGES++
scnode[icEDGES] = prev_c
ecnode[icEDGES] = ssdir
prev_c = ssdir
}
}
}
} # for loop
debug(6, "exit:dot_o2c()\n");
}
#base is a global variable, need to learn how
# to pass/return string values.
function basename(path, arr)
{
base=arr[split(path, arr, "/")]
}
function nbasename(path, arr)
{
return(arr[split(path, arr, "/")])
}
#dir is a global;
function dirname(path, b,arr)
{
dir=""
nfi=split(path, arr, "/");
b=arr[split(path, arr, "/")]
for (i=1; i<nfi; i++) {
#print arr[i] "/"
dir=dir arr[i] "/"
}
if (dir == "./") dir=""
debug(9, "path=%s dir=%s\n", path, dir)
return
debug(9, "\npath=%s arr:1=%s 2=%s", path, arr["1"], arr["2"]);
debug(9, "b=%d path=%s\n", b, path)
if (b == "" )
printf("internal error: empty string to dirname()\n");
else
sub(b,"",path)
if ((path == "./") || (path == ".//") ) # KLUDGE need a regular expr ./*
path=""
debug(9, "b=%s path=%s\n", b, path)
dir=path
}
function iso(is)
{
sss = arr1[split(is, arr1, "/")]
if (sub(/\.o/,"", sss) == 1 )
return 1
else
return -1
}
function isI(s)
{
if (sub(/\-I/,"", s) == 1 ) {
return 1
} else {
return 0
}
}
function isa(s)
{
ss = arr[split(s, arr, "/")]
if (sub(/\.a/,"", ss) == 1 )
return 1
else
return -1
}
function isl(s, arr, ss)
{
if (s ~ /^\-l/ )
return 1
else
return -1
}
function isc(s)
{
ss = arr[split(s, arr, "/")]
if (sub(/\.c/,"", ss) == 1 )
return 1
else
return -1
}
#top_sort
#globals: snode, enode, _SOURCEh
function top_sort(tmsg, snode, enode, nc, a,b, node, nodecnt, i,front,back)
{
_SOURCEh=""
for (node in pcnt)
delete pcnt[node]
for (i in slist)
delete slist[i]
for (i in scnt)
delete scnt[i]
for (i in q)
delete q[i]
nodecnt = 0
for (j=1; j<=nc; j++) { #kludge, start=1 0r 0
a=snode[j]
if (!(a in pcnt) )
pcnt[a] = 0
b=enode[j]
pcnt[b]++
slist[a, ++scnt[a] ] = b
}
back = 0
for (node in pcnt) {
nodecnt++
if (pcnt[node] == 0) {
#print "no back, pred:" back node
q[++back] = node
}
}
#print "n=" nodecnt
for (front = 1; front <= back; front++) {
node = q[front]
#printf(" %s", node = q[front])
#printf(" %s", node )
_SOURCEh = _SOURCEh " " node
for (i=1; i<=scnt[node]; i++)
if (--pcnt[slist[node, i]] == 0)
q[++back] = slist[node, i]
}
if (back != nodecnt) {
print "warning: TOPSORT failed, cycle found, check-> " tmsg
}
}
# a sample call : notonlist(hdrlist, dotcdir, iDOTCDIR, restc)
function notonlist(s, list, nlist, al, arr, i,n)
{
n = split(s, arr, " ");
#arr["1"] ["2"],...["i"]
for (i=1; i<=nlist; i++)
if (list[i] == "")
continue;
else {
found=0
for (j=1; j<=n; j++)
if (list[i] == arr[j])
found=1
if (found == 0) {
al["1"] = al["1"] " " list[i]
#list[i] does not belong to arr/s
}
}
}
#check ins to see if tar == ddest/bdest
function destins(tar, k, i, tmptar, tmptar1, x)
{
tmptar = tar
#next piece of code removes all multiple occurences of ///->to one /
#KLUDGE : use a for loop with a # of selections made counter
gsub(/\/\//,"/", tmptar)
gsub(/\/\//,"/", tmptar)
gsub(/\/\//,"/", tmptar)
gsub(/\/\//,"/", tmptar)
for (jj in ins) {
i = split(jj, arr, SUBSEP);
tmptar1 = arr["3"] arr["4"]
gsub(/\/\//,"/", tmptar1)
gsub(/\/\//,"/", tmptar1)
gsub(/\/\//,"/", tmptar1)
gsub(/\/\//,"/", tmptar1)
# now compare tmptar1 and tmptar
if (tmptar == tmptar1) {
x=ins[jj]
return(x)
}
}
return(-2)
}
#takes in a ccl, a list of defines,
# sideeffects add to a list of cc flags.
# shcc[] changed
function bld_shcc(ccl, arr, i,j,k)
{
print "CC flags(predefined outside makefile): "
k=split(ccl, arr, " ")
for(i=1; i<=k; i++) {
if (arr[i] ~ /^-D/ ) {
gsub(/^-D/, "", arr[i])
print arr[i] " "
shcc[arr[i]] = ""
} else
print "ignoring " arr[i]
}
}
#determines if l has any -D type commands, and returns them
#in a global list _Dli
#other side effects is to generate a define var list.
# to be printed at the begining. we will use var[], val[] arrays.
function dflags(l, i,k,j, arr, def)
{
_Dli=""
#assume $1, $2, ... etc. are valid arguments
for(k=1; k<=NF; k++) {
if ($k ~ /^-D/ ) #yes a -D type var
{
def = $k
gsub(/^-D/, "", def)
gsub(/\=.*/,"",def)
defval=$k
if (gsub(/^-D.*\=/, "", defval) <= 0 )
defval=""
if (defval == "") #just -DXXX
defval=$k
#print "a define: " def ": " defval
if (def in shcc) {
#print "already in shcc"
#ok, do nothing
;
}
else {
#aha, this define should go into _Dli
_Dli = _Dli " " "("def")"
#also put it in var/val list so that it gets
# printed when those variables get printed
found=0
for(i=1;i<=iVAR; i++)
if (var[i] == def )
found=1
if (found == 0) {
#print "in array"
iVAR++
var[iVAR] = def
val[iVAR] = defval
var_cnt[iVAR]++
}
}
} #if $k is ^-D
} #for loop over all items in l
#print "_Dli at return=", _Dli
}
function noop(){}
function isin(listy, ele, i, j,k,x ,tmp, arr)
{
if (listy == "")
return(-1)
tmp=listy
#print listy
x=split(tmp, arr, " ")
for (j=1; j<=x; j++)
if(arr[j] == ele ) {
#print listy
return(1)
}
#print listy
return(-1)
}
function shenv(sname, svalue,x) {
system("env >.ajyENV")
while (getline x <".ajyENV" > 0 ){
iSHVAR++
sname = x
svalue = x
gsub(/\=.*/,"",sname)
gsub(/.*\=/,"",svalue)
isshvar[sname] = iSHVAR # a fast search array
shvar[iSHVAR] = sname
shval[iSHVAR] = svalue
#print "< " sname " " svalue " >"
}
#this is the default for cc flags, call bld_shcc multiple times
# if you want more flags as defaulted outside makefile
if ("NOPRINTVAR" in isshvar) {
print "NOPRINTVAR:these variables will not be printed"
print " in the Makefile(s) generated"
t=shval[isshvar["NOPRINTVAR"]]
i8=split(t,arr8, " "); print "i=" i8 "t="t;
for(j=1; j<=i8; j++) {
noprintvar[arr8[j]]=""
}
}
CC_SHVAR = "ENVCCF"
if (CC_SHVAR in isshvar) {
#print "ok"
bld_shcc(shval[isshvar[CC_SHVAR]] ); #builds list of cc flags
}
else;
# note that this is used in determining what flags to set
# during the makefile generation since some flags on CC
# might be simply a property within that makefile.
NMAKE_SHVAR = "NMAKE_VER"
if (NMAKE_SHVAR in isshvar ) {
if (shval[NMAKE_SHVAR] == "1.4" )
nmake_ver="1.4"
else if (shval[NMAKE_SHVAR] == "2.0" )
nmake_ver="2.0"
else {
print "1.4 or 2.0 in NMAKE_VER var"
}
} else {
; #print "using 2.0 nmake version"
}
#nmake_var is unused currently
}
function plogic(s)
{
printf("[%s]logic error: call support, results could be incorrect", s);
}
#$0
function find_in_out(s, arr, n,i )
{
n=split(s, arr, " ")
cin="";cout="";
for(i=1;i<=n;i++) {
if (arr[i] == ">")
cout=arr[i+1]
else if (arr[i] == "<" )
cin=arr[i+1]
else if (arr[i] ~ /^\>/ ) {
gsub(/\>/, "", arr[i] )
cout=arr[i]
} else if (arr[i] ~ /^\</ ) {
gsub(/\</, "", arr[i] )
cin=arr[i]
}
}
}
function tar_in_ins(tar, btar, dtar , i, jj)
{
basename(tar);btar=base
dirname(tar); dtar=dir
#print btar " - " dtar
for (jj in ins) {
i = split(jj, arr, SUBSEP);
gsub(/\/\//, "/", arr["3"]);
gsub(/\/\//, "/", arr["3"]);
gsub(/\/\//, "/", dtar)
gsub(/\/\//, "/", dtar)
if (dtar == "") dtar="./"
if (arr["3"] == "") arr["3"]="./"
#print arr["3"] " - " arr["4"]
if ((btar == arr["4"] ) && (dtar == arr["3"] ) )
{
print tar " in install????"
print arr["1"] arr["2"] "->" dtar btar
print "WARNING: CHECK Makefile.0 "
}
} #for
}
#ins[dsrc, bsrc, ddest, bdest] = kCMD
#rule for patterns
# syntax :
# <cmd> <options> <name> < <fname>
# cat <fname> | <cmd> <options> <name> - this is not implemented.
# .p : .pat .CMD.xx
function rule_pat(s, myi, jmy, i,j,k,jj, jmy)
{
cin="";cout=""
find_in_out(s); #use s instead later
fname=cin
opts=""
for (k=jmy+1; k<=NF; k++){
if ($k ~ /\-/) {
print "Warning: options on pattern could be ignored"
opts=opt " " $k
#options, use them
} else if ($k ~ /</ ) {
#break out of loop
break;
} else {
name=$k
break;
}
} #for loop
#print "name=" name " fname=" fname
#KLUDGE 1 is for patterns PATTERNS
#KLUDGE 0 is for COMMANDS variables.
val[1] = val[1] " " name".p"
var_cnt[1]++
dirname(fname);basename(fname);
if (dir == "") dir = ""
dsrc=dir; bsrc=base; ddest="./"; bdest=name".p" ;
kCMD++
ins[dsrc, bsrc, ddest, bdest] = kCMD
insorder[kCMD]=dsrc SUBSEP bsrc SUBSEP ddest SUBSEP bdest
instype[kCMD]="pattern"
# print "insorder" kCMD " {}-"insorder[kCMD]
for(k=1; kcmd[kCMD,k]!=""; k++);
kcmd[kCMD,k] = sprintf("\t %s %s %s < $(<)", vcommand(myi), opts, name)
instdir[ddest]=""
}
function isfile(path, tmp)
{
#use if this is set
tmp=sprintf("test -f %s", path)
if (system(tmp) == 0 )
return 1
else
return 0
}
function rm_vpath(path, vpath, i, varr, parr,iv, j, k, arr, tmp)
{
#KLUDGE AND INEFFICIENT!
for (i=0;i<=15; i++)
gsub(/\/\//, "", path)
for (i=0;i<=15; i++)
gsub(/\/\//, "", vpath)
iv=split(vpath, varr, ":")
ip=split(path, parr, "/");
for (i=1; i<=iv; i++) { #for each vpath path
}
}
function abs2relpath(path, i, j)
{
}
function vcommand(command, i, j, k)
{
for(i=1; i<=iVAR; i++)
if (val[i] == command) {
var_cnt[i]++
return("$("var[i]")")
}
return(command);
}
function varfill(sname, svalue,x) {
if (varfile == "_")
return
if (isfile(varfile) <= 0 ) {
print "ERROR: cannot find file: " varfile
return
}
debug(7, "varfile:%s\n" varfile);
while (getline x <varfile > 0 ){
iVAR++
sname = x
svalue = x
gsub(/\=.*/,"",sname)
gsub(/.*\=/,"",svalue)
isvar[sname] = iVAR # a fast search array
var[iVAR] = sname
val[iVAR] = svalue
var_cnt[iVAR]=0 #increment number of times used.
debug(7, "%s %s\n", sname ,svalue);
}
}
function invarfill(sname, svalue,x) {
if (invarfile == "_" )
return
if (isfile(invarfile) <= 0 ) {
print "ERROR: cannot find: " invarfile
return
}
debug(7, "invarfile:%s\n" invarfile);
while (getline x <invarfile > 0 ){
#iINVAR++
sname = x
svalue = x
gsub(/\=.*/,"",sname)
gsub(/.*\=/,"",svalue)
svalue=compress(svalue)
invar_cnt[sname]=0 #counts how many times sname used!
### added for X=xxx:xx:yyy:zzz kind of assignments.
ia=split(svalue, arr, ":" );
debug(9, "ia=%d", ia)
if (ia > 1) {
debug(5, ": define found! %s\n", sname);
isinvar[sname] = iVAR # a fast search array
if (arr["1"] ~ /^\+.*/){
tmpa=arr["1"];
sub(/^\+/,"", tmpa);
invar[sname]=tmpa #use first define...as default
} else
invar[sname]=arr["1"] #use first define...as default
debug(9, "invar[%s]=%s\n", sname , invar[sname])
invar_more[sname]=1#this indicates if we need
#to search the var_i/val_i arrays...
for (i=1; i<=ia; i++) {
debug(9, ":%s", arr[i]);
if (arr[i] ~ /^\+.*/ ) {
debug(9, "+VPATH");
sub(/^\+/,"", arr[i]);
print "VPATH +"arr[i]
itill=iIN;
for(iti=0; iti<=itill; iti++){
if (var_i[iti] == "VPATH"){
iIN++;
var_i[iIN]=sname
val_i[iIN]=compress(val_i[iti] "/" arr[i])
debug(7, ":+(%s=%s)\n", sname ,val_i[iIN]);
}
}
} else {
iIN++
var_i[iIN]=sname
val_i[iIN]=compress(arr[i])
debug(7, ":%s %s\n", sname ,val_i[i]);
}
}
} else { #if a : separated define exists ...
isinvar[sname] = iVAR # a fast search array
invar[sname]=svalue
invar_cnt[sname]=0 #counts how many times sname used!
debug(7, "%s %s\n", sname ,svalue);
if (svalue ~ /^\.\/.*/ ) {
invar_more[sname]=1
iIN++
var_i[iIN]=sname
val_i[iIN]=svalue
sub(/^\.\//, "", val_i[iIN]);
}
} #regular define with no colons:...
}#while allinvars in invarfile...
}
#puts time stamp in the makefile generated.
function ts_makefile(d, x)
{
printf("note # # make abstract machine file generated by mg # #\n");
if (isfile(premakefile) >= 0 ) {
while (getline x <premakefile >0)
printf("%s\n", x)
printf("\n\n") ;
}
}
#returns a variable or NULL string depending on if it is
#defined.
function v2n(val, pwd, e, i, j, k, tmp, arr, val1)
{
e=""
nm=subinvar(val)
if (val != nm ) {
#print "found a sub " val ":" nm
return(nm);
}
#print "v2n: " "val=" val"<" " pwd=" pwd " fv2n=" fv2n"<"
if (fv2n != "_" ) {
print "shell: " fv2n " "val
fv2n " "val " "KLU++ | getline e
#print "e=" e
if (e == "" ) {
#try another variation
val1 = val"/"
print "shell: " fv2n " "val1
fv2n " "val1 " "KLU++ | getline e
}
return e
} else
return NULL
}
#in:a list "/eald ../sdlfk /./..sdf" etc.
#out: a list with variables substitutes.
#typiclaly used in .SOURCE.h, .a...etc. lines
function v2(ilist, ia, i, vval, vvar, jlist, vfdir)
{
for (i in ztmp)
delete ztmp[i]
jlist=""
ia=split(ilist, arr, " ");
for (i=1; i<=ia; i++) {
vval=arr[i]
vval=compress(vval)
#print "vval=" vval
#vvar=v2n(vval);
vvar=compress(subinvar(vval)) ;
debug(1, "S: %s %s\n", vval, vvar);
if (vvar in ztmp)
debug(9, "already in S:%s\n", vvar)
else {
ztmp[vvar]=1
jlist = jlist " " vvar
}
}
return(jlist);
#this piece of code is extinct below:::
if (vvar == NULL ) {
#check the INSTDIR list...
found=0
for (vdir in invar) {
vali = invar[vdir]
vali1=compress(vali)
if (vval == vali1) {
vfdir=vdir
debug(6, "ffvdir=%s vval=%s\n" vfdir , vali1)
found=1
invar_cnt[vdir]++
break;
}
}
if (found == 1)
jlist = jlist " " "$("vfdir")"
else
jlist = jlist " " arr[i]
}
}
function compress(xval, i, val)
{
if (xval ~/^\.\/.*/ )
debug(9, "WARNING: ./ matching will fail %s", xval);
val=xval
#no doble slashes; KLUDGE
for (i=0;i<=5; i++)
gsub(/\/\//, "/", val)
#no trailing single / eg. /usr/include/ => /usr/include
if (val == "/" ) {
#cannot remove this single slash! so return...
debug(3, "compress: single slash\n");
return(val);
}
gsub(/\/$/, "", val);
return(val);
}
#substiture the s with invar[VAR]=VAL, using first match!!!
#bug removal1: ./ or "" matching prohibited...
function subinvar(s1, myvar, i, j, k, match_length, match_val, match_var)
{
s=compress(s1)
debug(8,"subinvar:%s -compress> %s\n", s1, s)
match_length=0
match_val=""
match_var=""
for(yvar in invar) {
yval=invar[yvar]
debug(8, "subinvar: check %s=%s\n", yvar, yval);
if (length(yval) < match_length) #we do not want a smaller match!
continue
if ((yval == "") || (yval == "./") ) {
#cant match this noops.
continue
}
r=""
i=index(s, yval);
#print i "-" s "/" length(s) "-" yval "/"length(yval)
r=substr(s, length(yval)+1 )
debug(8, "index: i=%d, s=%s yval=%s r=%s\n", i, s, yval, r);
if ((r ~ /\/.*/) || (r == "") )
debug(8, "ok\n");
else {
debug(8, "no match %s %s i=%d\n",s, r, i);
continue
}
if (i== 1) {
#print yvar " val=" yval "len=" length(yval)
r=substr(s, length(yval)+1 )
if ((r ~ /\/.*/) || (r == "") )
debug(8, "ok\n");
else {
debug(8, "no match %s %s i=%d\n",s, r, i);
continue
}
#print "r=" r
debug(8, "yvar=%s %d SUB=%s\n", yvar, invar_cnt[yvar], s)
match_var = yvar
match_val = "$(" yvar ")/" r;
match_length=length(yval)
}
} #for match
debug(8, ":check var_i/val_i arrays for maxmatch \n");
############new codebelow for checking val_i/var_i lists.
for(j=0;j<=iIN; j++) {
r=""
yvar=var_i[j]
yval=val_i[j]
debug(8, ":%s %s \n", yvar, yval)
if (length(yval) < match_length) #we do not want a smaller match!
continue
if ((yval == "") || (yval == "./") ) {
#cant match this noops.
continue
}
i=index(s, yval);
if (i== 1) {
debug(8, "ahh! var_i/val_i found\n")
#print yvar " val=" yval "len=" length(yval)
r=substr(s, length(yval)+1 )
if ((r ~ /\/.*/) || (r == "") )
noop();#ok
else {
debug(8, "no match %s %s i=%d\n",s, r, i);
continue
}
#print "r=" r
debug(8, ":yvar=%s %d SUB=%s\n", yvar, invar_cnt[yvar], s)
match_var = yvar
match_val = "$(" yvar ")/" r;
match_length=length(yval)
}
}#loop thru all var_i
if (match_length > 0) {
#something matched!
invar_cnt[match_var]++
debug(4, "\tmatch:%s %s\n", match_val, s)
return(match_val)
}
#else return same old string...
debug(4, "NO MATCH:%s\n", s1);
return(s1)
}
#return ("$(" yvar ")/" r);
#given a string s, determines any .SOURCE.* lines for
#modification...
function spath(s)
{
if (isc(s) > 0 ) {
dirname(s);
if (!(dir in dotcdir_a) ) {
dotcdir_a[dir]="y"
iDOTCDIR++
dotcdir[iDOTCDIR]=dir
}
} else {
dirname(s);
if (dir != "")
print "add .SOURCE: line manually" dir " for " s
}
}
#converts a any file to a .ln file
function any2ln(s, tmp)
{
if (isc(s) > 0) {
#is a .c so get base name and convert...
basename(s);
tmp=s
sub(/\.c$/, "", tmp)
return(tmp".ln")
} else {
return(s".ln")
}
}
function nl(Plist,Llist,Larr,Lc,Li, thisline)
{
Llist=Plist;
Lc=split(Llist,Larr," ");
thisline=0
maxline=MAXPERLINE
if (maxline <= 0)
maxline=1
#print maxline
for (Li=1;Li<=Lc;Li++)
{
#print thisline maxline Larr[Li]
if (thisline < maxline){
printf("\t%s ",Larr[Li])
thisline++
}else {
#here we have printed max on this line, start newline
printf("\\\n") ;
printf("\t%s ",Larr[Li])
thisline=1
}
}
#printf("\t\t%s\n\n",Larr[Li])
printf("\n\n")
}
function debug(level, con_str, a,b,c,d,e,f,g,h,i,j,k,l)
{
if (level > debug_level )
return
printf(con_str, a,b,c,d,e,f,g,h,i,j,k,l)
}
function virtual_g(a,b,c, tmp)
{
return(avu[a,b,c]);
}
function virtual_n(a,b,c, i,j,k,arr,tmp)
{
tmp=a SUBSEP b SUBSEP c
if (tmp in avu) {
print "Virtual error:duplicate" a "--" b "--" c
} else {
usage[c]++
if (usage[c] == 1)
avu[a,b,c]="V_" c
else
avu[a,b,c]="V_" c usage[c]
}
return(avu[a,b,c]);
}
function print_dep_new()
{
}
#returns "" or some more dependencies...
function f_ldep_more(ind, iorder, i,j,k,tmp,arr, jj, itype, jjn, dir, nm)
{
return(ldep_more[ind]);
if (ind in ldep_more) {
debug(9,"ok");
}else {
debug(1, "nomore for %s", ldep[i]);
return("");
}
#here there are more targets, ....
#following code from install dire...
iorder=ldep_more[ind] #k is the index into ins array
jj=insorder[iorder] #jj is the unique install option
itype = instype[iorder]
jjn = split(jj, arr, SUBSEP);
dir = arr["3"]
nm=subinvar(dir);
debug(1,"more returns: %s\n", compress(nm) );
return(compress(nm))
}
function vircnv(s, tmp)
{
gsub(/\</, ">", s)
return(s);
}