~ubuntu-branches/ubuntu/raring/xmms2/raring

« back to all changes in this revision

Viewing changes to waflib/Tools/fc.py

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-11-25 19:23:15 UTC
  • mto: This revision was merged to the branch mainline in revision 51.
  • Revision ID: package-import@ubuntu.com-20121125192315-m9z6nu9wwlzrrz9z
ImportĀ upstreamĀ versionĀ 0.8+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
 
2
# encoding: utf-8
 
3
# WARNING! Do not edit! http://waf.googlecode.com/svn/docs/wafbook/single.html#_obtaining_the_waf_file
 
4
 
 
5
import sys
 
6
if sys.hexversion < 0x020400f0: from sets import Set as set
 
7
import re
 
8
from waflib import Utils,Task,TaskGen,Logs
 
9
from waflib.Tools import ccroot,fc_config,fc_scan
 
10
from waflib.TaskGen import feature,before_method,after_method,extension
 
11
from waflib.Configure import conf
 
12
ccroot.USELIB_VARS['fc']=set(['FCFLAGS','DEFINES','INCLUDES'])
 
13
ccroot.USELIB_VARS['fcprogram_test']=ccroot.USELIB_VARS['fcprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
 
14
ccroot.USELIB_VARS['fcshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
 
15
ccroot.USELIB_VARS['fcstlib']=set(['ARFLAGS','LINKDEPS'])
 
16
def dummy(self):
 
17
        pass
 
18
def fc_hook(self,node):
 
19
        return self.create_compiled_task('fc',node)
 
20
def modfile(conf,name):
 
21
        return{'lower':name.lower()+'.mod','lower.MOD':name.upper()+'.MOD','UPPER.mod':name.upper()+'.mod','UPPER':name.upper()+'.MOD'}[conf.env.FC_MOD_CAPITALIZATION or'lower']
 
22
def get_fortran_tasks(tsk):
 
23
        bld=tsk.generator.bld
 
24
        tasks=bld.get_tasks_group(bld.get_group_idx(tsk.generator))
 
25
        return[x for x in tasks if isinstance(x,fc)and not getattr(x,'nomod',None)and not getattr(x,'mod_fortran_done',None)]
 
26
class fc(Task.Task):
 
27
        color='GREEN'
 
28
        run_str='${FC} ${FCFLAGS} ${FCINCPATH_ST:INCPATHS} ${FCDEFINES_ST:DEFINES} ${_FCMODOUTFLAGS} ${FC_TGT_F}${TGT[0].abspath()} ${FC_SRC_F}${SRC[0].abspath()}'
 
29
        vars=["FORTRANMODPATHFLAG"]
 
30
        def scan(self):
 
31
                tmp=fc_scan.fortran_parser(self.generator.includes_nodes)
 
32
                tmp.task=self
 
33
                tmp.start(self.inputs[0])
 
34
                if Logs.verbose:
 
35
                        Logs.debug('deps: deps for %r: %r; unresolved %r'%(self.inputs,tmp.nodes,tmp.names))
 
36
                return(tmp.nodes,tmp.names)
 
37
        def runnable_status(self):
 
38
                if getattr(self,'mod_fortran_done',None):
 
39
                        return super(fc,self).runnable_status()
 
40
                bld=self.generator.bld
 
41
                lst=get_fortran_tasks(self)
 
42
                for tsk in lst:
 
43
                        tsk.mod_fortran_done=True
 
44
                for tsk in lst:
 
45
                        ret=tsk.runnable_status()
 
46
                        if ret==Task.ASK_LATER:
 
47
                                for x in lst:
 
48
                                        x.mod_fortran_done=None
 
49
                                return Task.ASK_LATER
 
50
                ins=Utils.defaultdict(set)
 
51
                outs=Utils.defaultdict(set)
 
52
                for tsk in lst:
 
53
                        key=tsk.uid()
 
54
                        for x in bld.raw_deps[key]:
 
55
                                if x.startswith('MOD@'):
 
56
                                        name=bld.modfile(x.replace('MOD@',''))
 
57
                                        node=bld.srcnode.find_or_declare(name)
 
58
                                        tsk.set_outputs(node)
 
59
                                        outs[id(node)].add(tsk)
 
60
                for tsk in lst:
 
61
                        key=tsk.uid()
 
62
                        for x in bld.raw_deps[key]:
 
63
                                if x.startswith('USE@'):
 
64
                                        name=bld.modfile(x.replace('USE@',''))
 
65
                                        node=bld.srcnode.find_resource(name)
 
66
                                        if node and node not in tsk.outputs:
 
67
                                                if not node in bld.node_deps[key]:
 
68
                                                        bld.node_deps[key].append(node)
 
69
                                                ins[id(node)].add(tsk)
 
70
                for k in ins.keys():
 
71
                        for a in ins[k]:
 
72
                                a.run_after.update(outs[k])
 
73
                                tmp=[]
 
74
                                for t in outs[k]:
 
75
                                        tmp.extend(t.outputs)
 
76
                                a.dep_nodes.extend(tmp)
 
77
                                try:
 
78
                                        a.dep_nodes.sort(key=lambda x:x.abspath())
 
79
                                except:
 
80
                                        a.dep_nodes.sort(lambda x,y:cmp(x.abspath(),y.abspath()))
 
81
                for tsk in lst:
 
82
                        try:
 
83
                                delattr(tsk,'cache_sig')
 
84
                        except AttributeError:
 
85
                                pass
 
86
                return super(fc,self).runnable_status()
 
87
class fcprogram(ccroot.link_task):
 
88
        color='YELLOW'
 
89
        run_str='${FC} ${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} ${LINKFLAGS}'
 
90
        inst_to='${BINDIR}'
 
91
        chmod=Utils.O755
 
92
class fcshlib(fcprogram):
 
93
        inst_to='${LIBDIR}'
 
94
class fcprogram_test(fcprogram):
 
95
        def can_retrieve_cache(self):
 
96
                return False
 
97
        def runnable_status(self):
 
98
                ret=super(fcprogram_test,self).runnable_status()
 
99
                if ret==Task.SKIP_ME:
 
100
                        ret=Task.RUN_ME
 
101
                return ret
 
102
        def exec_command(self,cmd,**kw):
 
103
                bld=self.generator.bld
 
104
                kw['shell']=isinstance(cmd,str)
 
105
                kw['stdout']=kw['stderr']=Utils.subprocess.PIPE
 
106
                kw['cwd']=bld.variant_dir
 
107
                bld.out=bld.err=''
 
108
                bld.to_log('command: %s\n'%cmd)
 
109
                kw['output']=0
 
110
                try:
 
111
                        (bld.out,bld.err)=bld.cmd_and_log(cmd,**kw)
 
112
                except Exception ,e:
 
113
                        return-1
 
114
                if bld.out:
 
115
                        bld.to_log("out: %s\n"%bld.out)
 
116
                if bld.err:
 
117
                        bld.to_log("err: %s\n"%bld.err)
 
118
class fcstlib(ccroot.stlink_task):
 
119
        pass
 
120
 
 
121
feature('fcprogram','fcshlib','fcstlib','fcprogram_test')(dummy)
 
122
extension('.f','.f90','.F','.F90','.for','.FOR')(fc_hook)
 
123
conf(modfile)
 
 
b'\\ No newline at end of file'