diff options
Diffstat (limited to 'third_party/waf/wafadmin/Tools/qt4.py')
-rw-r--r-- | third_party/waf/wafadmin/Tools/qt4.py | 504 |
1 files changed, 0 insertions, 504 deletions
diff --git a/third_party/waf/wafadmin/Tools/qt4.py b/third_party/waf/wafadmin/Tools/qt4.py deleted file mode 100644 index 7d2cad7d9c1..00000000000 --- a/third_party/waf/wafadmin/Tools/qt4.py +++ /dev/null @@ -1,504 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# Thomas Nagy, 2006 (ita) - -""" -Qt4 support - -If QT4_ROOT is given (absolute path), the configuration will look in it first - -This module also demonstrates how to add tasks dynamically (when the build has started) -""" - -try: - from xml.sax import make_parser - from xml.sax.handler import ContentHandler -except ImportError: - has_xml = False - ContentHandler = object -else: - has_xml = True - -import os, sys -import ccroot, cxx -import TaskGen, Task, Utils, Runner, Options, Node, Configure -from TaskGen import taskgen, feature, after, extension -from Logs import error -from Constants import * - -MOC_H = ['.h', '.hpp', '.hxx', '.hh'] -EXT_RCC = ['.qrc'] -EXT_UI = ['.ui'] -EXT_QT4 = ['.cpp', '.cc', '.cxx', '.C'] - -class qxx_task(Task.Task): - "A cpp task that may create a moc task dynamically" - - before = ['cxx_link', 'static_link'] - - def __init__(self, *k, **kw): - Task.Task.__init__(self, *k, **kw) - self.moc_done = 0 - - def scan(self): - (nodes, names) = ccroot.scan(self) - # for some reasons (variants) the moc node may end in the list of node deps - for x in nodes: - if x.name.endswith('.moc'): - nodes.remove(x) - names.append(x.relpath_gen(self.inputs[0].parent)) - return (nodes, names) - - def runnable_status(self): - if self.moc_done: - # if there is a moc task, delay the computation of the file signature - for t in self.run_after: - if not t.hasrun: - return ASK_LATER - # the moc file enters in the dependency calculation - # so we need to recompute the signature when the moc file is present - self.signature() - return Task.Task.runnable_status(self) - else: - # yes, really, there are people who generate cxx files - for t in self.run_after: - if not t.hasrun: - return ASK_LATER - self.add_moc_tasks() - return ASK_LATER - - def add_moc_tasks(self): - - node = self.inputs[0] - tree = node.__class__.bld - - try: - # compute the signature once to know if there is a moc file to create - self.signature() - except KeyError: - # the moc file may be referenced somewhere else - pass - else: - # remove the signature, it must be recomputed with the moc task - delattr(self, 'cache_sig') - - moctasks=[] - mocfiles=[] - variant = node.variant(self.env) - try: - tmp_lst = tree.raw_deps[self.unique_id()] - tree.raw_deps[self.unique_id()] = [] - except KeyError: - tmp_lst = [] - for d in tmp_lst: - if not d.endswith('.moc'): continue - # paranoid check - if d in mocfiles: - error("paranoia owns") - continue - - # process that base.moc only once - mocfiles.append(d) - - # find the extension (performed only when the .cpp has changes) - base2 = d[:-4] - for path in [node.parent] + self.generator.env['INC_PATHS']: - tree.rescan(path) - vals = getattr(Options.options, 'qt_header_ext', '') or MOC_H - for ex in vals: - h_node = path.find_resource(base2 + ex) - if h_node: - break - else: - continue - break - else: - raise Utils.WafError("no header found for %s which is a moc file" % str(d)) - - m_node = h_node.change_ext('.moc') - tree.node_deps[(self.inputs[0].parent.id, self.env.variant(), m_node.name)] = h_node - - # create the task - task = Task.TaskBase.classes['moc'](self.env, normal=0) - task.set_inputs(h_node) - task.set_outputs(m_node) - - generator = tree.generator - generator.outstanding.insert(0, task) - generator.total += 1 - - moctasks.append(task) - - # remove raw deps except the moc files to save space (optimization) - tmp_lst = tree.raw_deps[self.unique_id()] = mocfiles - - # look at the file inputs, it is set right above - lst = tree.node_deps.get(self.unique_id(), ()) - for d in lst: - name = d.name - if name.endswith('.moc'): - task = Task.TaskBase.classes['moc'](self.env, normal=0) - task.set_inputs(tree.node_deps[(self.inputs[0].parent.id, self.env.variant(), name)]) # 1st element in a tuple - task.set_outputs(d) - - generator = tree.generator - generator.outstanding.insert(0, task) - generator.total += 1 - - moctasks.append(task) - - # simple scheduler dependency: run the moc task before others - self.run_after = moctasks - self.moc_done = 1 - - run = Task.TaskBase.classes['cxx'].__dict__['run'] - -def translation_update(task): - outs = [a.abspath(task.env) for a in task.outputs] - outs = " ".join(outs) - lupdate = task.env['QT_LUPDATE'] - - for x in task.inputs: - file = x.abspath(task.env) - cmd = "%s %s -ts %s" % (lupdate, file, outs) - Utils.pprint('BLUE', cmd) - task.generator.bld.exec_command(cmd) - -class XMLHandler(ContentHandler): - def __init__(self): - self.buf = [] - self.files = [] - def startElement(self, name, attrs): - if name == 'file': - self.buf = [] - def endElement(self, name): - if name == 'file': - self.files.append(''.join(self.buf)) - def characters(self, cars): - self.buf.append(cars) - -def scan(self): - "add the dependency on the files referenced in the qrc" - node = self.inputs[0] - parser = make_parser() - curHandler = XMLHandler() - parser.setContentHandler(curHandler) - fi = open(self.inputs[0].abspath(self.env)) - parser.parse(fi) - fi.close() - - nodes = [] - names = [] - root = self.inputs[0].parent - for x in curHandler.files: - nd = root.find_resource(x) - if nd: nodes.append(nd) - else: names.append(x) - - return (nodes, names) - -@extension(EXT_RCC) -def create_rcc_task(self, node): - "hook for rcc files" - rcnode = node.change_ext('_rc.cpp') - rcctask = self.create_task('rcc', node, rcnode) - cpptask = self.create_task('cxx', rcnode, rcnode.change_ext('.o')) - self.compiled_tasks.append(cpptask) - return cpptask - -@extension(EXT_UI) -def create_uic_task(self, node): - "hook for uic tasks" - uictask = self.create_task('ui4', node) - uictask.outputs = [self.path.find_or_declare(self.env['ui_PATTERN'] % node.name[:-3])] - return uictask - -class qt4_taskgen(cxx.cxx_taskgen): - def __init__(self, *k, **kw): - cxx.cxx_taskgen.__init__(self, *k, **kw) - self.features.append('qt4') - -@extension('.ts') -def add_lang(self, node): - """add all the .ts file into self.lang""" - self.lang = self.to_list(getattr(self, 'lang', [])) + [node] - -@feature('qt4') -@after('apply_link') -def apply_qt4(self): - if getattr(self, 'lang', None): - update = getattr(self, 'update', None) - lst=[] - trans=[] - for l in self.to_list(self.lang): - - if not isinstance(l, Node.Node): - l = self.path.find_resource(l+'.ts') - - t = self.create_task('ts2qm', l, l.change_ext('.qm')) - lst.append(t.outputs[0]) - - if update: - trans.append(t.inputs[0]) - - trans_qt4 = getattr(Options.options, 'trans_qt4', False) - if update and trans_qt4: - # we need the cpp files given, except the rcc task we create after - # FIXME may be broken - u = Task.TaskCmd(translation_update, self.env, 2) - u.inputs = [a.inputs[0] for a in self.compiled_tasks] - u.outputs = trans - - if getattr(self, 'langname', None): - t = Task.TaskBase.classes['qm2rcc'](self.env) - t.set_inputs(lst) - t.set_outputs(self.path.find_or_declare(self.langname+'.qrc')) - t.path = self.path - k = create_rcc_task(self, t.outputs[0]) - self.link_task.inputs.append(k.outputs[0]) - - self.env.append_value('MOC_FLAGS', self.env._CXXDEFFLAGS) - self.env.append_value('MOC_FLAGS', self.env._CXXINCFLAGS) - -@extension(EXT_QT4) -def cxx_hook(self, node): - # create the compilation task: cpp or cc - try: obj_ext = self.obj_ext - except AttributeError: obj_ext = '_%d.o' % self.idx - - task = self.create_task('qxx', node, node.change_ext(obj_ext)) - self.compiled_tasks.append(task) - return task - -def process_qm2rcc(task): - outfile = task.outputs[0].abspath(task.env) - f = open(outfile, 'w') - f.write('<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n') - for k in task.inputs: - f.write(' <file>') - #f.write(k.name) - f.write(k.path_to_parent(task.path)) - f.write('</file>\n') - f.write('</qresource>\n</RCC>') - f.close() - -b = Task.simple_task_type -b('moc', '${QT_MOC} ${MOC_FLAGS} ${SRC} ${MOC_ST} ${TGT}', color='BLUE', vars=['QT_MOC', 'MOC_FLAGS'], shell=False) -cls = b('rcc', '${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath(env)} ${RCC_ST} -o ${TGT}', color='BLUE', before='cxx moc qxx_task', after="qm2rcc", shell=False) -cls.scan = scan -b('ui4', '${QT_UIC} ${SRC} -o ${TGT}', color='BLUE', before='cxx moc qxx_task', shell=False) -b('ts2qm', '${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}', color='BLUE', before='qm2rcc', shell=False) - -Task.task_type_from_func('qm2rcc', vars=[], func=process_qm2rcc, color='BLUE', before='rcc', after='ts2qm') - -def detect_qt4(conf): - env = conf.env - opt = Options.options - - qtdir = getattr(opt, 'qtdir', '') - qtbin = getattr(opt, 'qtbin', '') - qtlibs = getattr(opt, 'qtlibs', '') - useframework = getattr(opt, 'use_qt4_osxframework', True) - - paths = [] - - # the path to qmake has been given explicitely - if qtbin: - paths = [qtbin] - - # the qt directory has been given - we deduce the qt binary path - if not qtdir: - qtdir = conf.environ.get('QT4_ROOT', '') - qtbin = os.path.join(qtdir, 'bin') - paths = [qtbin] - - # no qtdir, look in the path and in /usr/local/Trolltech - if not qtdir: - paths = os.environ.get('PATH', '').split(os.pathsep) - paths.append('/usr/share/qt4/bin/') - try: - lst = os.listdir('/usr/local/Trolltech/') - except OSError: - pass - else: - if lst: - lst.sort() - lst.reverse() - - # keep the highest version - qtdir = '/usr/local/Trolltech/%s/' % lst[0] - qtbin = os.path.join(qtdir, 'bin') - paths.append(qtbin) - - # at the end, try to find qmake in the paths given - # keep the one with the highest version - cand = None - prev_ver = ['4', '0', '0'] - for qmk in ['qmake-qt4', 'qmake4', 'qmake']: - qmake = conf.find_program(qmk, path_list=paths) - if qmake: - try: - version = Utils.cmd_output([qmake, '-query', 'QT_VERSION']).strip() - except ValueError: - pass - else: - if version: - new_ver = version.split('.') - if new_ver > prev_ver: - cand = qmake - prev_ver = new_ver - if cand: - qmake = cand - else: - conf.fatal('could not find qmake for qt4') - - conf.env.QMAKE = qmake - qtincludes = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_HEADERS']).strip() - qtdir = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_PREFIX']).strip() + os.sep - qtbin = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_BINS']).strip() + os.sep - - if not qtlibs: - try: - qtlibs = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_LIBS']).strip() + os.sep - except ValueError: - qtlibs = os.path.join(qtdir, 'lib') - - def find_bin(lst, var): - for f in lst: - ret = conf.find_program(f, path_list=paths) - if ret: - env[var]=ret - break - - vars = "QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtWebKit Qt3Support".split() - - find_bin(['uic-qt3', 'uic3'], 'QT_UIC3') - find_bin(['uic-qt4', 'uic'], 'QT_UIC') - if not env['QT_UIC']: - conf.fatal('cannot find the uic compiler for qt4') - - try: - version = Utils.cmd_output(env['QT_UIC'] + " -version 2>&1").strip() - except ValueError: - conf.fatal('your uic compiler is for qt3, add uic for qt4 to your path') - - version = version.replace('Qt User Interface Compiler ','') - version = version.replace('User Interface Compiler for Qt', '') - if version.find(" 3.") != -1: - conf.check_message('uic version', '(too old)', 0, option='(%s)'%version) - sys.exit(1) - conf.check_message('uic version', '', 1, option='(%s)'%version) - - find_bin(['moc-qt4', 'moc'], 'QT_MOC') - find_bin(['rcc'], 'QT_RCC') - find_bin(['lrelease-qt4', 'lrelease'], 'QT_LRELEASE') - find_bin(['lupdate-qt4', 'lupdate'], 'QT_LUPDATE') - - env['UIC3_ST']= '%s -o %s' - env['UIC_ST'] = '%s -o %s' - env['MOC_ST'] = '-o' - env['ui_PATTERN'] = 'ui_%s.h' - env['QT_LRELEASE_FLAGS'] = ['-silent'] - - vars_debug = [a+'_debug' for a in vars] - - try: - conf.find_program('pkg-config', var='pkgconfig', path_list=paths, mandatory=True) - - except Configure.ConfigurationError: - - for lib in vars_debug+vars: - uselib = lib.upper() - - d = (lib.find('_debug') > 0) and 'd' or '' - - # original author seems to prefer static to shared libraries - for (pat, kind) in ((conf.env.staticlib_PATTERN, 'STATIC'), (conf.env.shlib_PATTERN, '')): - - conf.check_message_1('Checking for %s %s' % (lib, kind)) - - for ext in ['', '4']: - path = os.path.join(qtlibs, pat % (lib + d + ext)) - if os.path.exists(path): - env.append_unique(kind + 'LIB_' + uselib, lib + d + ext) - conf.check_message_2('ok ' + path, 'GREEN') - break - path = os.path.join(qtbin, pat % (lib + d + ext)) - if os.path.exists(path): - env.append_unique(kind + 'LIB_' + uselib, lib + d + ext) - conf.check_message_2('ok ' + path, 'GREEN') - break - else: - conf.check_message_2('not found', 'YELLOW') - continue - break - - env.append_unique('LIBPATH_' + uselib, qtlibs) - env.append_unique('CPPPATH_' + uselib, qtincludes) - env.append_unique('CPPPATH_' + uselib, qtincludes + os.sep + lib) - else: - for i in vars_debug+vars: - try: - conf.check_cfg(package=i, args='--cflags --libs --silence-errors', path=conf.env.pkgconfig) - except ValueError: - pass - - # the libpaths are set nicely, unfortunately they make really long command-lines - # remove the qtcore ones from qtgui, etc - def process_lib(vars_, coreval): - for d in vars_: - var = d.upper() - if var == 'QTCORE': continue - - value = env['LIBPATH_'+var] - if value: - core = env[coreval] - accu = [] - for lib in value: - if lib in core: continue - accu.append(lib) - env['LIBPATH_'+var] = accu - - process_lib(vars, 'LIBPATH_QTCORE') - process_lib(vars_debug, 'LIBPATH_QTCORE_DEBUG') - - # rpath if wanted - want_rpath = getattr(Options.options, 'want_rpath', 1) - if want_rpath: - def process_rpath(vars_, coreval): - for d in vars_: - var = d.upper() - value = env['LIBPATH_'+var] - if value: - core = env[coreval] - accu = [] - for lib in value: - if var != 'QTCORE': - if lib in core: - continue - accu.append('-Wl,--rpath='+lib) - env['RPATH_'+var] = accu - process_rpath(vars, 'LIBPATH_QTCORE') - process_rpath(vars_debug, 'LIBPATH_QTCORE_DEBUG') - - env['QTLOCALE'] = str(env['PREFIX'])+'/share/locale' - -def detect(conf): - detect_qt4(conf) - -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('--header-ext', - type='string', - default='', - help='header extension for moc files', - dest='qt_header_ext') - - for i in 'qtdir qtbin qtlibs'.split(): - opt.add_option('--'+i, type='string', default='', dest=i) - - if sys.platform == "darwin": - opt.add_option('--no-qt4-framework', action="store_false", help='do not use the framework version of Qt4 in OS X', dest='use_qt4_osxframework',default=True) - - opt.add_option('--translate', action="store_true", help="collect translation strings", dest="trans_qt4", default=False) |