xref: /OK3568_Linux_fs/yocto/meta-qt5/lib/recipetool/create_qt5.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Recipe creation tool - Qt5 support plugin
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Copyright (C) 2016 Intel Corporation
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# This program is free software; you can redistribute it and/or modify
6*4882a593Smuzhiyun# it under the terms of the GNU General Public License version 2 as
7*4882a593Smuzhiyun# published by the Free Software Foundation.
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# This program is distributed in the hope that it will be useful,
10*4882a593Smuzhiyun# but WITHOUT ANY WARRANTY; without even the implied warranty of
11*4882a593Smuzhiyun# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*4882a593Smuzhiyun# GNU General Public License for more details.
13*4882a593Smuzhiyun#
14*4882a593Smuzhiyun# You should have received a copy of the GNU General Public License along
15*4882a593Smuzhiyun# with this program; if not, write to the Free Software Foundation, Inc.,
16*4882a593Smuzhiyun# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17*4882a593Smuzhiyun
18*4882a593Smuzhiyunimport re
19*4882a593Smuzhiyunimport os
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunfrom recipetool.create import RecipeHandler
22*4882a593Smuzhiyunfrom recipetool.create_buildsys import CmakeExtensionHandler, AutotoolsExtensionHandler
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun
25*4882a593Smuzhiyunclass Qt5AutotoolsHandler(AutotoolsExtensionHandler):
26*4882a593Smuzhiyun    def process_macro(self, srctree, keyword, value, process_value, libdeps, pcdeps, deps, outlines, inherits, values):
27*4882a593Smuzhiyun        if keyword == 'AX_HAVE_QT':
28*4882a593Smuzhiyun            # We don't know specifically which modules it needs, but let's assume it's covered by qtbase
29*4882a593Smuzhiyun            deps.append('qtbase')
30*4882a593Smuzhiyun            return True
31*4882a593Smuzhiyun        return False
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun    def extend_keywords(self, keywords):
34*4882a593Smuzhiyun        keywords.append('AX_HAVE_QT')
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun    def process_prog(self, srctree, keyword, value, prog, deps, outlines, inherits, values):
37*4882a593Smuzhiyun        return False
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun
40*4882a593Smuzhiyunclass Qt5CmakeHandler(CmakeExtensionHandler):
41*4882a593Smuzhiyun    def process_findpackage(self, srctree, fn, pkg, deps, outlines, inherits, values):
42*4882a593Smuzhiyun        return False
43*4882a593Smuzhiyun        cmake_qt5_pkgmap = {'qtbase': 'Qt5 Qt5Concurrent Qt5Core Qt5DBus Qt5Gui Qt5Network Qt5OpenGL Qt5OpenGLExtensions Qt5PrintSupport Qt5Sql Qt5Test Qt5Widgets Qt5Xml',
44*4882a593Smuzhiyun                            'qtsvg': 'Qt5Svg',
45*4882a593Smuzhiyun                            'qtdeclarative': 'Qt5Qml Qt5Quick Qt5QuickWidgets Qt5QuickTest',
46*4882a593Smuzhiyun                            'qtxmlpatterns': 'Qt5XmlPatterns',
47*4882a593Smuzhiyun                            'qtsystems': 'Qt5PublishSubscribe Qt5ServiceFramework Qt5SystemInfo',
48*4882a593Smuzhiyun                            'qtscript': 'Qt5Script Qt5ScriptTools',
49*4882a593Smuzhiyun                            'qttools': 'Qt5Designer Qt5Help Qt5LinguistTools Qt5UiPlugin Qt5UiTools',
50*4882a593Smuzhiyun                            'qtsensors': 'Qt5Sensors',
51*4882a593Smuzhiyun                            'qtmultimedia': 'Qt5Multimedia Qt5MultimediaWidgets',
52*4882a593Smuzhiyun                            'qtwebchannel': 'Qt5WebChannel',
53*4882a593Smuzhiyun                            'qtwebsockets': 'Qt5WebSockets',
54*4882a593Smuzhiyun                            'qtserialport': 'Qt5SerialPort',
55*4882a593Smuzhiyun                            'qtx11extras': 'Qt5X11Extras',
56*4882a593Smuzhiyun                            'qtlocation': 'Qt5Location Qt5Positioning',
57*4882a593Smuzhiyun                            'qt3d': 'Qt53DCollision Qt53DCore Qt53DInput Qt53DLogic Qt53DQuick Qt53DQuickRender Qt53DRender',
58*4882a593Smuzhiyun                            }
59*4882a593Smuzhiyun        for recipe, pkgs in cmake_qt5_pkgmap.iteritems():
60*4882a593Smuzhiyun            if pkg in pkgs.split():
61*4882a593Smuzhiyun                deps.append(recipe)
62*4882a593Smuzhiyun                return True
63*4882a593Smuzhiyun        return False
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    def post_process(self, srctree, fn, pkg, deps, outlines, inherits, values):
66*4882a593Smuzhiyun        for dep in deps:
67*4882a593Smuzhiyun            if dep.startswith('qt'):
68*4882a593Smuzhiyun                if 'cmake_qt5' not in inherits:
69*4882a593Smuzhiyun                    inherits.append('cmake_qt5')
70*4882a593Smuzhiyun                break
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun
73*4882a593Smuzhiyunclass Qmake5RecipeHandler(RecipeHandler):
74*4882a593Smuzhiyun    # Map of QT variable items to recipes
75*4882a593Smuzhiyun    qt_map = {'axcontainer': '',
76*4882a593Smuzhiyun              'axserver': '',
77*4882a593Smuzhiyun              'concurrent': 'qtbase',
78*4882a593Smuzhiyun              'core': 'qtbase',
79*4882a593Smuzhiyun              'gui': 'qtbase',
80*4882a593Smuzhiyun              'dbus': 'qtbase',
81*4882a593Smuzhiyun              'designer': 'qttools',
82*4882a593Smuzhiyun              'help': 'qttools',
83*4882a593Smuzhiyun              'multimedia': 'qtmultimedia',
84*4882a593Smuzhiyun              'multimediawidgets': 'qtmultimedia',
85*4882a593Smuzhiyun              'network': 'qtbase',
86*4882a593Smuzhiyun              'opengl': 'qtbase',
87*4882a593Smuzhiyun              'printsupport': 'qtbase',
88*4882a593Smuzhiyun              'qml': 'qtdeclarative',
89*4882a593Smuzhiyun              'qmltest': 'qtdeclarative',
90*4882a593Smuzhiyun              'x11extras': 'qtx11extras',
91*4882a593Smuzhiyun              'quick': 'qtdeclarative',
92*4882a593Smuzhiyun              'script': 'qtscript',
93*4882a593Smuzhiyun              'scripttools': 'qtscript',
94*4882a593Smuzhiyun              'sensors': 'qtsensors',
95*4882a593Smuzhiyun              'serialport': 'qtserialport',
96*4882a593Smuzhiyun              'sql': 'qtbase',
97*4882a593Smuzhiyun              'svg': 'qtsvg',
98*4882a593Smuzhiyun              'testlib': 'qtbase',
99*4882a593Smuzhiyun              'uitools': 'qttools',
100*4882a593Smuzhiyun              'webkit': 'qtwebkit',
101*4882a593Smuzhiyun              'webkitwidgets': 'qtwebkit',
102*4882a593Smuzhiyun              'widgets': 'qtbase',
103*4882a593Smuzhiyun              'winextras': '',
104*4882a593Smuzhiyun              'xml': 'qtbase',
105*4882a593Smuzhiyun              'xmlpatterns': 'qtxmlpatterns'}
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun    def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
108*4882a593Smuzhiyun        # There's not a conclusive way to tell a Qt2/3/4/5 .pro file apart, so we
109*4882a593Smuzhiyun        # just assume that qmake5 is a reasonable default if you have this layer
110*4882a593Smuzhiyun        # enabled
111*4882a593Smuzhiyun        if 'buildsystem' in handled:
112*4882a593Smuzhiyun            return False
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun        unmappedqt = []
115*4882a593Smuzhiyun        files = RecipeHandler.checkfiles(srctree, ['*.pro'])
116*4882a593Smuzhiyun        deps = []
117*4882a593Smuzhiyun        if files:
118*4882a593Smuzhiyun            for fn in files:
119*4882a593Smuzhiyun                self.parse_qt_pro(fn, deps, unmappedqt)
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun            classes.append('qmake5')
122*4882a593Smuzhiyun            if unmappedqt:
123*4882a593Smuzhiyun                outlines.append('# NOTE: the following QT dependencies are unknown, ignoring: %s' % ' '.join(list(set(unmappedqt))))
124*4882a593Smuzhiyun            if deps:
125*4882a593Smuzhiyun                lines_before.append('DEPENDS = "%s"' % ' '.join(list(set(deps))))
126*4882a593Smuzhiyun            handled.append('buildsystem')
127*4882a593Smuzhiyun            return True
128*4882a593Smuzhiyun        return False
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun    def parse_qt_pro(self, fn, deps, unmappedqt):
131*4882a593Smuzhiyun        with open(fn, 'r') as f:
132*4882a593Smuzhiyun            for line in f:
133*4882a593Smuzhiyun                if re.match('^QT\s*[+=]+', line):
134*4882a593Smuzhiyun                    if '=' in line:
135*4882a593Smuzhiyun                        for item in line.split('=')[1].split():
136*4882a593Smuzhiyun                            dep = Qmake5RecipeHandler.qt_map.get(item, None)
137*4882a593Smuzhiyun                            if dep:
138*4882a593Smuzhiyun                                deps.append(dep)
139*4882a593Smuzhiyun                            elif dep is not None:
140*4882a593Smuzhiyun                                unmappedqt.append(item)
141*4882a593Smuzhiyun                elif re.match('^SUBDIRS\s*[+=]+', line):
142*4882a593Smuzhiyun                    if '=' in line:
143*4882a593Smuzhiyun                        for item in line.split('=')[1].split():
144*4882a593Smuzhiyun                            subfiles = RecipeHandler.checkfiles(os.path.join(os.path.dirname(fn), item), ['*.pro'])
145*4882a593Smuzhiyun                            for subfn in subfiles:
146*4882a593Smuzhiyun                                self.parse_qt_pro(subfn, deps, unmappedqt)
147*4882a593Smuzhiyun                elif 'qml' in line.lower():
148*4882a593Smuzhiyun                    deps.append('qtdeclarative')
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun
151*4882a593Smuzhiyundef register_recipe_handlers(handlers):
152*4882a593Smuzhiyun    # Insert handler in front of default qmake handler
153*4882a593Smuzhiyun    handlers.append((Qmake5RecipeHandler(), 21))
154*4882a593Smuzhiyun
155*4882a593Smuzhiyundef register_cmake_handlers(handlers):
156*4882a593Smuzhiyun    handlers.append(Qt5CmakeHandler())
157*4882a593Smuzhiyun
158*4882a593Smuzhiyundef register_autotools_handlers(handlers):
159*4882a593Smuzhiyun    handlers.append(Qt5AutotoolsHandler())
160*4882a593Smuzhiyun
161