[Lldb-commits] [lldb] r250772 - Fixed PlatformDarwin to locate Xcode by using HostInfo::GetProgramFileSpec(). This function returns the FileSpec to the program that is running the LLDB.framework or lldb.so and is more reliable than checking the path of LLDB.framework/lldb.so itself since it might not exist within the Xcode.app bundle (DYLD_FRAMEWORK_PATH). Then we check DEVELOPER_DIR, then check the currently installed Xcode with xcrun.

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 19 17:22:50 PDT 2015


Author: gclayton
Date: Mon Oct 19 19:22:50 2015
New Revision: 250772

URL: http://llvm.org/viewvc/llvm-project?rev=250772&view=rev
Log:
Fixed PlatformDarwin to locate Xcode by using HostInfo::GetProgramFileSpec(). This function returns the FileSpec to the program that is running the LLDB.framework or lldb.so and is more reliable than checking the path of LLDB.framework/lldb.so itself since it might not exist within the Xcode.app bundle (DYLD_FRAMEWORK_PATH). Then we check DEVELOPER_DIR, then check the currently installed Xcode with xcrun.

<rdar://problem/23167253>


Modified:
    lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp

Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp?rev=250772&r1=250771&r2=250772&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp Mon Oct 19 19:22:50 2015
@@ -1211,54 +1211,74 @@ static const char *const sdk_strings[] =
 };
 
 static FileSpec
+CheckPathForXcode(const FileSpec &fspec)
+{
+    if (fspec.Exists())
+    {
+        const char substr[] = ".app/Contents/";
+
+        std::string path_to_shlib = fspec.GetPath();
+        size_t pos = path_to_shlib.rfind(substr);
+        if (pos != std::string::npos)
+        {
+            path_to_shlib.erase(pos + strlen(substr));
+            return FileSpec(path_to_shlib.c_str(), false);
+        }
+    }
+    return FileSpec();
+}
+
+static FileSpec
 GetXcodeContentsPath ()
 {
     static FileSpec g_xcode_filespec;
     static std::once_flag g_once_flag;
     std::call_once(g_once_flag, []() {
 
-        const char substr[] = ".app/Contents/";
-    
-        // First, try based on the current shlib's location
+
         FileSpec fspec;
-        
-        if (HostInfo::GetLLDBPath (lldb::ePathTypeLLDBShlibDir, fspec))
+
+        // First get the program file spec. If lldb.so or LLDB.framework is running
+        // in a program and that program is Xcode, the path returned with be the path
+        // to Xcode.app/Contents/MacOS/Xcode, so this will be the correct Xcode to use.
+        fspec = HostInfo::GetProgramFileSpec();
+
+        if (fspec)
         {
-            std::string path_to_shlib = fspec.GetPath();
-            size_t pos = path_to_shlib.rfind(substr);
-            if (pos != std::string::npos)
-            {
-                path_to_shlib.erase(pos + strlen(substr));
-                g_xcode_filespec = FileSpec(path_to_shlib.c_str(), false);
-            }
+            g_xcode_filespec = CheckPathForXcode(fspec);
         }
 
-        // Fall back to using xcrun
+        // Next check DEVELOPER_DIR environment variable
         if (!g_xcode_filespec)
         {
-            int status = 0;
-            int signo = 0;
-            std::string output;
-            const char *command = "xcrun -sdk macosx --show-sdk-path";
-            lldb_private::Error error = Host::RunShellCommand (command,   // shell command to run
-                                                               NULL,      // current working directory
-                                                               &status,   // Put the exit status of the process in here
-                                                               &signo,    // Put the signal that caused the process to exit in here
-                                                               &output,   // Get the output from the command and place it in this string
-                                                               3);        // Timeout in seconds to wait for shell program to finish
-            if (status == 0 && !output.empty())
+            const char *developer_dir_env_var = getenv("DEVELOPER_DIR");
+            if (developer_dir_env_var && developer_dir_env_var[0])
             {
-                size_t first_non_newline = output.find_last_not_of("\r\n");
-                if (first_non_newline != std::string::npos)
-                {
-                    output.erase(first_non_newline+1);
-                }
-                
-                size_t pos = output.rfind(substr);
-                if (pos != std::string::npos)
+                g_xcode_filespec = CheckPathForXcode(FileSpec(developer_dir_env_var, true));
+            }
+
+            // Fall back to using "xcrun" to find the selected Xcode
+            if (!g_xcode_filespec)
+            {
+                int status = 0;
+                int signo = 0;
+                std::string output;
+                const char *command = "xcrun -sdk macosx --show-sdk-path";
+                lldb_private::Error error = Host::RunShellCommand (command,   // shell command to run
+                                                                   NULL,      // current working directory
+                                                                   &status,   // Put the exit status of the process in here
+                                                                   &signo,    // Put the signal that caused the process to exit in here
+                                                                   &output,   // Get the output from the command and place it in this string
+                                                                   3);        // Timeout in seconds to wait for shell program to finish
+                if (status == 0 && !output.empty())
                 {
-                    output.erase(pos + strlen(substr));
-                    g_xcode_filespec = FileSpec(output.c_str(), false);
+                    size_t first_non_newline = output.find_last_not_of("\r\n");
+                    if (first_non_newline != std::string::npos)
+                    {
+                        output.erase(first_non_newline+1);
+                    }
+
+                    g_xcode_filespec = CheckPathForXcode(FileSpec(output.c_str(), false));
                 }
             }
         }
@@ -1561,20 +1581,7 @@ PlatformDarwin::LocateExecutable (const
     std::call_once(g_once_flag,  []() {
 
         // When locating executables, trust the DEVELOPER_DIR first if it is set
-        FileSpec xcode_contents_dir;
-        const char *developer_dir_env_var = getenv("DEVELOPER_DIR");
-        if (developer_dir_env_var && developer_dir_env_var[0])
-        {
-            xcode_contents_dir = FileSpec(developer_dir_env_var, true);
-            if (xcode_contents_dir.Exists())
-                xcode_contents_dir.RemoveLastPathComponent();
-        }
-        if (!xcode_contents_dir)
-        {
-            xcode_contents_dir = GetXcodeContentsPath();
-            if (!xcode_contents_dir.Exists())
-                xcode_contents_dir.Clear();
-        }
+        FileSpec xcode_contents_dir = GetXcodeContentsPath();
         if (xcode_contents_dir)
         {
             FileSpec xcode_lldb_resources = xcode_contents_dir;




More information about the lldb-commits mailing list