reactos/rosapps/mc/src/depend.awk
Steven Edwards e5c0c7185e Midnight Commander for Win32
svn path=/trunk/; revision=2456
2001-12-30 10:02:14 +00:00

163 lines
3.1 KiB
Awk

#! /usr/bin/awk -f
# This is an awk script which does dependencies. We do NOT want it to
# recursively follow #include directives.
# We only add to dependencies those files which are inside of the rootdir
# tree :)
#
# Surely there is a more elegant way to see if a file exists. Anyone know
# what it is?
#
function fileExists(f, TMP, dummy, result) {
if(result=FILEHASH[f]) {
if(result=="Yes") {
return "Yes"
} else {return ""}
}
ERRNO = getline dummy < f
if(ERRNO >= 0) {
close(f)
return FILEHASH[f]="Yes"
} else {
FILEHASH[f]="No"
return ""
}
}
function Canonic(path) {
while (path ~ "/[^/]*/\\.\\./")
gsub("/[^/]*/\\.\\./","/",path)
return path
}
BEGIN{
hasdep=0
objprefix=""
USEDC=0
if(dolib) {
# dolib = "libdirectory libname"
split(dolib, dlib)
I=0
rootdir=srcdir
sub("/$","",rootdir)
sub("/[^/]*$","",rootdir)
while (getline > 0) {
if ($0 ~ "OBJS") {
objs=$0
} else if ($0 ~ "^/.*\\.h: \\\\$") {
sub(": \\\\$","",$0)
USED[USEDC]=$0
++USEDC
}
}
sub("^OBJS=[ ]*\"[ ]*","",objs)
sub("\"[ ]*","",objs)
split(objs, obj)
printf "%s: ", dlib[2]
sub("/$","", dlib[1])
objprefix=dlib[1]"/"
for (fname in obj) {
fullname=dlib[1]"/"obj[fname]
printf " \\\n %s", fullname
sub("\\.o$",".c",obj[fname])
ARGV[ARGC]=obj[fname]
++ARGC
}
printf "\n"
}
if(!hpath) {
print "hpath is not set"
exit 1
}
if(!srcdir) {
print "srcdir is not set"
exit 1
}
sub("[/ ]*$","",srcdir)
srcdir=srcdir"/"
sub("^\./$","",srcdir)
split(hpath, parray)
for(path in parray) {
sub("^-I","",parray[path])
sub("[/ ]*$","",parray[path])
parray[path]=Canonic(parray[path])
}
for(path in ARGV) {
USED[USEDC]=Canonic(srcdir""ARGV[path])
++USEDC
}
}
/^#[ ]*include[ ]*[<"][^ ]*[>"]/{
found=0
if(LASTFILE!=FILENAME) {
if (hasdep) {
print cmd
hasdep=0
}
cmd=""
LASTFILE=FILENAME
depname=FILENAME
relpath=FILENAME
sub("\\.c$",".o: ",depname)
if (depname==FILENAME) {
depname=srcdir""depname
depname=Canonic(depname)
cmd="\n\t@touch "depname
} else
depname=objprefix""depname
sub("\\.h$",".h: ",depname)
if(relpath ~ "^\\." ) {
sub("[^/]*$","", relpath)
relpath=relpath"/"
sub("//","/", relpath)
} else {
relpath=""
}
}
fname=$0
sub("^#[ ]*include[ ]*[<\"]","",fname)
sub("[>\"].*","",fname)
if(fileExists(relpath""fname)) {
found=1
if (!hasdep) {
printf "%s", depname
hasdep=1
}
fullname=Canonic(srcdir""relpath""fname)
printf " \\\n %s", fullname
if(fname ~ "^\\." ) {
partname=relpath""fname
afound=0
for(name in USED) {
if (USED[name] == fullname) {
afound=1
break
}
}
if (!afound) {
ARGV[ARGC]=partname
++ARGC
USED[USEDC]=fullname
++USEDC
}
}
} else {
for(path in parray) {
if(fileExists(parray[path]"/"fname)) {
found=1
if (!hasdep) {
printf "%s", depname
hasdep=1
}
printf " \\\n %s", parray[path]"/"fname
}
}
}
}
END{
if (hasdep) {
print cmd
}
}