#! /usr/bin/env python # encoding: utf-8 import os,re import Configure,TaskGen,Task,Utils,Runner,Options,Build,config_c from TaskGen import feature,before,taskgen from Logs import error class intltool_in_taskgen(TaskGen.task_gen): def __init__(self,*k,**kw): TaskGen.task_gen.__init__(self,*k,**kw) def iapply_intltool_in_f(self): try:self.meths.remove('apply_core') except ValueError:pass for i in self.to_list(self.source): node=self.path.find_resource(i) podir=getattr(self,'podir','po') podirnode=self.path.find_dir(podir) if not podirnode: error("could not find the podir %r"%podir) continue cache=getattr(self,'intlcache','.intlcache') self.env['INTLCACHE']=os.path.join(self.path.bldpath(self.env),podir,cache) self.env['INTLPODIR']=podirnode.srcpath(self.env) self.env['INTLFLAGS']=getattr(self,'flags',['-q','-u','-c']) task=self.create_task('intltool',node,node.change_ext('')) task.install_path=self.install_path class intltool_po_taskgen(TaskGen.task_gen): def __init__(self,*k,**kw): TaskGen.task_gen.__init__(self,*k,**kw) def apply_intltool_po(self): try:self.meths.remove('apply_core') except ValueError:pass self.default_install_path='${LOCALEDIR}' appname=getattr(self,'appname','set_your_app_name') podir=getattr(self,'podir','') def install_translation(task): out=task.outputs[0] filename=out.name (langname,ext)=os.path.splitext(filename) inst_file=langname+os.sep+'LC_MESSAGES'+os.sep+appname+'.mo' self.bld.install_as(os.path.join(self.install_path,inst_file),out,self.env,self.chmod) linguas=self.path.find_resource(os.path.join(podir,'LINGUAS')) if linguas: file=open(linguas.abspath()) langs=[] for line in file.readlines(): if not line.startswith('#'): langs+=line.split() file.close() re_linguas=re.compile('[-a-zA-Z_@.]+') for lang in langs: if re_linguas.match(lang): node=self.path.find_resource(os.path.join(podir,re_linguas.match(lang).group()+'.po')) task=self.create_task('po') task.set_inputs(node) task.set_outputs(node.change_ext('.mo')) if self.bld.is_install:task.install=install_translation else: Utils.pprint('RED',"Error no LINGUAS file found in po directory") Task.simple_task_type('po','${POCOM} -o ${TGT} ${SRC}',color='BLUE',shell=False) Task.simple_task_type('intltool','${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}',color='BLUE',after="cc_link cxx_link",shell=False) def detect(conf): pocom=conf.find_program('msgfmt') if not pocom: conf.fatal('The program msgfmt (gettext) is mandatory!') conf.env['POCOM']=pocom intltool=conf.find_program('intltool-merge',var='INTLTOOL') if not intltool: if Options.platform=='win32': perl=conf.find_program('perl',var='PERL') if not perl: conf.fatal('The program perl (required by intltool) could not be found') intltooldir=Configure.find_file('intltool-merge',os.environ['PATH'].split(os.pathsep)) if not intltooldir: conf.fatal('The program intltool-merge (intltool, gettext-devel) is mandatory!') conf.env['INTLTOOL']=Utils.to_list(conf.env['PERL'])+[intltooldir+os.sep+'intltool-merge'] conf.check_message('intltool','',True,' '.join(conf.env['INTLTOOL'])) else: conf.fatal('The program intltool-merge (intltool, gettext-devel) is mandatory!') def getstr(varname): return getattr(Options.options,varname,'') prefix=conf.env['PREFIX'] datadir=getstr('datadir') if not datadir:datadir=os.path.join(prefix,'share') conf.define('LOCALEDIR',os.path.join(datadir,'locale')) conf.define('DATADIR',datadir) if conf.env['CC']or conf.env['CXX']: conf.check(header_name='locale.h') def set_options(opt): opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]') opt.add_option('--datadir',type='string',default='',dest='datadir',help='read-only application data') before('apply_core')(iapply_intltool_in_f) feature('intltool_in')(iapply_intltool_in_f) feature('intltool_po')(apply_intltool_po)