IMCtermite/parquet/parquet/generate_deps.py

134 lines
4.5 KiB
Python

#-----------------------------------------------------------------------------#
import argparse
import os
#-----------------------------------------------------------------------------#
parser = argparse.ArgumentParser(description='List all source dependencies')
#parser.add_argument('pathToRepo',type=str,help='path of source repository')
parser.add_argument('mainSource',type=str,help='main source file')
parser.add_argument('depFile',type=str,help='file listing all dependencies')
args = parser.parse_args()
libpaths = ["/home/mario/Desktop/arrow/cpp/src/",
"/home/mario/Desktop/arrow/cpp/thrift_ep-install/include/",
"/home/mario/Desktop/arrow/cpp/boost_ep-prefix/src/boost_ep/"]
#-----------------------------------------------------------------------------#
def find_dependencies(srcfile, recdepth, cdeplist) :
"""
Given a source file and its dependencies in the given repository path
list all further dependencies recursively
Args:
srcfile (string): path/name of source file
recdepth (integer): current recursion depth
cdeplist (list): current list of dependencies
Return:
deps (list): list of source files in repository, the source file depends on
"""
# define indentation to visual recursion
indent = recdepth*(" ")
print("\n" + indent + "find_dependencies:"
+ "\n" + indent + "1: " + srcfile
+ "\n" + indent + "2: " + str(recdepth)
+ "\n" + indent + "3: " + str(len(cdeplist)) + "\n")
# show dependencies so far
#print(cdeplist)
# generate dependencies by means of g++
libdeps = (" -I ").join(libpaths)
cmd = "g++ -c -MMD " + srcfile + " -I " + libdeps
print(indent + cmd )
os.system(cmd)
# open dependency file and extract list of sources
basename = srcfile.split('/')[-1].split('.')[0]
depfile = basename + '.d'
print(indent + "reading dependency file " + depfile)
with open(depfile,'r') as fin :
depslist = fin.readlines()
# delete dependencies and object files
os.system("rm " + basename + ".d")
os.system("rm " + basename + ".o")
# remove first line
depslist = depslist[1:]
# delete leading space and trailing backslash
depslistcl = [dep.lstrip(' ').rstrip(' \\\n') for dep in depslist]
# collect dependencies
newdeps = []
# check all dependencies recursively and collect further dependencies
count = 0
for dep in depslistcl :
# append source itself to list
if dep not in cdeplist :
print(indent + "adding dependency " + dep)
newdeps.append(dep)
count = count + 1
print(indent + "=> added " + str(count) + "/" + str(len(depslistcl)) )
# check recursion depth
if recdepth < 20 :
# check all dependencies of every single dependency
for dep in depslistcl :
# try to find corresponding *.cc, (*.cpp) file
depcc = dep.split('.')[0] + '.cc'
print(indent + "checking for " + depcc)
if os.path.exists(depcc) :
if depcc not in cdeplist and depcc not in newdeps :
# add file itself as dependency
newdeps.append(depcc)
# find dependencies of single source
newrecdeps = find_dependencies(depcc,recdepth+1,cdeplist+newdeps)
# append to list
for el in newrecdeps :
if el not in newdeps :
newdeps.append(el)
else :
print(indent + "already in list")
else :
print(indent + "does not exist")
print("\n")
# provide list of dependencies
return newdeps
#-----------------------------------------------------------------------------#
if __name__== "__main__":
print("\nCLI arguments:\n" + str(args) + "\n")
# collect list of dependencies
deps = []
# start recursion with given source file
deps = find_dependencies(args.mainSource,0,[])
print("\nfinal list of dependencies: (" + str(len(deps)) + ")\n")
print(deps)
print("\n")
# remove any duplicates
depsuni = set(deps)
print("\nfinal set of dependencies: (" + str(len(depsuni)) + ")\n")
print(depsuni)
print("\n")
# write list of dependencies
with open(args.depFile,'w') as fout :
for el in depsuni :
fout.write(str(el) + '\n')
#-----------------------------------------------------------------------------#