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