99 lines
3.6 KiB
Python
99 lines
3.6 KiB
Python
#############################################################################
|
|
##
|
|
## 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"
|