Expose SBPlatform through the public API.

Example code:

remote_platform = lldb.SBPlatform("remote-macosx"); 
remote_platform.SetWorkingDirectory("/private/tmp")
debugger.SetSelectedPlatform(remote_platform)

connect_options = lldb.SBPlatformConnectOptions("connect://localhost:1111"); 
err = remote_platform.ConnectRemote(connect_options)
if err.Success():
    print >> result, 'Connected to remote platform:'
    print >> result, 'hostname: %s' % (remote_platform.GetHostname())
    src = lldb.SBFileSpec("/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework", False)
    dst = lldb.SBFileSpec()
    # copy src to platform working directory since "dst" is empty
    err = remote_platform.Install(src, dst);
    if err.Success():
        print >> result, '%s installed successfully' % (src)
    else:
        print >> result, 'error: failed to install "%s": %s' % (src, err)


Implemented many calls needed in lldb-platform to be able to install a directory that contains symlinks, file and directories.

The remote lldb-platform can now launch GDB servers on the remote system so that remote debugging can be spawned through the remote platform when connected to a remote platform.

The API in SBPlatform is subject to change and will be getting many new functions.

llvm-svn: 195273
diff --git a/lldb/scripts/Python/build-swig-Python.sh b/lldb/scripts/Python/build-swig-Python.sh
index 28e7df9..efa35e8 100755
--- a/lldb/scripts/Python/build-swig-Python.sh
+++ b/lldb/scripts/Python/build-swig-Python.sh
@@ -152,6 +152,7 @@
 " ${SRC_ROOT}/scripts/Python/interface/SBListener.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBModule.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBModuleSpec.i"\
+" ${SRC_ROOT}/scripts/Python/interface/SBPlatform.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBProcess.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBSourceManager.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBStream.i"\
diff --git a/lldb/scripts/Python/interface/SBDebugger.i b/lldb/scripts/Python/interface/SBDebugger.i
index 43cc16e..6d075ac 100644
--- a/lldb/scripts/Python/interface/SBDebugger.i
+++ b/lldb/scripts/Python/interface/SBDebugger.i
@@ -231,6 +231,12 @@
     void
     SetSelectedTarget (lldb::SBTarget &target);
 
+    lldb::SBPlatform
+    GetSelectedPlatform();
+    
+    void
+    SetSelectedPlatform(lldb::SBPlatform &platform);
+
     lldb::SBSourceManager
     GetSourceManager ();
 
diff --git a/lldb/scripts/Python/interface/SBFileSpec.i b/lldb/scripts/Python/interface/SBFileSpec.i
index 07d97ba..2195434 100644
--- a/lldb/scripts/Python/interface/SBFileSpec.i
+++ b/lldb/scripts/Python/interface/SBFileSpec.i
@@ -58,6 +58,12 @@
     const char *
     GetDirectory() const;
 
+    void
+    SetFilename(const char *filename);
+    
+    void
+    SetDirectory(const char *directory);
+
     uint32_t
     GetPath (char *dst_path, size_t dst_len) const;
 
diff --git a/lldb/scripts/Python/interface/SBModule.i b/lldb/scripts/Python/interface/SBModule.i
index fdf0177..21f9dcc 100644
--- a/lldb/scripts/Python/interface/SBModule.i
+++ b/lldb/scripts/Python/interface/SBModule.i
@@ -148,6 +148,12 @@
 
     bool
     SetPlatformFileSpec (const lldb::SBFileSpec &platform_file);
+             
+    lldb::SBFileSpec
+    GetRemoteInstallFileSpec ();
+
+    bool
+    SetRemoteInstallFileSpec (lldb::SBFileSpec &file);
 
     %feature("docstring", "Returns the UUID of the module as a Python string."
     ) GetUUIDString;
