File: fc.py

package info (click to toggle)
pyinstaller 6.18.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,820 kB
  • sloc: python: 41,828; ansic: 12,123; makefile: 171; sh: 131; xml: 19
file content (150 lines) | stat: -rw-r--r-- 5,373 bytes parent folder | download | duplicates (3)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#! /usr/bin/env python
# encoding: utf-8
# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file

from waflib import Utils, Task, Errors
from waflib.Tools import ccroot, fc_config, fc_scan
from waflib.TaskGen import extension
from waflib.Configure import conf

ccroot.USELIB_VARS['fc'] = set(['FCFLAGS', 'DEFINES', 'INCLUDES', 'FCPPFLAGS'])
ccroot.USELIB_VARS['fcprogram_test'] = ccroot.USELIB_VARS['fcprogram'] = set([
    'LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS', 'LDFLAGS'
])
ccroot.USELIB_VARS['fcshlib'] = set([
    'LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS', 'LDFLAGS'
])
ccroot.USELIB_VARS['fcstlib'] = set(['ARFLAGS', 'LINKDEPS'])


@extension('.f', '.F', '.f90', '.F90', '.for', '.FOR', '.f95', '.F95', '.f03', '.F03', '.f08', '.F08')
def fc_hook(self, node):
    return self.create_compiled_task('fc', node)


@conf
def modfile(conf, name):
    if name.find(':') >= 0:
        separator = conf.env.FC_SUBMOD_SEPARATOR or '@'
        modpath = name.split(':')
        modname = modpath[0] + separator + modpath[-1]
        suffix = conf.env.FC_SUBMOD_SUFFIX or '.smod'
    else:
        modname = name
        suffix = '.mod'
    return {
        'lower': modname.lower() + suffix.lower(),
        'lower.MOD': modname.lower() + suffix.upper(),
        'UPPER.mod': modname.upper() + suffix.lower(),
        'UPPER': modname.upper() + suffix.upper()
    }[conf.env.FC_MOD_CAPITALIZATION or 'lower']


def get_fortran_tasks(tsk):
    bld = tsk.generator.bld
    tasks = bld.get_tasks_group(bld.get_group_idx(tsk.generator))
    return [
        x for x in tasks
        if isinstance(x, fc) and not getattr(x, 'nomod', None) and not getattr(x, 'mod_fortran_done', None)
    ]


class fc(Task.Task):
    color = 'GREEN'
    run_str = '${FC} ${FCFLAGS} ${FCINCPATH_ST:INCPATHS} ${FCDEFINES_ST:DEFINES} ${_FCMODOUTFLAGS} ${FC_TGT_F}${TGT[0].abspath()} ${FC_SRC_F}${SRC[0].abspath()} ${FCPPFLAGS}'
    vars = ["FORTRANMODPATHFLAG"]

    def scan(self):
        tmp = fc_scan.fortran_parser(self.generator.includes_nodes)
        tmp.task = self
        tmp.start(self.inputs[0])
        return (tmp.nodes, tmp.names)

    def runnable_status(self):
        if getattr(self, 'mod_fortran_done', None):
            return super(fc, self).runnable_status()
        bld = self.generator.bld
        lst = get_fortran_tasks(self)
        for tsk in lst:
            tsk.mod_fortran_done = True
        for tsk in lst:
            ret = tsk.runnable_status()
            if ret == Task.ASK_LATER:
                for x in lst:
                    x.mod_fortran_done = None
                return Task.ASK_LATER
        ins = Utils.defaultdict(set)
        outs = Utils.defaultdict(set)
        for tsk in lst:
            key = tsk.uid()
            for x in bld.raw_deps[key]:
                if x.startswith('MOD@'):
                    name = bld.modfile(x.replace('MOD@', ''))
                    node = bld.srcnode.find_or_declare(name)
                    tsk.set_outputs(node)
                    outs[node].add(tsk)
        for tsk in lst:
            key = tsk.uid()
            for x in bld.raw_deps[key]:
                if x.startswith('USE@'):
                    name = bld.modfile(x.replace('USE@', ''))
                    node = bld.srcnode.find_resource(name)
                    if node and node not in tsk.outputs:
                        if not node in bld.node_deps[key]:
                            bld.node_deps[key].append(node)
                        ins[node].add(tsk)
        for k in ins.keys():
            for a in ins[k]:
                a.run_after.update(outs[k])
                for x in outs[k]:
                    self.generator.bld.producer.revdeps[x].add(a)
                tmp = []
                for t in outs[k]:
                    tmp.extend(t.outputs)
                a.dep_nodes.extend(tmp)
                a.dep_nodes.sort(key=lambda x: x.abspath())
        for tsk in lst:
            try:
                delattr(tsk, 'cache_sig')
            except AttributeError:
                pass
        return super(fc, self).runnable_status()


class fcprogram(ccroot.link_task):
    color = 'YELLOW'
    run_str = '${FC} ${LINKFLAGS} ${FCLNK_SRC_F}${SRC} ${FCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FCSTLIB_MARKER} ${FCSTLIBPATH_ST:STLIBPATH} ${FCSTLIB_ST:STLIB} ${FCSHLIB_MARKER} ${FCLIBPATH_ST:LIBPATH} ${FCLIB_ST:LIB} ${LDFLAGS}'
    inst_to = '${BINDIR}'


class fcshlib(fcprogram):
    inst_to = '${LIBDIR}'


class fcstlib(ccroot.stlink_task):
    pass


class fcprogram_test(fcprogram):
    def runnable_status(self):
        ret = super(fcprogram_test, self).runnable_status()
        if ret == Task.SKIP_ME:
            ret = Task.RUN_ME
        return ret

    def exec_command(self, cmd, **kw):
        bld = self.generator.bld
        kw['shell'] = isinstance(cmd, str)
        kw['stdout'] = kw['stderr'] = Utils.subprocess.PIPE
        kw['cwd'] = self.get_cwd()
        bld.out = bld.err = ''
        bld.to_log('command: %s\n' % cmd)
        kw['output'] = 0
        try:
            (bld.out, bld.err) = bld.cmd_and_log(cmd, **kw)
        except Errors.WafError:
            return -1
        if bld.out:
            bld.to_log('out: %s\n' % bld.out)
        if bld.err:
            bld.to_log('err: %s\n' % bld.err)