third_party:waf: update to upstream 2.0.4 release
[bbaumbach/samba-autobuild/.git] / third_party / waf / waflib / Tools / qt5.py
index 05522a49f66fbef1517e11fe11570ba7eb55846c..f4842a9ac5589c3eb7dc8a6fe8188f4f87cd6f77 100644 (file)
@@ -4,7 +4,7 @@
 
 #!/usr/bin/env python
 # encoding: utf-8
-# Thomas Nagy, 2006-2016 (ita)
+# Thomas Nagy, 2006-2018 (ita)
 
 """
 This tool helps with finding Qt5 tools and libraries,
@@ -52,7 +52,7 @@ You also need to edit your sources accordingly:
         incs = set(self.to_list(getattr(self, 'includes', '')))
         for x in self.compiled_tasks:
             incs.add(x.inputs[0].parent.path_from(self.path))
-        self.includes = list(incs)
+        self.includes = sorted(incs)
 
 Note: another tool provides Qt processing that does not require
 .moc includes, see 'playground/slow_qt/'.
@@ -65,6 +65,8 @@ The detection uses pkg-config on Linux by default. To force static library detec
 QT5_XCOMPILE=1 QT5_FORCE_STATIC=1 waf configure
 """
 
+from __future__ import with_statement
+
 try:
        from xml.sax import make_parser
        from xml.sax.handler import ContentHandler
@@ -153,7 +155,7 @@ class qxx(Task.classes['cxx']):
 
                        # direct injection in the build phase (safe because called from the main thread)
                        gen = self.generator.bld.producer
-                       gen.outstanding.appendleft(tsk)
+                       gen.outstanding.append(tsk)
                        gen.total += 1
 
                        return tsk
