third_party:waf: update to upstream 2.0.4 release
[amitay/samba.git] / third_party / waf / waflib / extras / scala.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
4
5 #!/usr/bin/env python
6 # encoding: utf-8
7 # Thomas Nagy, 2010 (ita)
8
9 """
10 Scala support
11
12 scalac outputs files a bit where it wants to
13 """
14
15 import os
16 from waflib import Task, Utils, Node
17 from waflib.TaskGen import feature, before_method, after_method
18
19 from waflib.Tools import ccroot
20 ccroot.USELIB_VARS['scalac'] = set(['CLASSPATH', 'SCALACFLAGS'])
21
22 from waflib.Tools import javaw
23
24 @feature('scalac')
25 @before_method('process_source')
26 def apply_scalac(self):
27
28         Utils.def_attrs(self, jarname='', classpath='',
29                 sourcepath='.', srcdir='.',
30                 jar_mf_attributes={}, jar_mf_classpath=[])
31
32         outdir = getattr(self, 'outdir', None)
33         if outdir:
34                 if not isinstance(outdir, Node.Node):
35                         outdir = self.path.get_bld().make_node(self.outdir)
36         else:
37                 outdir = self.path.get_bld()
38         outdir.mkdir()
39         self.env['OUTDIR'] = outdir.abspath()
40
41         self.scalac_task = tsk = self.create_task('scalac')
42         tmp = []
43
44         srcdir = getattr(self, 'srcdir', '')
45         if isinstance(srcdir, Node.Node):
46                 srcdir = [srcdir]
47         for x in Utils.to_list(srcdir):
48                 if isinstance(x, Node.Node):
49                         y = x
50                 else:
51                         y = self.path.find_dir(x)
52                         if not y:
53                                 self.bld.fatal('Could not find the folder %s from %s' % (x, self.path))
54                 tmp.append(y)
55         tsk.srcdir = tmp
56
57 # reuse some code
58 feature('scalac')(javaw.use_javac_files)
59 after_method('apply_scalac')(javaw.use_javac_files)
60
61 feature('scalac')(javaw.set_classpath)
62 after_method('apply_scalac', 'use_scalac_files')(javaw.set_classpath)
63
64
65 SOURCE_RE = '**/*.scala'
66 class scalac(javaw.javac):
67         color = 'GREEN'
68         vars    = ['CLASSPATH', 'SCALACFLAGS', 'SCALAC', 'OUTDIR']
69
70         def runnable_status(self):
71                 """
72                 Wait for dependent tasks to be complete, then read the file system to find the input nodes.
73                 """
74                 for t in self.run_after:
75                         if not t.hasrun:
76                                 return Task.ASK_LATER
77
78                 if not self.inputs:
79                         global SOURCE_RE
80                         self.inputs  = []
81                         for x in self.srcdir:
82                                 self.inputs.extend(x.ant_glob(SOURCE_RE, remove=False))
83                 return super(javaw.javac, self).runnable_status()
84
85         def run(self):
86                 """
87                 Execute the scalac compiler
88                 """
89                 env = self.env
90                 gen = self.generator
91                 bld = gen.bld
92                 wd = bld.bldnode.abspath()
93                 def to_list(xx):
94                         if isinstance(xx, str):
95                                 return [xx]
96                         return xx
97                 self.last_cmd = lst = []
98                 lst.extend(to_list(env['SCALAC']))
99                 lst.extend(['-classpath'])
100                 lst.extend(to_list(env['CLASSPATH']))
101                 lst.extend(['-d'])
102                 lst.extend(to_list(env['OUTDIR']))
103                 lst.extend(to_list(env['SCALACFLAGS']))
104                 lst.extend([a.abspath() for a in self.inputs])
105                 lst = [x for x in lst if x]
106                 try:
107                         self.out = self.generator.bld.cmd_and_log(lst, cwd=wd, env=env.env or None, output=0, quiet=0)[1]
108                 except:
109                         self.generator.bld.cmd_and_log(lst, cwd=wd, env=env.env or None)
110
111 def configure(self):
112         """
113         Detect the scalac program
114         """
115         # If SCALA_HOME is set, we prepend it to the path list
116         java_path = self.environ['PATH'].split(os.pathsep)
117         v = self.env
118
119         if 'SCALA_HOME' in self.environ:
120                 java_path = [os.path.join(self.environ['SCALA_HOME'], 'bin')] + java_path
121                 self.env['SCALA_HOME'] = [self.environ['SCALA_HOME']]
122
123         for x in 'scalac scala'.split():
124                 self.find_program(x, var=x.upper(), path_list=java_path)
125
126         if 'CLASSPATH' in self.environ:
127                 v['CLASSPATH'] = self.environ['CLASSPATH']
128
129         v.SCALACFLAGS = ['-verbose']
130         if not v['SCALAC']:
131                 self.fatal('scalac is required for compiling scala classes')
132