diff --git a/lldb/scripts/Python/interface/SBPlatform.i b/lldb/scripts/Python/interface/SBPlatform.i
new file mode 100644
index 0000000..ef03b0c
--- /dev/null
+++ b/lldb/scripts/Python/interface/SBPlatform.i
@@ -0,0 +1,187 @@
+//===-- SWIG Interface for SBPlatform ---------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+
+    
+class SBPlatformConnectOptions
+{
+public:
+    SBPlatformConnectOptions (const char *url);
+    
+    SBPlatformConnectOptions (const SBPlatformConnectOptions &rhs);
+    
+    ~SBPlatformConnectOptions ();
+    
+    const char *
+    GetURL();
+    
+    void
+    SetURL(const char *url);
+    
+    bool
+    GetRsyncEnabled();
+    
+    void
+    EnableRsync (const char *options,
+                 const char *remote_path_prefix,
+                 bool omit_remote_hostname);
+    
+    void
+    DisableRsync ();
+    
+    const char *
+    GetLocalCacheDirectory();
+    
+    void
+    SetLocalCacheDirectory(const char *path);
+};
+
+class SBPlatformShellCommand
+{
+public:
+    SBPlatformShellCommand (const char *shell_command);
+    
+    SBPlatformShellCommand (const SBPlatformShellCommand &rhs);
+    
+    ~SBPlatformShellCommand();
+    
+    void
+    Clear();
+
+    const char *
+    GetCommand();
+
+    void
+    SetCommand(const char *shell_command);
+    
+    const char *
+    GetWorkingDirectory ();
+
+    void
+    SetWorkingDirectory (const char *path);
+
+    uint32_t
+    GetTimeoutSeconds ();
+    
+    void
+    SetTimeoutSeconds (uint32_t sec);
+    
+    int
+    GetSignal ();
+    
+    int
+    GetStatus ();
+    
+    const char *
+    GetOutput ();
+};
+
+%feature("docstring",
+"A class that represents the a platform that can represent the current host or a remote host debug platform.
+
+The SBPlatform class represents the current host, or a remote host.
+It can be connected to a remote platform in order to provide ways
+to remotely launch and attach to processes, upload/download files,
+create directories, run remote shell commands, find locally cached
+versions of files from the remote system, and much more.
+         
+SBPlatform objects can be created and then used to connect to a remote
+platform which allows the SBPlatform to be used to get a list of the
+current processes on the remote host, attach to one of those processes,
+install programs on the remote system, attach and launch processes,
+and much more.
+
+Every SBTarget has a corresponding SBPlatform. The platform can be
+specified upon target creation, or the currently selected platform
+will attempt to be used when creating the target automatically as long
+as the currently selected platform matches the target architecture
+and executable type. If the architecture or executable type do not match,
+a suitable platform will be found automatically."
+         
+) SBPlatform;
+class SBPlatform
+{
+public:
+
+    SBPlatform ();
+
+    SBPlatform (const char *);
+
+    ~SBPlatform();
+    
+    bool
+    IsValid () const;
+
+    void
+    Clear ();
+
+    const char *
+    GetWorkingDirectory();
+    
+    bool
+    SetWorkingDirectory(const char *);
+
+    const char *
+    GetName ();
+    
+    SBError
+    ConnectRemote (lldb::SBPlatformConnectOptions &connect_options);
+    
+    void
+    DisconnectRemote ();
+
+    bool
+    IsConnected();
+    
+    const char *
+    GetTriple();
+    
+    const char *
+    GetHostname ();
+    
+    const char *
+    GetOSBuild ();
+    
+    const char *
+    GetOSDescription ();
+    
+    uint32_t
+    GetOSMajorVersion ();
+    
+    uint32_t
+    GetOSMinorVersion ();
+    
+    uint32_t
+    GetOSUpdateVersion ();
+    
+    lldb::SBError
+    Get (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);
+
+    lldb::SBError
+    Put (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);
+    
+    lldb::SBError
+    Install (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);
+    
+    lldb::SBError
+    Run (lldb::SBPlatformShellCommand &shell_command);
+
+    lldb::SBError
+    MakeDirectory (const char *path, uint32_t file_permissions = lldb::eFilePermissionsDirectoryDefault);
+    
+    uint32_t
+    GetFilePermissions (const char *path);
+    
+    lldb::SBError
+    SetFilePermissions (const char *path, uint32_t file_permissions);
+
+};
+
+} // namespace lldb
diff --git a/lldb/scripts/Python/interface/SBTarget.i b/lldb/scripts/Python/interface/SBTarget.i
index d259d92..92518fe 100644
--- a/lldb/scripts/Python/interface/SBTarget.i
+++ b/lldb/scripts/Python/interface/SBTarget.i
@@ -266,6 +266,25 @@
 
     %feature("docstring", "
     //------------------------------------------------------------------
+    /// Install any binaries that need to be installed.
+    ///
+    /// This function does nothing when debugging on the host system.
+    /// When connected to remote platforms, the target's main executable
+    /// and any modules that have their install path set will be
+    /// installed on the remote platform. If the main executable doesn't
+    /// have an install location set, it will be installed in the remote
+    /// platform's working directory.
+    ///
+    /// @return
+    ///     An error describing anything that went wrong during
+    ///     installation.
+    //------------------------------------------------------------------
+    ") Install;
+    lldb::SBError
+    Install();
+
+    %feature("docstring", "
+    //------------------------------------------------------------------
     /// Launch a new process.
     ///
     /// Launch a new process by spawning a new process using the