mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +00:00
e5c0c7185e
svn path=/trunk/; revision=2456
163 lines
3.1 KiB
Awk
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
|
|
}
|
|
}
|