#! /usr/bin/env python
# encoding: utf-8
import os,re
import TaskGen,Utils,Runner,Task,Build,Options,Logs
import cc
from Logs import error
from TaskGen import taskgen,before,after,feature
n1_regexp=re.compile('(.*)',re.M)
n2_regexp=re.compile('(.*)',re.M)
def postinstall_schemas(prog_name):
if Build.bld.is_install:
dir=Build.bld.get_install_path('${PREFIX}/etc/gconf/schemas/%s.schemas'%prog_name)
if not Options.options.destdir:
Utils.pprint('YELLOW','Installing GConf schema')
command='gconftool-2 --install-schema-file=%s 1> /dev/null'%dir
ret=Utils.exec_command(command)
else:
Utils.pprint('YELLOW','GConf schema not installed. After install, run this:')
Utils.pprint('YELLOW','gconftool-2 --install-schema-file=%s'%dir)
def postinstall_icons():
dir=Build.bld.get_install_path('${DATADIR}/icons/hicolor')
if Build.bld.is_install:
if not Options.options.destdir:
Utils.pprint('YELLOW',"Updating Gtk icon cache.")
command='gtk-update-icon-cache -q -f -t %s'%dir
ret=Utils.exec_command(command)
else:
Utils.pprint('YELLOW','Icon cache not updated. After install, run this:')
Utils.pprint('YELLOW','gtk-update-icon-cache -q -f -t %s'%dir)
def postinstall_scrollkeeper(prog_name):
if Build.bld.is_install:
if os.access('/var/log/scrollkeeper.log',os.W_OK):
dir1=Build.bld.get_install_path('${PREFIX}/var/scrollkeeper')
dir2=Build.bld.get_install_path('${DATADIR}/omf/%s'%prog_name)
command='scrollkeeper-update -q -p %s -o %s'%(dir1,dir2)
ret=Utils.exec_command(command)
def postinstall(prog_name='myapp',schemas=1,icons=1,scrollkeeper=1):
if schemas:postinstall_schemas(prog_name)
if icons:postinstall_icons()
if scrollkeeper:postinstall_scrollkeeper(prog_name)
class gnome_doc_taskgen(TaskGen.task_gen):
def __init__(self,*k,**kw):
TaskGen.task_gen.__init__(self,*k,**kw)
def init_gnome_doc(self):
self.default_install_path='${PREFIX}/share'
def apply_gnome_doc(self):
self.env['APPNAME']=self.doc_module
lst=self.to_list(self.doc_linguas)
bld=self.bld
lst.append('C')
for x in lst:
if not x=='C':
tsk=self.create_task('xml2po')
node=self.path.find_resource(x+'/'+x+'.po')
src=self.path.find_resource('C/%s.xml'%self.doc_module)
out=self.path.find_or_declare('%s/%s.xml'%(x,self.doc_module))
tsk.set_inputs([node,src])
tsk.set_outputs(out)
else:
out=self.path.find_resource('%s/%s.xml'%(x,self.doc_module))
tsk2=self.create_task('xsltproc2po')
out2=self.path.find_or_declare('%s/%s-%s.omf'%(x,self.doc_module,x))
tsk2.set_outputs(out2)
node=self.path.find_resource(self.doc_module+".omf.in")
tsk2.inputs=[node,out]
tsk2.run_after.append(tsk)
if bld.is_install:
path=self.install_path+'/gnome/help/%s/%s'%(self.doc_module,x)
bld.install_files(self.install_path+'/omf',out2,env=self.env)
for y in self.to_list(self.doc_figures):
try:
os.stat(self.path.abspath()+'/'+x+'/'+y)
bld.install_as(path+'/'+y,self.path.abspath()+'/'+x+'/'+y)
except:
bld.install_as(path+'/'+y,self.path.abspath()+'/C/'+y)
bld.install_as(path+'/%s.xml'%self.doc_module,out.abspath(self.env))
if x=='C':
xmls=self.to_list(self.doc_includes)
xmls.append(self.doc_entities)
for z in xmls:
out=self.path.find_resource('%s/%s'%(x,z))
bld.install_as(path+'/%s'%z,out.abspath(self.env))
class xml_to_taskgen(TaskGen.task_gen):
def __init__(self,*k,**kw):
TaskGen.task_gen.__init__(self,*k,**kw)
def init_xml_to(self):
Utils.def_attrs(self,source='xmlfile',xslt='xlsltfile',target='hey',default_install_path='${PREFIX}',task_created=None)
def apply_xml_to(self):
xmlfile=self.path.find_resource(self.source)
xsltfile=self.path.find_resource(self.xslt)
tsk=self.create_task('xmlto',[xmlfile,xsltfile],xmlfile.change_ext('html'))
tsk.install_path=self.install_path
def sgml_scan(self):
node=self.inputs[0]
env=self.env
variant=node.variant(env)
fi=open(node.abspath(env),'r')
content=fi.read()
fi.close()
name=n1_regexp.findall(content)[0]
num=n2_regexp.findall(content)[0]
doc_name=name+'.'+num
if not self.outputs:
self.outputs=[self.generator.path.find_or_declare(doc_name)]
return([],[doc_name])
class gnome_sgml2man_taskgen(TaskGen.task_gen):
def __init__(self,*k,**kw):
TaskGen.task_gen.__init__(self,*k,**kw)
def apply_gnome_sgml2man(self):
assert(getattr(self,'appname',None))
def install_result(task):
out=task.outputs[0]
name=out.name
ext=name[-1]
env=task.env
self.bld.install_files('${DATADIR}/man/man%s/'%ext,out,env)
self.bld.rescan(self.path)
for name in self.bld.cache_dir_contents[self.path.id]:
base,ext=os.path.splitext(name)
if ext!='.sgml':continue
task=self.create_task('sgml2man')
task.set_inputs(self.path.find_resource(name))
task.task_generator=self
if self.bld.is_install:task.install=install_result
task.scan()
cls=Task.simple_task_type('sgml2man','${SGML2MAN} -o ${TGT[0].bld_dir(env)} ${SRC} > /dev/null',color='BLUE')
cls.scan=sgml_scan
cls.quiet=1
Task.simple_task_type('xmlto','${XMLTO} html -m ${SRC[1].abspath(env)} ${SRC[0].abspath(env)}')
Task.simple_task_type('xml2po','${XML2PO} ${XML2POFLAGS} ${SRC} > ${TGT}',color='BLUE')
xslt_magic="""${XSLTPROC2PO} -o ${TGT[0].abspath(env)} \
--stringparam db2omf.basename ${APPNAME} \
--stringparam db2omf.format docbook \
--stringparam db2omf.lang ${TGT[0].abspath(env)[:-4].split('-')[-1]} \
--stringparam db2omf.dtd '-//OASIS//DTD DocBook XML V4.3//EN' \
--stringparam db2omf.omf_dir ${PREFIX}/share/omf \
--stringparam db2omf.help_dir ${PREFIX}/share/gnome/help \
--stringparam db2omf.omf_in ${SRC[0].abspath(env)} \
--stringparam db2omf.scrollkeeper_cl ${SCROLLKEEPER_DATADIR}/Templates/C/scrollkeeper_cl.xml \
${DB2OMF} ${SRC[1].abspath(env)}"""
Task.simple_task_type('xsltproc2po',xslt_magic,color='BLUE')
def detect(conf):
conf.check_tool('gnu_dirs glib2 dbus')
sgml2man=conf.find_program('docbook2man',var='SGML2MAN')
def getstr(varname):
return getattr(Options.options,varname,'')
conf.define('GNOMELOCALEDIR',os.path.join(conf.env['DATADIR'],'locale'))
xml2po=conf.find_program('xml2po',var='XML2PO')
xsltproc2po=conf.find_program('xsltproc',var='XSLTPROC2PO')
conf.env['XML2POFLAGS']='-e -p'
conf.env['SCROLLKEEPER_DATADIR']=Utils.cmd_output("scrollkeeper-config --pkgdatadir",silent=1).strip()
conf.env['DB2OMF']=Utils.cmd_output("/usr/bin/pkg-config --variable db2omf gnome-doc-utils",silent=1).strip()
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]')
feature('gnome_doc')(init_gnome_doc)
feature('gnome_doc')(apply_gnome_doc)
after('init_gnome_doc')(apply_gnome_doc)
feature('xml_to')(init_xml_to)
feature('xml_to')(apply_xml_to)
after('init_xml_to')(apply_xml_to)
feature('gnome_sgml2man')(apply_gnome_sgml2man)