waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

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