@@ -234,6 +236,7 @@ class XMLHandler(ContentHandler):
        Parses ``.qrc`` files
        """
        def __init__(self):
+               ContentHandler.__init__(self)
                self.buf = []
                self.files = []
        def startElement(self, name, attrs):
@@ -248,7 +251,7 @@ class XMLHandler(ContentHandler):
 @extension(*EXT_RCC)
 def create_rcc_task(self, node):
        "Creates rcc and cxx tasks for ``.qrc`` files"
-       rcnode = node.change_ext('_rc.cpp')
+       rcnode = node.change_ext('_rc.%d.cpp' % self.idx)
        self.create_task('rcc', node, rcnode)
        cpptask = self.create_task('cxx', rcnode, rcnode.change_ext('.o'))
        try:
@@ -260,8 +263,21 @@ def create_rcc_task(self, node):
 @extension(*EXT_UI)
 def create_uic_task(self, node):
        "Create uic tasks for user interface ``.ui`` definition files"
-       uictask = self.create_task('ui5', node)
-       uictask.outputs = [node.parent.find_or_declare(self.env.ui_PATTERN % node.name[:-3])]
+
+       """
+       If UIC file is used in more than one bld, we would have a conflict in parallel execution
+       It is not possible to change the file names (like .self.idx. as for objects) as they have
+       to be referenced by the source file, but we can assume that the transformation will be identical
+       and the tasks can be shared in a global cache.
+       """
+       try:
+               uic_cache = self.bld.uic_cache
+       except AttributeError:
+               uic_cache = self.bld.uic_cache = {}
+
+       if node not in uic_cache:
+               uictask = uic_cache[node] = self.create_task('ui5', node)
+               uictask.outputs = [node.parent.find_or_declare(self.env.ui_PATTERN % node.name[:-3])]
 
 @extension('.ts')
 def add_lang(self, node):
@@ -313,11 +329,11 @@ def apply_qt5(self):
                for x in self.to_list(self.lang):
                        if isinstance(x, str):
                                x = self.path.find_resource(x + '.ts')
-                       qmtasks.append(self.create_task('ts2qm', x, x.change_ext('.qm')))
+                       qmtasks.append(self.create_task('ts2qm', x, x.change_ext('.%d.qm' % self.idx)))
 
                if getattr(self, 'update', None) and Options.options.trans_qt5:
                        cxxnodes = [a.inputs[0] for a in self.compiled_tasks] + [
-                               a.inputs[0] for a in self.tasks if getattr(a, 'inputs', None) and a.inputs[0].name.endswith('.ui')]
+                               a.inputs[0] for a in self.tasks if a.inputs and a.inputs[0].name.endswith('.ui')]
                        for x in qmtasks:
                                self.create_task('trans_update', cxxnodes, x.inputs)
 
@@ -325,14 +341,15 @@ def apply_qt5(self):
                        qmnodes = [x.outputs[0] for x in qmtasks]
                        rcnode = self.langname
                        if isinstance(rcnode, str):
-                               rcnode = self.path.find_or_declare(rcnode + '.qrc')
+                               rcnode = self.path.find_or_declare(rcnode + ('.%d.qrc' % self.idx))
                        t = self.create_task('qm2rcc', qmnodes, rcnode)
                        k = create_rcc_task(self, t.outputs[0])
                        self.link_task.inputs.append(k.outputs[0])
 
        lst = []
        for flag in self.to_list(self.env.CXXFLAGS):
-               if len(flag) < 2: continue
+               if len(flag) < 2:
+                       continue
                f = flag[0:2]
                if f in ('-D', '-I', '/D', '/I'):
                        if (f[0] == '/'):
@@ -368,19 +385,18 @@ class rcc(Task.Task):
                parser = make_parser()
                curHandler = XMLHandler()
                parser.setContentHandler(curHandler)
-               fi = open(self.inputs[0].abspath(), 'r')
-               try:
-                       parser.parse(fi)
-               finally:
-                       fi.close()
+               with open(self.inputs[0].abspath(), 'r') as f:
+                       parser.parse(f)
 
                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)
+                       if nd:
+                               nodes.append(nd)
+                       else:
+                               names.append(x)
                return (nodes, names)
 
 class moc(Task.Task):
@@ -456,7 +472,6 @@ def configure(self):
                self.fatal('Could not build a simple Qt application')
 
        # FreeBSD does not add /usr/local/lib and the pkg-config files do not provide it either :-/
-       from waflib import Utils
        if Utils.unversioned_sys_platform() == 'freebsd':
                frag = '#include <QApplication>\nint main(int argc, char **argv) { QApplication app(argc, argv); return NULL != (void*) (&app);}\n'
                try:
@@ -572,7 +587,7 @@ def find_qt5_binaries(self):
        uicver = uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt', '')
        self.end_msg(uicver)
        if uicver.find(' 3.') != -1 or uicver.find(' 4.') != -1:
-               self.fatal('this uic compiler is for qt3 or qt5, add uic for qt5 to your path')
+               self.fatal('this uic compiler is for qt3 or qt4, add uic for qt5 to your path')
 
        find_bin(['moc-qt5', 'moc'], 'QT_MOC')
        find_bin(['rcc-qt5', 'rcc'], 'QT_RCC')
@@ -658,16 +673,14 @@ def find_qt5_libraries(self):
                                        self.msg('Checking for %s' % i, False, 'YELLOW')
                                env.append_unique('INCLUDES_' + uselib, os.path.join(env.QTLIBS, frameworkName, 'Headers'))
                        else:
-                               for j in ('', 'd'):
-                                       k = '_DEBUG' if j == 'd' else ''
-                                       ret = self.find_single_qt5_lib(i + j, uselib + k, env.QTLIBS, qtincludes, force_static)
-                                       if not force_static and not ret:
-                                               ret = self.find_single_qt5_lib(i + j, uselib + k, env.QTLIBS, qtincludes, True)
-                                       self.msg('Checking for %s' % (i + j), ret, 'GREEN' if ret else 'YELLOW')
+                               ret = self.find_single_qt5_lib(i, uselib, env.QTLIBS, qtincludes, force_static)
+                               if not force_static and not ret:
+                                       ret = self.find_single_qt5_lib(i, uselib, env.QTLIBS, qtincludes, True)
+                               self.msg('Checking for %s' % i, ret, 'GREEN' if ret else 'YELLOW')
        else:
                path = '%s:%s:%s/pkgconfig:/usr/lib/qt5/lib/pkgconfig:/opt/qt5/lib/pkgconfig:/usr/lib/qt5/lib:/opt/qt5/lib' % (
                        self.environ.get('PKG_CONFIG_PATH', ''), env.QTLIBS, env.QTLIBS)
-               for i in self.qt5_vars_debug + self.qt5_vars:
+               for i in self.qt5_vars:
                        self.check_cfg(package=i, args='--cflags --libs', mandatory=False, force_static=force_static, pkg_config_path=path)
 
 @conf
@@ -693,7 +706,6 @@ def simplify_qt5_libs(self):
                                        accu.append(lib)
                                env['LIBPATH_'+var] = accu
        process_lib(self.qt5_vars,       'LIBPATH_QTCORE')
-       process_lib(self.qt5_vars_debug, 'LIBPATH_QTCORE_DEBUG')
 
 @conf
 def add_qt5_rpath(self):
@@ -716,7 +728,6 @@ def add_qt5_rpath(self):
                                                accu.append('-Wl,--rpath='+lib)
                                        env['RPATH_' + var] = accu
                process_rpath(self.qt5_vars,       'LIBPATH_QTCORE')
-               process_rpath(self.qt5_vars_debug, 'LIBPATH_QTCORE_DEBUG')
 
 @conf
 def set_qt5_libs_to_check(self):
@@ -743,10 +754,6 @@ def set_qt5_libs_to_check(self):
        if qtextralibs:
                self.qt5_vars.extend(qtextralibs.split(','))
 
-       if not hasattr(self, 'qt5_vars_debug'):
-               self.qt5_vars_debug = [a + '_DEBUG' for a in self.qt5_vars]
-       self.qt5_vars_debug = Utils.to_list(self.qt5_vars_debug)
-
 @conf
 def set_qt5_defines(self):
        if sys.platform != 'win32':
@@ -754,7 +761,6 @@ def set_qt5_defines(self):
        for x in self.qt5_vars:
                y=x.replace('Qt5', 'Qt')[2:].upper()
                self.env.append_unique('DEFINES_%s' % x.upper(), 'QT_%s_LIB' % y)
-               self.env.append_unique('DEFINES_%s_DEBUG' % x.upper(), 'QT_%s_LIB' % y)
 
 def options(opt):
        """
@@ -766,3 +772,4 @@ def options(opt):
 
        opt.add_option('--translate', action='store_true', help='collect translation strings', dest='trans_qt5', default=False)
        opt.add_option('--qtextralibs', type='string', default='', dest='qtextralibs', help='additional qt libraries on the system to add to default ones, comma separated')
+