| #! /usr/bin/env python |
| # encoding: utf-8 |
| # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file |
| |
| import os.path,shutil,re |
| from waflib import Context,Task,Utils,Logs,Options,Errors |
| from waflib.TaskGen import extension |
| from waflib.Configure import conf |
| class valac(Task.Task): |
| vars=["VALAC","VALAC_VERSION","VALAFLAGS"] |
| ext_out=['.h'] |
| def run(self): |
| env=self.env |
| cmd=[env['VALAC'],'-C','--quiet'] |
| cmd.extend(Utils.to_list(env['VALAFLAGS'])) |
| if self.threading: |
| cmd.append('--thread') |
| if self.profile: |
| cmd.append('--profile=%s'%self.profile) |
| if self.target_glib: |
| cmd.append('--target-glib=%s'%self.target_glib) |
| if self.is_lib: |
| cmd.append('--library='+self.target) |
| for x in self.outputs: |
| if x.name.endswith('.h'): |
| cmd.append('--header='+x.name) |
| if self.gir: |
| cmd.append('--gir=%s.gir'%self.gir) |
| for vapi_dir in self.vapi_dirs: |
| cmd.append('--vapidir=%s'%vapi_dir) |
| for package in self.packages: |
| cmd.append('--pkg=%s'%package) |
| for package in self.packages_private: |
| cmd.append('--pkg=%s'%package) |
| for define in self.vala_defines: |
| cmd.append('--define=%s'%define) |
| cmd.extend([a.abspath()for a in self.inputs]) |
| ret=self.exec_command(cmd,cwd=self.outputs[0].parent.abspath()) |
| if ret: |
| return ret |
| for x in self.outputs: |
| if id(x.parent)!=id(self.outputs[0].parent): |
| shutil.move(self.outputs[0].parent.abspath()+os.sep+x.name,x.abspath()) |
| if self.packages and getattr(self,'deps_node',None): |
| self.deps_node.write('\n'.join(self.packages)) |
| return ret |
| def vala_file(self,node): |
| valatask=getattr(self,"valatask",None) |
| if not valatask: |
| 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 |
| valatask=self.create_task('valac') |
| self.valatask=valatask |
| self.includes=Utils.to_list(getattr(self,'includes',[])) |
| self.uselib=self.to_list(getattr(self,'uselib',[])) |
| valatask.packages=[] |
| valatask.packages_private=Utils.to_list(getattr(self,'packages_private',[])) |
| valatask.vapi_dirs=[] |
| valatask.target=self.target |
| valatask.threading=False |
| valatask.install_path=getattr(self,'install_path','') |
| valatask.profile=getattr(self,'profile','gobject') |
| valatask.vala_defines=getattr(self,'vala_defines',[]) |
| valatask.target_glib=None |
| valatask.gir=getattr(self,'gir',None) |
| valatask.gir_path=getattr(self,'gir_path','${DATAROOTDIR}/gir-1.0') |
| 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) |
| valatask.is_lib=False |
| if not'cprogram'in self.features: |
| valatask.is_lib=True |
| packages=Utils.to_list(getattr(self,'packages',[])) |
| vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[])) |
| includes=[] |
| 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 |
| package_node=package_obj.path |
| package_dir=package_node.path_from(self.path) |
| 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 package_dir not in vapi_dirs: |
| vapi_dirs.append(package_dir) |
| if package_dir not in includes: |
| includes.append(package_dir) |
| 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 |
| valatask.packages=packages |
| for vapi_dir in vapi_dirs: |
| try: |
| valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath()) |
| valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).get_bld().abspath()) |
| except AttributeError: |
| Logs.warn("Unable to locate Vala API directory: '%s'"%vapi_dir) |
| self.includes.append(self.bld.srcnode.abspath()) |
| self.includes.append(self.bld.bldnode.abspath()) |
| for include in includes: |
| try: |
| self.includes.append(self.path.find_dir(include).abspath()) |
| self.includes.append(self.path.find_dir(include).get_bld().abspath()) |
| except AttributeError: |
| Logs.warn("Unable to locate include directory: '%s'"%include) |
| if valatask.profile=='gobject': |
| if hasattr(self,'target_glib'): |
| Logs.warn('target_glib on vala tasks is not supported --vala-target-glib=MAJOR.MINOR from the vala tool options') |
| if getattr(Options.options,'vala_target_glib',None): |
| valatask.target_glib=Options.options.vala_target_glib |
| if not'GOBJECT'in self.uselib: |
| self.uselib.append('GOBJECT') |
| if hasattr(self,'threading'): |
| if valatask.profile=='gobject': |
| valatask.threading=self.threading |
| if not'GTHREAD'in self.uselib: |
| self.uselib.append('GTHREAD') |
| else: |
| Logs.warn("Profile %s does not have threading support"%valatask.profile) |
| if valatask.is_lib: |
| valatask.outputs.append(self.path.find_or_declare('%s.h'%self.target)) |
| valatask.outputs.append(self.path.find_or_declare('%s.vapi'%self.target)) |
| if valatask.gir: |
| valatask.outputs.append(self.path.find_or_declare('%s.gir'%self.gir)) |
| if valatask.packages: |
| d=self.path.find_or_declare('%s.deps'%self.target) |
| valatask.outputs.append(d) |
| valatask.deps_node=d |
| valatask.inputs.append(node) |
| c_node=node.change_ext('.c') |
| valatask.outputs.append(c_node) |
| self.source.append(c_node) |
| if valatask.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(valatask.gir_path,gir_list,self.env) |
| valac=Task.update_outputs(valac) |
| 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 |
| 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) |
| 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() |
| 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') |
| |
| extension('.vala','.gs')(vala_file) |
| conf(find_valac) |
| conf(check_vala) |
| conf(check_vala_deps) |