From 6f886ecdbbe2be7616b2ce54d474466f3bde063e Mon Sep 17 00:00:00 2001 From: Kostas Tsigaridis Date: Sat, 18 Mar 2017 15:44:13 -0400 Subject: [PATCH 1/2] Adding -i (--ignore) option to list modules which are found in dependencies but should be ignored. This is useful when the code is linked to external libraries. --- fort_depend.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fort_depend.py b/fort_depend.py index 60484dc..70579f9 100755 --- a/fort_depend.py +++ b/fort_depend.py @@ -3,11 +3,11 @@ import re #Definitions -def run(files=None,verbose=True,overwrite=None,output=None,macros={},build=''): +def run(files=None,ignore=None,verbose=True,overwrite=None,output=None,macros={},build=''): l=create_file_objs(files,macros) mod2fil=file_objs_to_mod_dict(file_objs=l) - depends=get_depends(fob=l,m2f=mod2fil) + depends=get_depends(fob=l,m2f=mod2fil,ignore=ignore) if verbose: for i in depends.keys(): @@ -124,11 +124,12 @@ def file_objs_to_mod_dict(file_objs=[]): dic[j.lower()]=i.file_name return dic -def get_depends(fob=[],m2f=[]): +def get_depends(fob=[],m2f=[],ignore=[]): deps={} for i in fob: tmp=[] for j in i.uses: + if ignore and (j in ignore): continue try: tmp.append(m2f[j.lower()]) except: @@ -153,6 +154,7 @@ def __init__(self): # Add command line arguments parser = argparse.ArgumentParser(description='Generate Fortran dependencies') parser.add_argument('-f','--files',nargs='+',help='Files to process') + parser.add_argument('-i','--ignore',nargs='+',help='Modules to ignore') parser.add_argument('-D',nargs='+',action='append',metavar='NAME=DESCRIPTION', help="""The macro NAME is replaced by DEFINITION in 'use' statements""") parser.add_argument('-b','--build',nargs=1,help='Build Directory (prepended to all files in output', @@ -175,4 +177,4 @@ def __init__(self): output = args.output[0] if args.output else None build = args.build[0] if args.build else '' - run(files=args.files, verbose=args.verbose, overwrite=args.overwrite, macros=macros, output=output, build=build) + run(files=args.files, ignore=args.ignore, verbose=args.verbose, overwrite=args.overwrite, macros=macros, output=output, build=build) From cc8b0014cbbcf2f930f176ef96f17d312bcc72a3 Mon Sep 17 00:00:00 2001 From: Kostas Tsigaridis Date: Sat, 18 Mar 2017 16:50:37 -0400 Subject: [PATCH 2/2] Check for included files while building depepdencies, not only used modules --- fort_depend.py | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/fort_depend.py b/fort_depend.py index 70579f9..a78ee2c 100755 --- a/fort_depend.py +++ b/fort_depend.py @@ -44,7 +44,11 @@ def write_depend(outfile="makefile.dep",dep=[],overwrite=False,build=''): stri="\n"+os.path.join(build, fil.split(".")[0]+".o"+" : ") for j in dep[i]: tmp,fil=os.path.split(j) - stri=stri+" \\\n\t"+os.path.join(build, fil.split(".")[0]+".o") + ext=fil.split(".")[1] + if (ext == "inc"): + stri=stri+" \\\n\t"+os.path.join(build, fil) + else: + stri=stri+" \\\n\t"+os.path.join(build, fil.split(".")[0]+".o") stri=stri+"\n" f.write(stri) f.close() @@ -69,6 +73,7 @@ def create_file_objs(files=None, macros={}): source_file.file_name = i source_file.uses = get_uses(i,macros) + source_file.includes = get_includes(i,macros) source_file.contains = get_contains(i) l.append(source_file) @@ -99,6 +104,30 @@ def get_uses(infile=None, macros={}): return uniq_mods +def get_includes(infile=None, macros={}): + "Return which modules are included in infile after expanding macros" + p=re.compile("\#include\s*\"(?P\w*).inc\"$",re.IGNORECASE).match + + includes=[] + + with open(infile,'r') as f: + t=f.readlines() + + for i in t: + tmp=p(i) + if tmp: + includes.append(tmp.group('incfile').strip()+".inc") + + # Remove duplicates + uniq_includes = list(set(includes)) + + for i, mod in enumerate(uniq_includes): + for k, v in macros.items(): + if re.match(k, mod, re.IGNORECASE): + uniq_includes[i] = mod.replace(k,v) + + return uniq_includes + def get_contains(infile=None): "Return all the modules that are in infile" p=re.compile("^\s*module\s*(?P\w*)",re.IGNORECASE).match @@ -125,6 +154,7 @@ def file_objs_to_mod_dict(file_objs=[]): return dic def get_depends(fob=[],m2f=[],ignore=[]): + import os.path deps={} for i in fob: tmp=[] @@ -134,6 +164,12 @@ def get_depends(fob=[],m2f=[],ignore=[]): tmp.append(m2f[j.lower()]) except: print "\033[031mError\033[039m module \033[032m"+j+"\033[039m not defined in any files. Skipping..." + for j in i.includes: + try: + os.path.isfile(j) + tmp.append(j) + except: + print "\033[031mError\033[039m include file \033[032m"+j+"\033[039m does not exist. Skipping..." deps[i.file_name]=tmp @@ -143,6 +179,7 @@ class file_obj: def __init__(self): self.file_name=None self.uses=None + self.includes=None self.contains=None self.depends_on=None