forked from alexksr/SconsMWE
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSConstruct.simple2
94 lines (76 loc) · 2.96 KB
/
SConstruct.simple2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import fortdepend as fd
fexts = [".f", ".for", ".f90", ".f95", ".f03", ".f08"]
def find_fortran_files(root_dir, fortran_extensions, abspath=False):
"""Find all Fortran source files in src directory and its subdirectories"""
source_files = []
for dir, _, files in os.walk(root_dir):
for file in files:
if any(file.endswith(ext) for ext in fortran_extensions):
source_files.append(
os.path.join(dir, file)
if abspath
else os.path.join(dir.replace(root_dir, "."), file)
)
return source_files
def generate_fortran_dependencies(source_files, fortran_extensions, **kwargs):
"""use fortdepend to get dependencies"""
fproj = fd.FortranProject(files=source_files, **kwargs)
source_deps, prog_deps = {}, {}
for key, val in fproj.depends_by_module.items():
_key = key.source_file.filename
_val = [v.source_file.filename for v in val]
if key.unit_type == "module":
source_deps[_key] = _val
elif key.unit_type == "program":
prog_deps[_key] = _val
return source_deps, prog_deps
def get_mods_from_sources(src_info, src):
"""
Using info from dictionary of soures and they're generated objects and modules
return just a list of modules as Nodes and also as strings
"""
obj = src_info[src]["obj"]
mod_deps = [src_info[d]['mod'] for d in all_deps[src] if src_info[d]['mod']]
mod_deps_s = [str(m) for m in mod_deps]
print(f"-- tell SCons {obj} also depends on {mod_deps_s}")
env.Depends(target=obj, dependency=mod_deps)
return obj
env = Environment(
tools=["default", "gfortran"],
F90="gfortran",
LINK="gfortran",
LINKFLAGS="",
FORTRANMODDIR="fortran_mods",
)
all_files = find_fortran_files(os.getcwd(), fortran_extensions=fexts, abspath=False)
print("- all files found with fortran ext: ", all_files)
source_deps, prog_deps = generate_fortran_dependencies(all_files, fexts)
source_files = list(source_deps.keys())
prog_files = list(prog_deps.keys())
print("- all source deps (no progs) ", source_deps)
print("- all program deps found ", prog_deps)
print("- all source files (no progs) ", source_files)
print("- all prog files ", prog_files)
# Create all the objects from source files, keeping separate info
# on generated objects and fortran module files.
src_info = dict()
for s in all_files:
print(f"Object for {s}")
rv = env.Object(s)
obj = rv[0]
if len(rv) == 2:
mod = rv[1]
else:
mod = False
src_info[s] = {"obj": obj, "mod": mod}
objects = []
all_deps = {**source_deps, **prog_deps}
for src in all_deps:
obj = get_mods_from_sources(src_info, src)
objects.append(obj)
print("- all SCons objects", [str(o) for o in objects])
for prog in prog_deps:
get_mods_from_sources(src_info, prog)
prog_to_make = "main"
env.Program(target=prog_to_make, source=all_deps.keys())