#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006 (ita) "Gnome support" import os, re import Object, Action, Params, Common, Scan, Utils import cc from Params import fatal, error n1_regexp = re.compile('(.*)', re.M) n2_regexp = re.compile('(.*)', re.M) class sgml_man_scanner(Scan.scanner): def __init__(self): Scan.scanner.__init__(self) def scan(self, node, env): variant = node.variant(env) fi = open(node.abspath(env), 'r') content = fi.read() fi.close() names = n1_regexp.findall(content) nums = n2_regexp.findall(content) name = names[0] num = nums[0] doc_name = name+'.'+num return ([], [doc_name]) sgml_scanner = sgml_man_scanner() # intltool class gnome_intltool(Object.genobj): def __init__(self): Object.genobj.__init__(self, 'other') self.source = '' self.destvar = '' self.subdir = '' self.flags = '' self.m_tasks = [] def apply(self): self.env = self.env.copy() tree = Params.g_build current = tree.m_curdirnode for i in self.to_list(self.source): node = self.path.find_source(i) podirnode = self.path.find_source(self.podir) self.env['INTLCACHE'] = Utils.join_path(Params.g_build.m_curdirnode.bldpath(self.env),".intlcache") self.env['INTLPODIR'] = podirnode.bldpath(self.env) self.env['INTLFLAGS'] = self.flags task = self.create_task('intltool', self.env, 2) task.set_inputs(node) task.set_outputs(node.change_ext('')) def install(self): current = Params.g_build.m_curdirnode for task in self.m_tasks: out = task.m_outputs[0] Common.install_files(self.destvar, self.subdir, out.abspath(self.env), self.env) # sgml2man class gnome_sgml2man(Object.genobj): def __init__(self, appname): Object.genobj.__init__(self, 'other') self.m_tasks=[] self.m_appname = appname def apply(self): tree = Params.g_build for node in self.path.files(): try: base, ext = os.path.splitext(node.m_name) if ext != '.sgml': continue if tree.needs_rescan(node, self.env): sgml_scanner.do_scan(node, self.env, hashparams={}) variant = node.variant(self.env) try: tmp_lst = tree.m_raw_deps[variant][node] except: tmp_lst = [] name = tmp_lst[0] task = self.create_task('sgml2man', self.env, 2) task.set_inputs(node) task.set_outputs(self.path.find_build(name)) except: raise pass def install(self): current = Params.g_build.m_curdirnode for task in self.m_tasks: out = task.m_outputs[0] # get the number 1..9 name = out.m_name ext = name[-1] # and install the file Common.install_files('DATADIR', 'man/man%s/' % ext, out.abspath(self.env), self.env) # translations class gnome_translations(Object.genobj): def __init__(self, appname): Object.genobj.__init__(self, 'other') self.m_tasks=[] self.m_appname = appname def apply(self): for file in self.path.files(): try: base, ext = os.path.splitext(file.m_name) if ext != '.po': continue task = self.create_task('po', self.env, 2) task.set_inputs(file) task.set_outputs(file.change_ext('.gmo')) except: pass def install(self): destfilename = self.m_appname+'.mo' current = Params.g_build.m_curdirnode for file in self.path.files(): lang, ext = os.path.splitext(file.m_name) if ext != '.po': continue node = self.path.find_source(lang+'.gmo') orig = node.relpath_gen(current) destfile = Utils.join_path(lang, 'LC_MESSAGES', destfilename) Common.install_as('GNOMELOCALEDIR', destfile, orig, self.env) class gnomeobj(cc.ccobj): def __init__(self, type='program'): cc.ccobj.__init__(self, type) self.m_linktask = None self.m_latask = None self.want_libtool = -1 # fake libtool here self._dbus_lst = [] self._marshal_lst = [] def add_dbus_file(self, filename, prefix, mode): self._dbus_lst.append([filename, prefix, mode]) def add_marshal_file(self, filename, prefix, mode): self._marshal_lst.append([filename, prefix, mode]) def apply_core(self): for i in self._marshal_lst: node = self.path.find_source(i[0]) if not node: fatal('file not found on gnome obj '+i[0]) env = self.env.copy() if i[2] == '--header': env['GGM_PREFIX'] = i[1] env['GGM_MODE'] = i[2] task = self.create_task('glib_genmarshal', env, 2) task.set_inputs(node) task.set_outputs(node.change_ext('.h')) elif i[2] == '--body': env['GGM_PREFIX'] = i[1] env['GGM_MODE'] = i[2] task = self.create_task('glib_genmarshal', env, 2) task.set_inputs(node) task.set_outputs(node.change_ext('.c')) # this task is really created with self.env ctask = self.create_task('cc', self.env) ctask.m_inputs = task.m_outputs ctask.set_outputs(node.change_ext('.o')) else: error("unknown type for marshal "+i[2]) for i in self._dbus_lst: node = self.path.find_source(i[0]) if not node: fatal('file not found on gnome obj '+i[0]) env = self.env.copy() env['DBT_PREFIX'] = i[1] env['DBT_MODE'] = i[2] task = self.create_task('dbus_binding_tool', env, 2) task.set_inputs(node) task.set_outputs(node.change_ext('.h')) # after our targets are created, process the .c files, etc cc.ccobj.apply_core(self) def setup(env): Action.simple_action('po', '${POCOM} -o ${TGT} ${SRC}', color='BLUE') Action.simple_action('sgml2man', '${SGML2MAN} -o ${TGT[0].bld_dir(env)} ${SRC} > /dev/null', color='BLUE') Action.simple_action( \ 'intltool', \ '${INTLTOOL} ${INTLFLAGS} -q -u -c ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}', \ color='BLUE') Action.simple_action('glib_genmarshal', '${GGM} ${SRC} --prefix=${GGM_PREFIX} ${GGM_MODE} > ${TGT}', color='BLUE') Action.simple_action('dbus_binding_tool', '${DBT} --prefix=${DBT_PREFIX} --mode=${DBT_MODE} --output=${TGT} ${SRC}', color='BLUE') Object.register('gnome_translations', gnome_translations) Object.register('gnome_sgml2man', gnome_sgml2man) Object.register('gnome_intltool', gnome_intltool) Object.register('gnome', gnomeobj) def detect(conf): conf.check_tool('checks') pocom = conf.find_program('msgfmt') #if not pocom: # fatal('The program msgfmt (gettext) is mandatory!') conf.env['POCOM'] = pocom sgml2man = conf.find_program('docbook2man') #if not sgml2man: # fatal('The program docbook2man is mandatory!') conf.env['SGML2MAN'] = sgml2man intltool = conf.find_program('intltool-merge') #if not intltool: # fatal('The program intltool-merge (intltool, gettext-devel) is mandatory!') conf.env['INTLTOOL'] = intltool glib_genmarshal = conf.find_program('glib-genmarshal') conf.env['GGM'] = glib_genmarshal dbus_binding_tool = conf.find_program('dbus-binding-tool') conf.env['DBT'] = dbus_binding_tool def getstr(varname): #if env.has_key('ARGS'): return env['ARGS'].get(varname, '') v='' try: v = getattr(Params.g_options, varname) except: return '' return v prefix = conf.env['PREFIX'] datadir = getstr('datadir') libdir = getstr('libdir') if not datadir: datadir = os.path.join(prefix,'share') if not libdir: libdir = os.path.join(prefix,'lib') # addefine also sets the variable to the env conf.add_define('GNOMELOCALEDIR', os.path.join(datadir, 'locale')) conf.add_define('DATADIR', datadir) conf.add_define('LIBDIR', libdir) # TODO: maybe the following checks should be in a more generic module. #always defined to indicate that i18n is enabled */ conf.add_define('ENABLE_NLS', '1') # TODO #Define to 1 if you have the `bind_textdomain_codeset' function. conf.add_define('HAVE_BIND_TEXTDOMAIN_CODESET', '1') # TODO #Define to 1 if you have the `dcgettext' function. conf.add_define('HAVE_DCGETTEXT', '1') #Define to 1 if you have the header file. conf.check_header('dlfcn.h', 'HAVE_DLFCN_H') # TODO #Define if the GNU gettext() function is already present or preinstalled. conf.add_define('HAVE_GETTEXT', '1') #Define to 1 if you have the header file. conf.check_header('inttypes.h', 'HAVE_INTTYPES_H') # TODO FIXME #Define if your file defines LC_MESSAGES. #conf.add_define('HAVE_LC_MESSAGES', '1') #Define to 1 if you have the header file. conf.check_header('locale.h', 'HAVE_LOCALE_H') #Define to 1 if you have the header file. conf.check_header('memory.h', 'HAVE_MEMORY_H') #Define to 1 if you have the header file. conf.check_header('stdint.h', 'HAVE_STDINT_H') #Define to 1 if you have the header file. conf.check_header('stdlib.h', 'HAVE_STDLIB_H') #Define to 1 if you have the header file. conf.check_header('strings.h', 'HAVE_STRINGS_H') #Define to 1 if you have the header file. conf.check_header('string.h', 'HAVE_STRING_H') #Define to 1 if you have the header file. conf.check_header('sys/stat.h', 'HAVE_SYS_STAT_H') #Define to 1 if you have the header file. conf.check_header('sys/types.h', 'HAVE_SYS_TYPES_H') #Define to 1 if you have the header file. conf.check_header('unistd.h', 'HAVE_UNISTD_H') return 1 def set_options(opt): try: # we do not know yet opt.add_option('--want-rpath', type='int', default=1, dest='want_rpath', help='set rpath to 1 or 0 [Default 1]') except: pass for i in "execprefix datadir libdir".split(): opt.add_option('--'+i, type='string', default='', dest=i)