1
2
3
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']
14
15 before = ("cc", "cxx")
16
19
21 src_str = " ".join([a.name for a in self.inputs])
22 return "%s: %s\n" % (self.__class__.__name__, src_str)
23
25 task = self
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
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
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
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
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
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
94 valatask = getattr(self, "valatask", None)
95
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
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