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