134 lines
4.5 KiB
Python
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')
|
|
|
|
#-----------------------------------------------------------------------------#
|