| ############################################################################# |
| ## |
| ## Copyright (C) 2017 The Qt Company Ltd. |
| ## Contact: https://www.qt.io/licensing/ |
| ## |
| ## This file is part of the QtCore module of the Qt Toolkit. |
| ## |
| ## $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ## Commercial License Usage |
| ## Licensees holding valid commercial Qt licenses may use this file in |
| ## accordance with the commercial license agreement provided with the |
| ## Software or, alternatively, in accordance with the terms contained in |
| ## a written agreement between you and The Qt Company. For licensing terms |
| ## and conditions see https://www.qt.io/terms-conditions. For further |
| ## information use the contact form at https://www.qt.io/contact-us. |
| ## |
| ## GNU General Public License Usage |
| ## Alternatively, this file may be used under the terms of the GNU |
| ## General Public License version 3 as published by the Free Software |
| ## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ## included in the packaging of this file. Please review the following |
| ## information to ensure the GNU General Public License requirements will |
| ## be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ## |
| ## $QT_END_LICENSE$ |
| ## |
| ############################################################################# |
| |
| import os |
| import sys |
| import imp |
| |
| from distutils.version import LooseVersion |
| |
| MODULE_NAME = 'qt' |
| |
| def import_bridge(path, debugger, session_dict, reload_module = False): |
| if not reload_module and MODULE_NAME in sys.modules: |
| del sys.modules[MODULE_NAME] |
| |
| bridge = imp.load_source(MODULE_NAME, path) |
| |
| if not hasattr(bridge, '__lldb_init_module'): |
| return None |
| |
| # Make available for the current LLDB session, so that LLDB |
| # can find the functions when initializing the module. |
| session_dict[MODULE_NAME] = bridge |
| |
| # Initialize the module now that it's available globally |
| bridge.__lldb_init_module(debugger, session_dict) |
| |
| if not debugger.GetCategory('Qt'): |
| # Summary provider failed for some reason |
| del session_dict[MODULE_NAME] |
| return None |
| |
| return bridge |
| |
| def report_success(bridge): |
| print "Using Qt summary providers from Creator %s in '%s'" \ |
| % (bridge.CREATOR_VERSION, bridge.CREATOR_PATH) |
| |
| def __lldb_init_module(debugger, session_dict): |
| # Check if the module has already been imported globally. This ensures |
| # that the Qt Creator application search is only performed once per |
| # LLDB process invocation, while still reloading for each session. |
| if MODULE_NAME in sys.modules: |
| module = sys.modules[MODULE_NAME] |
| # Reload module for this sessions |
| bridge = import_bridge(module.__file__, debugger, session_dict, |
| reload_module = True) |
| if bridge: |
| report_success(bridge) |
| return |
| |
| versions = {} |
| for install in os.popen( |
| 'mdfind kMDItemCFBundleIdentifier=org.qt-project.qtcreator' |
| '| while read p;' |
| 'do echo $p=$(mdls "$p" -name kMDItemVersion -raw);' |
| 'done'): |
| install = install.strip() |
| (p, v) = install.split('=') |
| versions[v] = p |
| |
| for version in sorted(versions, key=LooseVersion, reverse=True): |
| path = versions[version] |
| |
| bridge_path = path + '/Contents/Resources/debugger/lldbbridge.py' |
| bridge = import_bridge(bridge_path, debugger, session_dict) |
| if bridge: |
| bridge.CREATOR_VERSION = version |
| bridge.CREATOR_PATH = path |
| report_success(bridge) |
| return |
| |
| print "Could not find Qt Creator installation, no Qt summary providers installed" |