jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.3KB

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