Unpack waf; try to fix up debian/copyright.
[libcxml.git] / waflib / Tools / vala.py
diff --git a/waflib/Tools/vala.py b/waflib/Tools/vala.py
new file mode 100644 (file)
index 0000000..68af651
--- /dev/null
@@ -0,0 +1,211 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
+
+import re
+from waflib import Context,Task,Utils,Logs,Options,Errors,Node
+from waflib.TaskGen import extension,taskgen_method
+from waflib.Configure import conf
+class valac(Task.Task):
+       vars=["VALAC","VALAC_VERSION","VALAFLAGS"]
+       ext_out=['.h']
+       def run(self):
+               cmd=self.env.VALAC+self.env.VALAFLAGS
+               resources=getattr(self,'vala_exclude',[])
+               cmd.extend([a.abspath()for a in self.inputs if a not in resources])
+               ret=self.exec_command(cmd,cwd=self.vala_dir_node.abspath())
+               if ret:
+                       return ret
+               if self.generator.dump_deps_node:
+                       self.generator.dump_deps_node.write('\n'.join(self.generator.packages))
+               return ret
+valac=Task.update_outputs(valac)
+@taskgen_method
+def init_vala_task(self):
+       self.profile=getattr(self,'profile','gobject')
+       if self.profile=='gobject':
+               self.uselib=Utils.to_list(getattr(self,'uselib',[]))
+               if not'GOBJECT'in self.uselib:
+                       self.uselib.append('GOBJECT')
+       def addflags(flags):
+               self.env.append_value('VALAFLAGS',flags)
+       if self.profile:
+               addflags('--profile=%s'%self.profile)
+       valatask=self.valatask
+       if hasattr(self,'vala_dir'):
+               if isinstance(self.vala_dir,str):
+                       valatask.vala_dir_node=self.path.get_bld().make_node(self.vala_dir)
+                       try:
+                               valatask.vala_dir_node.mkdir()
+                       except OSError:
+                               raise self.bld.fatal('Cannot create the vala dir %r'%valatask.vala_dir_node)
+               else:
+                       valatask.vala_dir_node=self.vala_dir
+       else:
+               valatask.vala_dir_node=self.path.get_bld()
+       addflags('--directory=%s'%valatask.vala_dir_node.abspath())
+       if hasattr(self,'thread'):
+               if self.profile=='gobject':
+                       if not'GTHREAD'in self.uselib:
+                               self.uselib.append('GTHREAD')
+               else:
+                       Logs.warn("Profile %s means no threading support"%self.profile)
+                       self.thread=False
+               if self.thread:
+                       addflags('--thread')
+       self.is_lib='cprogram'not in self.features
+       if self.is_lib:
+               addflags('--library=%s'%self.target)
+               h_node=valatask.vala_dir_node.find_or_declare('%s.h'%self.target)
+               valatask.outputs.append(h_node)
+               addflags('--header=%s'%h_node.name)
+               valatask.outputs.append(valatask.vala_dir_node.find_or_declare('%s.vapi'%self.target))
+               if getattr(self,'gir',None):
+                       gir_node=valatask.vala_dir_node.find_or_declare('%s.gir'%self.gir)
+                       addflags('--gir=%s'%gir_node.name)
+                       valatask.outputs.append(gir_node)
+       self.vala_target_glib=getattr(self,'vala_target_glib',getattr(Options.options,'vala_target_glib',None))
+       if self.vala_target_glib:
+               addflags('--target-glib=%s'%self.vala_target_glib)
+       addflags(['--define=%s'%x for x in getattr(self,'vala_defines',[])])
+       packages_private=Utils.to_list(getattr(self,'packages_private',[]))
+       addflags(['--pkg=%s'%x for x in packages_private])
+       def _get_api_version():
+               api_version='1.0'
+               if hasattr(Context.g_module,'API_VERSION'):
+                       version=Context.g_module.API_VERSION.split(".")
+                       if version[0]=="0":
+                               api_version="0."+version[1]
+                       else:
+                               api_version=version[0]+".0"
+               return api_version
+       self.includes=Utils.to_list(getattr(self,'includes',[]))
+       self.uselib=self.to_list(getattr(self,'uselib',[]))
+       valatask.install_path=getattr(self,'install_path','')
+       valatask.vapi_path=getattr(self,'vapi_path','${DATAROOTDIR}/vala/vapi')
+       valatask.pkg_name=getattr(self,'pkg_name',self.env['PACKAGE'])
+       valatask.header_path=getattr(self,'header_path','${INCLUDEDIR}/%s-%s'%(valatask.pkg_name,_get_api_version()))
+       valatask.install_binding=getattr(self,'install_binding',True)
+       self.packages=packages=Utils.to_list(getattr(self,'packages',[]))
+       self.vapi_dirs=vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[]))
+       if hasattr(self,'use'):
+               local_packages=Utils.to_list(self.use)[:]
+               seen=[]
+               while len(local_packages)>0:
+                       package=local_packages.pop()
+                       if package in seen:
+                               continue
+                       seen.append(package)
+                       try:
+                               package_obj=self.bld.get_tgen_by_name(package)
+                       except Errors.WafError:
+                               continue
+                       package_name=package_obj.target
+                       for task in package_obj.tasks:
+                               for output in task.outputs:
+                                       if output.name==package_name+".vapi":
+                                               valatask.set_run_after(task)
+                                               if package_name not in packages:
+                                                       packages.append(package_name)
+                                               if output.parent not in vapi_dirs:
+                                                       vapi_dirs.append(output.parent)
+                                               if output.parent not in self.includes:
+                                                       self.includes.append(output.parent)
+                       if hasattr(package_obj,'use'):
+                               lst=self.to_list(package_obj.use)
+                               lst.reverse()
+                               local_packages=[pkg for pkg in lst if pkg not in seen]+local_packages
+       addflags(['--pkg=%s'%p for p in packages])
+       for vapi_dir in vapi_dirs:
+               if isinstance(vapi_dir,Node.Node):
+                       v_node=vapi_dir
+               else:
+                       v_node=self.path.find_dir(vapi_dir)
+               if not v_node:
+                       Logs.warn('Unable to locate Vala API directory: %r'%vapi_dir)
+               else:
+                       addflags('--vapidir=%s'%v_node.abspath())
+       self.dump_deps_node=None
+       if self.is_lib and self.packages:
+               self.dump_deps_node=valatask.vala_dir_node.find_or_declare('%s.deps'%self.target)
+               valatask.outputs.append(self.dump_deps_node)
+       self.includes.append(self.bld.srcnode.abspath())
+       self.includes.append(self.bld.bldnode.abspath())
+       if self.is_lib and valatask.install_binding:
+               headers_list=[o for o in valatask.outputs if o.suffix()==".h"]
+               try:
+                       self.install_vheader.source=headers_list
+               except AttributeError:
+                       self.install_vheader=self.bld.install_files(valatask.header_path,headers_list,self.env)
+               vapi_list=[o for o in valatask.outputs if(o.suffix()in(".vapi",".deps"))]
+               try:
+                       self.install_vapi.source=vapi_list
+               except AttributeError:
+                       self.install_vapi=self.bld.install_files(valatask.vapi_path,vapi_list,self.env)
+               gir_list=[o for o in valatask.outputs if o.suffix()=='.gir']
+               try:
+                       self.install_gir.source=gir_list
+               except AttributeError:
+                       self.install_gir=self.bld.install_files(getattr(self,'gir_path','${DATAROOTDIR}/gir-1.0'),gir_list,self.env)
+       if hasattr(self,'vala_resources'):
+               nodes=self.to_nodes(self.vala_resources)
+               valatask.vala_exclude=getattr(valatask,'vala_exclude',[])+nodes
+               valatask.inputs.extend(nodes)
+               for x in nodes:
+                       addflags(['--gresources',x.abspath()])
+@extension('.vala','.gs')
+def vala_file(self,node):
+       try:
+               valatask=self.valatask
+       except AttributeError:
+               valatask=self.valatask=self.create_task('valac')
+               self.init_vala_task()
+       valatask.inputs.append(node)
+       name=node.name[:node.name.rfind('.')]+'.c'
+       c_node=valatask.vala_dir_node.find_or_declare(name)
+       valatask.outputs.append(c_node)
+       self.source.append(c_node)
+@conf
+def find_valac(self,valac_name,min_version):
+       valac=self.find_program(valac_name,var='VALAC')
+       try:
+               output=self.cmd_and_log(valac+['--version'])
+       except Exception:
+               valac_version=None
+       else:
+               ver=re.search(r'\d+.\d+.\d+',output).group(0).split('.')
+               valac_version=tuple([int(x)for x in ver])
+       self.msg('Checking for %s version >= %r'%(valac_name,min_version),valac_version,valac_version and valac_version>=min_version)
+       if valac and valac_version<min_version:
+               self.fatal("%s version %r is too old, need >= %r"%(valac_name,valac_version,min_version))
+       self.env['VALAC_VERSION']=valac_version
+       return valac
+@conf
+def check_vala(self,min_version=(0,8,0),branch=None):
+       if not branch:
+               branch=min_version[:2]
+       try:
+               find_valac(self,'valac-%d.%d'%(branch[0],branch[1]),min_version)
+       except self.errors.ConfigurationError:
+               find_valac(self,'valac',min_version)
+@conf
+def check_vala_deps(self):
+       if not self.env['HAVE_GOBJECT']:
+               pkg_args={'package':'gobject-2.0','uselib_store':'GOBJECT','args':'--cflags --libs'}
+               if getattr(Options.options,'vala_target_glib',None):
+                       pkg_args['atleast_version']=Options.options.vala_target_glib
+               self.check_cfg(**pkg_args)
+       if not self.env['HAVE_GTHREAD']:
+               pkg_args={'package':'gthread-2.0','uselib_store':'GTHREAD','args':'--cflags --libs'}
+               if getattr(Options.options,'vala_target_glib',None):
+                       pkg_args['atleast_version']=Options.options.vala_target_glib
+               self.check_cfg(**pkg_args)
+def configure(self):
+       self.load('gnu_dirs')
+       self.check_vala_deps()
+       self.check_vala()
+       self.env.VALAFLAGS=['-C']
+def options(opt):
+       opt.load('gnu_dirs')
+       valaopts=opt.add_option_group('Vala Compiler Options')
+       valaopts.add_option('--vala-target-glib',default=None,dest='vala_target_glib',metavar='MAJOR.MINOR',help='Target version of glib for Vala GObject code generation')