qt5base-lts/mkspecs/features/unix/separate_debug_info.prf
Tor Arne Vestbø 1b73c202ce macOS: Add LLDB debug script when building with separate debug info (dSYM)
The script will look for the most recent Qt Creator version on the system,
and pick up the LLDB summary providers from there, allowing pretty-printing
of Qt types inside LLDB/Xcode.

LLDB will detect the file when loading the dSYM, and inform the user that
the file can be loaded to enable the formatters. The script can be loaded
automatically by adding the following setting in ~/.lldbinit:

    settings set target.load-script-from-symbol-file true

Which comes as a slight security risk, as other libraries might have
scripts of their own. The alternative is to load the script directly
from ~/.lldbinit:

    command script import "<path to debug script in dSYM>"

With an optional target.load-script-from-symbol-file set to false, to
silence the warning when loading the dSYM bundle.

Change-Id: I01ba51dab725a8d0a58f1ad1749742443b639cc5
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2017-07-07 18:09:45 +00:00

110 lines
5.2 KiB
Plaintext

have_target:!static:if(darwin|!isEmpty(QMAKE_OBJCOPY)) {
darwin {
debug_info_copy_bin = $$QMAKE_DSYMUTIL
debug_info_strip_bin = $$QMAKE_STRIP
debug_info_suffix = dSYM
debug_info_out = --flat -o
debug_info_strip = -S
} else {
debug_info_copy_bin = $$QMAKE_OBJCOPY
debug_info_strip_bin = $$QMAKE_OBJCOPY
qnx {
debug_info_suffix = sym
debug_info_keep = --keep-file-symbols
debug_info_strip = --strip-debug -R.ident
} else {
debug_info_suffix = debug
debug_info_keep = --only-keep-debug
debug_info_strip = --strip-debug
}
}
load(resolve_target)
debug_info_target = $$QMAKE_RESOLVED_TARGET
darwin {
!isEmpty(QMAKE_RESOLVED_BUNDLE) {
debug_info_target = $$QMAKE_RESOLVED_BUNDLE
CONFIG += any_bundle
}
debug_info_target_rel = $$section(debug_info_target, /, -1, -1)
debug_info_target_dir_suffix = .$$debug_info_suffix/Contents/Resources/DWARF
debug_info_target_dir = $${debug_info_target}$${debug_info_target_dir_suffix}
debug_info_target_dir_rel = $${debug_info_target_rel}$${debug_info_target_dir_suffix}
!isEmpty(QMAKE_RESOLVED_BUNDLE): \
QMAKE_TARGET_DEBUG_INFO = $$debug_info_target_dir/$$TARGET
else: \
QMAKE_TARGET_DEBUG_INFO = $$debug_info_target_dir/$$section(QMAKE_RESOLVED_TARGET, /, -1, -1)
if(any_bundle:!build_pass)|if(!any_bundle:if(build_pass|isEmpty(BUILDS))) {
equals(TEMPLATE, lib):lib_bundle:!isEmpty(QMAKE_FRAMEWORK_BUNDLE_NAME): \
BUNDLEIDENTIFIER = $$replace(QMAKE_FRAMEWORK_BUNDLE_NAME, \\.framework$, )
else: equals(TEMPLATE, app):app_bundle:!isEmpty(QMAKE_APPLICATION_BUNDLE_NAME): \
BUNDLEIDENTIFIER = $$replace(QMAKE_APPLICATION_BUNDLE_NAME, \\.app$, )
else: \
BUNDLEIDENTIFIER = $${TARGET}
!isEmpty(QMAKE_TARGET_BUNDLE_PREFIX): \
BUNDLEIDENTIFIER = $$replace(QMAKE_TARGET_BUNDLE_PREFIX, \\.$, ).$${BUNDLEIDENTIFIER}
else: \
BUNDLEIDENTIFIER = com.yourcompany.$${BUNDLEIDENTIFIER}
BUNDLEIDENTIFIER ~= s,_,-,
debug_info_plist.input = $$QMAKESPEC/Info.plist.dSYM.in
debug_info_plist.output = $${debug_info_target}.$$debug_info_suffix/Contents/Info.plist
QMAKE_SUBSTITUTES += debug_info_plist
!isEmpty(QMAKE_DSYM_DEBUG_SCRIPT) {
debug_script.input = $$QMAKE_DSYM_DEBUG_SCRIPT
debug_script.output = $${debug_info_target}.$$debug_info_suffix/Contents/Resources/Python/$${TARGET}.py
debug_script.CONFIG = verbatim
QMAKE_SUBSTITUTES += debug_script
}
}
contains(INSTALLS, target):isEmpty(target.files):isEmpty(target.commands):isEmpty(target.extra) {
!build_pass|release {
debug_info_plist_target.CONFIG += no_check_exist
debug_info_plist_target.files = $${debug_info_target}.$$debug_info_suffix/Contents/Info.plist
debug_info_plist_target.path += $${target.path}/$${debug_info_target_rel}.$$debug_info_suffix/Contents
INSTALLS += debug_info_plist_target
debug_script_target.CONFIG += no_check_exist
debug_script_target.files = $${debug_info_target}.$$debug_info_suffix/Contents/Resources/Python/$${TARGET}.py
debug_script_target.path += $${target.path}/$${debug_info_target_rel}.$$debug_info_suffix/Contents/Resources/Python
INSTALLS += debug_script_target
}
debug_info_target.CONFIG += no_check_exist
debug_info_target.files = $$QMAKE_TARGET_DEBUG_INFO
debug_info_target.path += $${target.path}/$${debug_info_target_dir_rel}
INSTALLS += debug_info_target
}
} else {
QMAKE_TARGET_DEBUG_INFO = $${QMAKE_RESOLVED_TARGET}.$$debug_info_suffix
target.targets += $$QMAKE_TARGET_DEBUG_INFO
}
shell_target = $$shell_quote($$relative_path($$QMAKE_RESOLVED_TARGET, $$OUT_PWD))
shell_target_debug_info = $$shell_quote($$relative_path($$QMAKE_TARGET_DEBUG_INFO, $$OUT_PWD))
copy_debug_info = $$debug_info_copy_bin $$debug_info_keep $$shell_target $$debug_info_out $$shell_target_debug_info
strip_debug_info = $$debug_info_strip_bin $$debug_info_strip $$shell_target
!isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
darwin {
mkdir_debug_info = $$QMAKE_MKDIR $$shell_quote($$debug_info_target_dir)
QMAKE_POST_LINK = $$mkdir_debug_info && $$copy_debug_info && $$strip_debug_info $$QMAKE_POST_LINK
} else {
link_debug_info = $$QMAKE_OBJCOPY --add-gnu-debuglink=$$shell_target_debug_info $$shell_target
!contains(QMAKE_HOST.os, Windows): \
QMAKE_POST_LINK = && chmod -x $$shell_target_debug_info $$QMAKE_POST_LINK
QMAKE_POST_LINK = $$copy_debug_info && $$strip_debug_info && $$link_debug_info $$QMAKE_POST_LINK
}
silent:QMAKE_POST_LINK = @echo creating $@.$$debug_info_suffix && $$QMAKE_POST_LINK
QMAKE_DISTCLEAN += $$QMAKE_TARGET_DEBUG_INFO
}