Package wafadmin :: Package Tools :: Module vala
[hide private]
[frames] | no frames]

Source Code for Module wafadmin.Tools.vala

  1  #!/usr/bin/env python 
  2  # encoding: utf-8 
  3  # Ali Sabil, 2007 
  4   
  5  import os.path, shutil 
  6  import Task, Runner, Utils, Logs, Build 
  7  from TaskGen import extension 
  8   
  9  from pproc import Popen, PIPE 
 10   
 11  EXT_VALA = ['.vala', '.gs'] 
12 13 -class valac_task(Task.Task):
14 15 before = ("cc", "cxx") 16
17 - def __init__(self, *args, **kwargs):
18 Task.Task.__init__(self, *args, **kwargs)
19
20 - def get_str(self):
21 src_str = " ".join([a.name for a in self.inputs]) 22 return "%s: %s\n" % (self.__class__.__name__, src_str)
23
24 - def run(self):
25 task = self # TODO cleanup 26 env = task.env 27 inputs = [a.srcpath(env) for a in task.inputs] 28 valac = env['VALAC'] 29 vala_flags = env.get_flat('VALAFLAGS') 30 top_src = Build.bld.srcnode.abspath() 31 top_bld = Build.bld.srcnode.abspath(env) 32 33 if env['VALAC_VERSION'] > (0, 1, 6): 34 cmd = [valac, '-C', '--quiet', vala_flags] 35 else: 36 cmd = [valac, '-C', vala_flags] 37 38 if task.threading: 39 cmd.append('--thread') 40 41 if task.output_type in ('shlib', 'staticlib'): 42 cmd.append('--library ' + task.target) 43 cmd.append('--basedir ' + top_src) 44 cmd.append('-d ' + top_bld) 45 #cmd.append('-d %s' % Build.bld.bldnode.bldpath(env)) 46 else: 47 output_dir = task.outputs[0].bld_dir(env) 48 cmd.append('-d %s' % output_dir) 49 50 for vapi_dir in task.vapi_dirs: 51 cmd.append('--vapidir=%s' % vapi_dir) 52 53 for package in task.packages: 54 cmd.append('--pkg %s' % package) 55 56 cmd.append(" ".join(inputs)) 57 result = Runner.exec_command(" ".join(cmd)) 58 59 if task.output_type in ('shlib', 'staticlib'): 60 # generate the .deps file 61 if task.packages: 62 filename = os.path.join(task.outputs[0].bld_dir(env), "%s.deps" % task.target) 63 deps = open(filename, 'w') 64 for package in task.packages: 65 deps.write(package + '\n') 66 deps.close() 67 68 # handle vala 0.1.6 who doesn't honor --directory for the generated .vapi 69 try: 70 src_vapi = os.path.join(top_bld, "..", "%s.vapi" % task.target) 71 dst_vapi = task.outputs[0].bld_dir(env) 72 shutil.move(src_vapi, dst_vapi) 73 except IOError: 74 pass 75 # handle vala >= 0.1.7 who has a weid definition for --directory 76 try: 77 src_vapi = os.path.join(top_bld, "%s.vapi" % task.target) 78 dst_vapi = task.outputs[0].bld_dir(env) 79 shutil.move(src_vapi, dst_vapi) 80 except IOError: 81 pass 82 83 # handle vala >= 0.2.0 who doesn't honor --directory for the generated .gidl 84 try: 85 src_gidl = os.path.join(top_bld, "%s.gidl" % task.target) 86 dst_gidl = task.outputs[0].bld_dir(env) 87 shutil.move(src_gidl, dst_gidl) 88 except IOError: 89 pass 90 return result
91
92 @extension(EXT_VALA) 93 -def vala_file(self, node):
94 valatask = getattr(self, "valatask", None) 95 # there is only one vala task and it compiles all vala files .. :-/ 96 if not valatask: 97 valatask = self.create_task('valac') 98 self.valatask = valatask 99 valatask.output_type = self.type 100 valatask.packages = [] 101 valatask.vapi_dirs = [] 102 valatask.target = self.target 103 valatask.threading = False 104 105 if hasattr(self, 'packages'): 106 valatask.packages = Utils.to_list(self.packages) 107 108 if hasattr(self, 'vapi_dirs'): 109 vapi_dirs = Utils.to_list(self.vapi_dirs) 110 for vapi_dir in vapi_dirs: 111 try: 112 valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath()) 113 valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath(self.env)) 114 except AttributeError: 115 Logs.warn("Unable to locate Vala API directory: '%s'" % vapi_dir) 116 117 if hasattr(self, 'threading'): 118 valatask.threading = self.threading 119 self.uselib = self.to_list(self.uselib) 120 if not 'GTHREAD' in self.uselib: 121 self.uselib.append('GTHREAD') 122 123 env = valatask.env 124 125 output_nodes = [] 126 output_nodes.append(node.change_ext('.c')) 127 output_nodes.append(node.change_ext('.h')) 128 if self.type != 'program': 129 output_nodes.append(self.path.find_or_declare('%s.vapi' % self.target)) 130 if env['VALAC_VERSION'] > (0, 1, 7): 131 output_nodes.append(self.path.find_or_declare('%s.gidl' % self.target)) 132 if valatask.packages: 133 output_nodes.append(self.path.find_or_declare('%s.deps' % self.target)) 134 135 valatask.inputs.append(node) 136 valatask.outputs.extend(output_nodes) 137 self.allnodes.append(node.change_ext('.c'))
138
139 -def detect(conf):
140 min_version = (0, 1, 6) 141 min_version_str = "%d.%d.%d" % min_version 142 143 valac = conf.find_program('valac', var='VALAC') 144 if not valac: 145 conf.fatal("valac not found") 146 return 147 148 if not conf.env["HAVE_GTHREAD"]: 149 conf.check_pkg('gthread-2.0', destvar='GTHREAD', mandatory=False) 150 151 try: 152 output = Popen([valac, "--version"], stdout=PIPE).communicate()[0] 153 version = output.split(' ', 1)[-1].strip().split(".") 154 version = [int(x) for x in version] 155 valac_version = tuple(version) 156 except Exception: 157 valac_version = (0, 0, 0) 158 159 conf.check_message('program version', 160 'valac >= ' + min_version_str, 161 valac_version >= min_version, 162 "%d.%d.%d" % valac_version) 163 164 if valac_version < min_version: 165 conf.fatal("valac version too old to be used with this tool") 166 return 167 168 conf.env['VALAC_VERSION'] = valac_version 169 conf.env['VALAFLAGS'] = ''
170