Automated rollback of commit 03914cc6d6fbc8351d7960b6a0dd239bc2b541f9.
*** Reason for rollback ***
Does not create the ~/.lldbinit or ~/.lldbinit-Xcode if it hasn't
already been created.
Will resolve that case in a follow up CL, after new release cuts.
PiperOrigin-RevId: 191765048
diff --git a/src/Tulsi.xcodeproj/project.pbxproj b/src/Tulsi.xcodeproj/project.pbxproj
index 5f44e6b..9665e33 100644
--- a/src/Tulsi.xcodeproj/project.pbxproj
+++ b/src/Tulsi.xcodeproj/project.pbxproj
@@ -143,7 +143,6 @@
D3F78C681F391E9700AE0571 /* bazel_options.py in Resources */ = {isa = PBXBuildFile; fileRef = D3F78C671F391E9700AE0571 /* bazel_options.py */; };
E11AFAB02052655500C97875 /* bazel_cache_reader in Copy Utilty resources */ = {isa = PBXBuildFile; fileRef = E1D770EA20523E790026802A /* bazel_cache_reader */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
E135A781205880720082E4D0 /* apfs_clone_copy.py in Resources */ = {isa = PBXBuildFile; fileRef = E135A780205880720082E4D0 /* apfs_clone_copy.py */; };
- E1542A0E206ED51900D3D339 /* bootstrap_lldbinit.py in Resources */ = {isa = PBXBuildFile; fileRef = E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */; };
E155E20C1FCE47DA002B16BB /* BazelBuildSettingsFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = E155E20B1FCE47D9002B16BB /* BazelBuildSettingsFeatures.swift */; };
E19C1C571F5886A000D6E38A /* QueuedLogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19C1C561F5886A000D6E38A /* QueuedLogging.swift */; };
E1C0186D2051B65D000580CC /* clean_symbol_cache.py in Resources */ = {isa = PBXBuildFile; fileRef = E1C018692051B65B000580CC /* clean_symbol_cache.py */; };
@@ -359,7 +358,6 @@
D3F78C671F391E9700AE0571 /* bazel_options.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = bazel_options.py; sourceTree = "<group>"; };
E132B8B51F86FA3400DF7F9A /* tulsi_aspects_paths.bzl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tulsi_aspects_paths.bzl; path = tulsi/tulsi_aspects_paths.bzl; sourceTree = "<group>"; };
E135A780205880720082E4D0 /* apfs_clone_copy.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = apfs_clone_copy.py; sourceTree = "<group>"; };
- E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = bootstrap_lldbinit.py; sourceTree = "<group>"; };
E155E20B1FCE47D9002B16BB /* BazelBuildSettingsFeatures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BazelBuildSettingsFeatures.swift; sourceTree = "<group>"; };
E19C1C561F5886A000D6E38A /* QueuedLogging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueuedLogging.swift; sourceTree = "<group>"; };
E1C018692051B65B000580CC /* clean_symbol_cache.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = clean_symbol_cache.py; sourceTree = "<group>"; };
@@ -529,7 +527,6 @@
3DAC27671C3AD2510040F42C /* Scripts */ = {
isa = PBXGroup;
children = (
- E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */,
5442049B2064156D00EBF343 /* install_genfiles.py */,
E135A780205880720082E4D0 /* apfs_clone_copy.py */,
54EF32091F3E0804009E9C7F /* bazel_build_events.py */,
@@ -880,7 +877,6 @@
5442049C2064156D00EBF343 /* install_genfiles.py in Resources */,
E1C018722051B66C000580CC /* update_symbol_cache.py in Resources */,
3DCFE5D51C80A64600D7F31B /* WORKSPACE in Resources */,
- E1542A0E206ED51900D3D339 /* bootstrap_lldbinit.py in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/src/TulsiGenerator/Base.lproj/Localizable.strings b/src/TulsiGenerator/Base.lproj/Localizable.strings
index 7be9732..9e4113d 100644
--- a/src/TulsiGenerator/Base.lproj/Localizable.strings
+++ b/src/TulsiGenerator/Base.lproj/Localizable.strings
@@ -44,11 +44,8 @@
/* Error when parsing a Bazel Build Event for BEP when running Bazel. */
"BazelParseBuildEventFailed" = "Failed to parse a Bazel Build Event. This may be a Tulsi bug, please report. Additional Context: %1$@";
-/* Warning when a failure occurred while attempting to bootstrap the user's LLDBInit file. */
-"BootstrapLLDBInitFailed" = "Failed to bootstrap LLDBInit file, bootstrapping script returned error code %1$d, %2$@.";
-
/* Warning when a failure occurred while cleaning dSYMs in the SQLite store used by the DBGShellCommands script. */
-"CleanCachedDsymsFailed" = "Failed to clean cache of dSYMs, clean script returned error code %1$d, %2$@.";
+"CleanCachedDsymsFailed" = "Failed to clean cache of dSYMs, clean script returned %1$@.";
/* Failed to copy an important file resource, the resulting project will most likely be broken. A bug should be reported. */
"CopyingResourceFailed" = "Failed to copy project resource '%1$@' to '%2$@'. The generated project will probably malfunction, please report. Error: %3$@";
diff --git a/src/TulsiGenerator/Scripts/bazel_build.py b/src/TulsiGenerator/Scripts/bazel_build.py
index 29c514e..dcd2e89 100755
--- a/src/TulsiGenerator/Scripts/bazel_build.py
+++ b/src/TulsiGenerator/Scripts/bazel_build.py
@@ -29,6 +29,7 @@
import re
import shutil
import signal
+import StringIO
import subprocess
import sys
import textwrap
@@ -38,8 +39,6 @@
from apfs_clone_copy import CopyOnWrite
import bazel_build_events
import bazel_options
-from bootstrap_lldbinit import BootstrapLLDBInit
-from bootstrap_lldbinit import TULSI_LLDBINIT_FILE
from execroot_path import BAZEL_EXECUTION_ROOT
import tulsi_logging
from update_symbol_cache import UpdateSymbolCache
@@ -1446,24 +1445,69 @@
self.codesign_attributes[signed_bundle] = bundle_attributes
return bundle_attributes.Get(attribute)
- # File for custom lldbinit changes.
- # WARNING: This file will override any dSYM based source remappings AND
- # ~/.lldbinit-tulsiproj remappings. Use of this file is strongly discouraged.
+ _TULSI_LLDBINIT_BLOCK_START = '# <TULSI> LLDB bridge [:\n'
+ _TULSI_LLDBINIT_BLOCK_END = '# ]: <TULSI> LLDB bridge\n'
+ _TULSI_LLDBINIT_FILE = os.path.expanduser('~/.lldbinit-tulsiproj')
_TULSI_LLDBINIT_EPILOGUE_FILE = (
os.path.expanduser('~/.lldbinit-tulsiproj-epilogue'))
+ def _ExtractLLDBInitContent(self, lldbinit_path):
+ """Extracts the non-Tulsi content of the given lldbinit file."""
+ if not os.path.isfile(lldbinit_path):
+ return []
+ content = []
+ with open(lldbinit_path) as f:
+ ignoring = False
+ for line in f:
+ if ignoring:
+ if line == self._TULSI_LLDBINIT_BLOCK_END:
+ ignoring = False
+ continue
+ if line == self._TULSI_LLDBINIT_BLOCK_START:
+ ignoring = True
+ continue
+ content.append(line)
+ return content
+
+ def _LinkTulsiLLDBInit(self):
+ """Adds a reference to ~/.lldbinit-tulsi to the primary lldbinit file.
+
+ Xcode 8+ caches the contents of ~/.lldbinit-Xcode on startup. To get around
+ this, an external reference to ~/.lldbinit-tulsi is added, causing LLDB
+ itself to load the possibly modified contents on each session.
+ """
+
+ lldbinit_path = os.path.expanduser('~/.lldbinit-Xcode')
+ if not os.path.isfile(lldbinit_path):
+ lldbinit_path = os.path.expanduser('~/.lldbinit')
+
+ content = self._ExtractLLDBInitContent(lldbinit_path)
+ out = StringIO.StringIO()
+ for line in content:
+ out.write(line)
+
+ out.write(self._TULSI_LLDBINIT_BLOCK_START)
+ out.write('# This was autogenerated by Tulsi in order to influence LLDB '
+ 'source-maps at build time.\n')
+ out.write('command source %s\n' % self._TULSI_LLDBINIT_FILE)
+ out.write(self._TULSI_LLDBINIT_BLOCK_END)
+
+ with open(lldbinit_path, 'w') as outfile:
+ out.seek(0)
+ # Negative length to make copyfileobj write the whole file at once.
+ shutil.copyfileobj(out, outfile, -1)
+
def _LinkTulsiLLDBInitEpilogue(self, outfile):
"""Adds a reference to ~/.lldbinit-tulsi-epilogue if it exists.
This file can be used to append more LLDB commands right after
- ~/.lldbinit-tulsiproj is loaded.
+ .lldbinit-tulsi is sourced.
- Use of this file is strongly discouraged; it will override any other
- changes made by ~/.lldbinit, ~/.lldbinit-tulsiproj and dSYM bundle path
- mappings.
+ Useful for extending or resetting LLDB settings that Tulsi may have set
+ automatically
Args:
- outfile: a file-type object, expected to be ~/.lldbinit-tulsiproj.
+ outfile: a file-type object.
Returns:
None
@@ -1478,12 +1522,9 @@
if self.product_type == 'com.apple.product-type.application.watchapp2':
return 0
- # Make sure a reference to ~/.lldbinit-tulsiproj exists in ~/.lldbinit or
- # ~/.lldbinit-Xcode. Priority is given to ~/.lldbinit-Xcode if it exists,
- # otherwise the bootstrapping will be written to ~/.lldbinit.
- BootstrapLLDBInit()
+ self._LinkTulsiLLDBInit()
- with open(TULSI_LLDBINIT_FILE, 'w') as out:
+ with open(self._TULSI_LLDBINIT_FILE, 'w') as out:
out.write('# This file is autogenerated by Tulsi and should not be '
'edited.\n')
diff --git a/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py b/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py
deleted file mode 100755
index c0c7178..0000000
--- a/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 The Tulsi Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Bootstraps the presence and setup of ~/.lldbinit-tulsiproj."""
-
-import os
-import shutil
-import StringIO
-import sys
-
-
-TULSI_LLDBINIT_FILE = os.path.expanduser('~/.lldbinit-tulsiproj')
-
-
-class BootstrapLLDBInit(object):
- """Bootstrap Xcode's preferred lldbinit for Bazel debugging."""
-
- def _ExtractLLDBInitContent(self, lldbinit_path, source_string):
- """Extracts non-Tulsi content in a given lldbinit if needed.
-
- Args:
- lldbinit_path: Absolute path to the lldbinit we are writing to.
- source_string: String that we wish to write to lldbinit.
-
- Returns:
- (int, [string]): A tuple featuring the status code along with the list
- of strings representing content to write to lldbinit
- that does not account for the Tulsi-generated strings.
- Status code will be 0 if Tulsi-generated strings are
- not all there. Status code will be 1 if all Tulsi
- strings were accounted for. Status code will be 2 if
- the lldbinit file could not be found.
- """
- if not os.path.isfile(lldbinit_path):
- return (2, [])
- content = []
- with open(lldbinit_path) as f:
- ignoring = False
-
- # Split on the newline. This works as long as the last string isn't
- # suffixed with \n.
- source_lines = source_string.split('\n')
-
- source_idx = 0
-
- # If the last line was suffixed with \n, last elements would be length
- # minus 2, accounting for the extra \n.
- source_last = len(source_lines) - 1
-
- for line in f:
-
- # For each line found matching source_string, increment the iterator
- # and do not append that line to the list.
- if source_lines[source_idx] in line:
-
- # If all lines were found, return an error code with empty content.
- if source_idx == source_last:
- return (1, [])
-
- # Increment for each matching line found.
- source_idx += 1
- ignoring = True
- continue
-
- if ignoring:
-
- # If the last line was found...
- if source_lines[source_last] in line:
- # Stop ignoring lines and continue appending to content.
- ignoring = False
- continue
-
- # If the line could not be found within source_string, append to the
- # content array.
- content.append(line)
-
- return (0, content)
-
- def _LinkTulsiLLDBInit(self):
- """Adds a reference to ~/.lldbinit-tulsiproj to the primary lldbinit file.
-
- Xcode 8+ executes the contents of the first available lldbinit on startup.
- To help work around this, an external reference to ~/.lldbinit-tulsiproj is
- added to that lldbinit. This causes Xcode's lldb-rpc-server to load the
- possibly modified contents between Debug runs of any given app. Note that
- this only happens after a Debug session terminates; the cache is only fully
- invalidated after Xcode is relaunched.
- """
-
- # ~/.lldbinit-Xcode is the only lldbinit file that Xcode will read if it is
- # present, therefore it has priority.
- lldbinit_path = os.path.expanduser('~/.lldbinit-Xcode')
- if not os.path.isfile(lldbinit_path):
- # If ~/.lldbinit-Xcode does not exist, write the reference to
- # ~/.lldbinit-tulsiproj to ~/.lldbinit, the second lldbinit file that
- # Xcode will attempt to read if ~/.lldbinit-Xcode isn't present.
- lldbinit_path = os.path.expanduser('~/.lldbinit')
-
- # String that we plan to inject into this lldbinit.
- source_string = ('# <TULSI> LLDB bridge [:\n'
- '# This was autogenerated by Tulsi in order to modify '
- 'LLDB source-maps at build time.\n'
- 'command source %s\n' % TULSI_LLDBINIT_FILE +
- '# ]: <TULSI> LLDB bridge')
-
- # Retrieve the contents of lldbinit if applicable along with a return code.
- return_code, content = self._ExtractLLDBInitContent(lldbinit_path,
- source_string)
-
- # If we should ignore the contents of this lldbinit, and it has the
- # association with ~/.lldbinit-tulsiproj that we want, do not modify it.
- if return_code != 0:
- return
-
- # Otherwise, print the existing contents of this ~/.lldbinit out without
- # any malformed tulsi lldbinit block, and add the correct tulsi lldbinit
- # block to the end of it.
- out = StringIO.StringIO()
- for line in content:
- out.write(line)
-
- # Add a newline after the source_string for protection from other elements
- # within the lldbinit file.
- out.write(source_string + '\n')
-
- with open(lldbinit_path, 'w') as outfile:
- out.seek(0)
- # Negative length to make copyfileobj write the whole file at once.
- shutil.copyfileobj(out, outfile, -1)
-
- def __init__(self):
- self._LinkTulsiLLDBInit()
-
-
-if __name__ == '__main__':
- BootstrapLLDBInit()
- sys.exit(0)
diff --git a/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift b/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
index de2f28a..263dd8b 100644
--- a/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
@@ -53,7 +53,6 @@
bundle.url(forResource: "bazel_options", withExtension: "py")!,
bundle.url(forResource: "apfs_clone_copy", withExtension: "py")!,
bundle.url(forResource: "bazel_build_events", withExtension: "py")!,
- bundle.url(forResource: "bootstrap_lldbinit", withExtension: "py")!,
bundle.url(forResource: "symbol_cache_schema", withExtension: "py")!,
bundle.url(forResource: "update_symbol_cache", withExtension: "py")!,
bundle.url(forResource: "install_genfiles", withExtension: "py")!],
diff --git a/src/TulsiGenerator/XcodeProjectGenerator.swift b/src/TulsiGenerator/XcodeProjectGenerator.swift
index e5f870b..6f7ad9d 100644
--- a/src/TulsiGenerator/XcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/XcodeProjectGenerator.swift
@@ -70,7 +70,6 @@
private static let CleanScript = "bazel_clean.sh"
private static let ShellCommandsUtil = "bazel_cache_reader"
private static let ShellCommandsCleanScript = "clean_symbol_cache"
- private static let LLDBInitBootstrapScript = "bootstrap_lldbinit"
private static let WorkspaceFile = "WORKSPACE"
private static let IOSUIRunnerEntitlements = "iOSXCTRunner.entitlements"
private static let MacOSUIRunnerEntitlements = "macOSXCTRunner.entitlements"
@@ -551,9 +550,6 @@
cleanCachedDsymPaths()
}
}
- profileAction("bootstrapping_lldbinit") {
- bootstrapLLDBInit()
- }
return GeneratedProjectInfo(project: xcodeProject,
buildRuleEntries: targetRules,
testSuiteRuleEntries: testSuiteRules,
@@ -1120,48 +1116,30 @@
}
}
- private func executePythonProcess(_ scriptFileName: String, onError: @escaping (Int32, String) -> Void) {
+ private func cleanCachedDsymPaths() {
+ // Execute the script to clean up missing dSYM bundles asynchronously.
let bundle = Bundle(for: type(of: self))
- let cleanSymbolsSourceURL = bundle.url(forResource: scriptFileName, withExtension: "py")!
+ let cleanSymbolsSourceURL = bundle.url(forResource: XcodeProjectGenerator.ShellCommandsCleanScript, withExtension: "py")!
let process = ProcessRunner.createProcess(cleanSymbolsSourceURL.path,
arguments: [String]()) {
completionInfo in
- if completionInfo.terminationStatus != 0 {
- if let stderr = NSString(data: completionInfo.stderr,
- encoding: String.Encoding.utf8.rawValue) {
- guard !stderr.trimmingCharacters(in: .whitespaces).isEmpty else {
- return
- }
- onError(completionInfo.terminationStatus, stderr as String)
+ if let stderr = NSString(data: completionInfo.stderr,
+ encoding: String.Encoding.utf8.rawValue) {
+ guard !stderr.trimmingCharacters(in: .whitespaces).isEmpty else {
+ return
+ }
+ Thread.doOnMainQueue {
+ self.localizedMessageLogger.warning("CleanCachedDsymsFailed",
+ comment: LocalizedMessageLogger.bugWorthyComment("Failed to clean cached references to existing dSYM bundles."),
+ context: self.config.projectName,
+ values: stderr)
}
}
}
process.launch()
}
- private func cleanCachedDsymPaths() {
- // Execute the script to clean up missing dSYM bundles asynchronously.
- self.executePythonProcess(XcodeProjectGenerator.ShellCommandsCleanScript) { (returncode, stderr) in
- self.localizedMessageLogger.warning("CleanCachedDsymsFailed",
- comment: LocalizedMessageLogger.bugWorthyComment("Failed to clean cached references to existing dSYM bundles."),
- context: self.config.projectName,
- values: returncode, stderr)
- }
- }
-
- private func bootstrapLLDBInit() {
- // Execute the script to bootstrap LLDBInit for path remapping. This needs to be read by Xcode
- // before Xcode.app launches so that its instance of LLDB can find the file where we do the path
- // remappings when dSYM bundles aren't present, which is ~/.lldbinit-tulsiproj.
- self.executePythonProcess(XcodeProjectGenerator.LLDBInitBootstrapScript) { (returncode, stderr) in
- self.localizedMessageLogger.warning("BootstrapLLDBInitFailed",
- comment: LocalizedMessageLogger.bugWorthyComment("Failed to bootstrap LLDBInit for debug symbol remapping."),
- context: self.config.projectName,
- values: returncode, stderr)
- }
- }
-
private func installTulsiScripts(_ projectURL: URL) {
let scriptDirectoryURL = projectURL.appendingPathComponent(XcodeProjectGenerator.ScriptDirectorySubpath,