[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/Python-Repository-Hub/voltron/master/install.sh [Back]  [Original]

#!/bin/bash
#
# Install Voltron for whichever debuggers are detected (only GDB and LLDB so
# far).
#

function usage {
    cat &1
    if [ $? -ne 0 ];
    then
        # If not, attempt to install it using ensurepip
        echo "Attempting to install pip using 'ensurepip'."
        ${SUDO} ${LLDB_PYTHON} -m ensurepip $USER_MODE || return $?
    fi
    # Some really old pip installations default to the old pypi.python.org, which no longer works.
    echo "Attempting to upgrade pip."
    ${SUDO} ${LLDB_PYTHON} -m pip install "pip>=$PIP_MIN_VER" $USER_MODE -U --index-url "$PYPI_URL"
    if [ $? != 0 ];
    then
        # We may still fail here due to TLS incompatibility
        # TLS 1.x got turned off 2018-04-11
        # https://status.python.org/incidents/hdx7w97m5hr8
        # Curl may be new enough to support TLS 1.2, so try to curl the pip installer from pypa.io
        # It's able to download and install pip without TLS errors somehow
        echo "Failed to upgrade pip."
        echo "Attempting to fall back to installation via curl."
        curl_get_pip || return $?
    fi
}

function get_lldb_python_exe {
    # Find the Python version used by LLDB
    local lldb_pyver=$(${LLDB} -Q -x -b --one-line 'script import platform; print(".".join(platform.python_version_tuple()[:2]))'|tail -1)
    local lldb_python=$(${LLDB} -Q -x -b --one-line 'script import sys; print(sys.executable)'|tail -1)
    
    lldb_python=$(${LLDB} -Q -x -b --one-line 'script import sys; print(sys.executable)'|tail -1)
    local lldb_python_basename=$(basename "${lldb_python}")
    if [ "python" = "$lldb_python_basename" ];
    then
        lldb_python="${lldb_python/%$lldb_pyver/}${lldb_pyver}"
    elif [ "lldb" = "$lldb_python_basename" ];
    then
        # newer lldb versions report sys.path as /path/to/lldb instead of python
        # sys.exec_path still appears to be the parent path of bin/python though
        local lldb_python_exec_prefix=$(${LLDB} -Q -x -b --one-line 'script import sys; print(sys.exec_prefix)'|tail -1)
        lldb_python="$lldb_python_exec_prefix/bin/python"
        lldb_python="${lldb_python/%$lldb_pyver/}${lldb_pyver}"
    fi

    echo "$lldb_python"

}

if [ "${BACKEND_GDB}" -eq 1 ]; then
    # Find the Python version used by GDB
    GDB_PYVER=$(${GDB} -batch -q --nx -ex 'pi import platform; print(".".join(platform.python_version_tuple()[:2]))')
    GDB_PYTHON=$(${GDB} -batch -q --nx -ex 'pi import sys; print(sys.executable)')
    GDB_PYTHON="${GDB_PYTHON/%$GDB_PYVER/}${GDB_PYVER}"

    install_packages

    if [ -z $USER_MODE ]; then
        GDB_SITE_PACKAGES=$(${GDB} -batch -q --nx -ex 'pi import site; print(site.getsitepackages()[0])')
    else
        GDB_SITE_PACKAGES=$(${GDB} -batch -q --nx -ex 'pi import site; print(site.getusersitepackages())')
    fi

    # Install Voltron and dependencies
    ${SUDO} ${GDB_PYTHON} -m pip install -U $USER_MODE $DEV_MODE .

    # Add Voltron to gdbinit
    GDB_INIT_FILE="${HOME}/.gdbinit"
    if [ -e ${GDB_INIT_FILE} ]; then
        sed -i.bak '/voltron/d' ${GDB_INIT_FILE}
    fi

    if [ -z $DEV_MODE ]; then
        GDB_ENTRY_FILE="$GDB_SITE_PACKAGES/voltron/entry.py"
    else
        GDB_ENTRY_FILE="$(pwd)/voltron/entry.py"
    fi
    echo "source $GDB_ENTRY_FILE" >> ${GDB_INIT_FILE}
fi

if [ "${BACKEND_LLDB}" -eq 1 ]; then

    LLDB_PYTHON=$(get_lldb_python_exe) || quit "Failed to locate python interpreter." 1
    ensure_pip || quit "Failed to install pip." 1
    ${LLDB_PYTHON} -m pip install --user --upgrade six || quit "Failed to install or upgrade 'six' python package." 1

    if [ -n "${VENV}" ]; then
        echo "Creating virtualenv..."
        ${LLDB_PYTHON} -m pip install --user virtualenv
        ${LLDB_PYTHON} -m virtualenv "${VENV}"
        LLDB_PYTHON="${VENV}/bin/python"
        LLDB_SITE_PACKAGES=$(find "${VENV}" -name site-packages)
    elif [ -z "${USER_MODE}" ]; then
        LLDB_SITE_PACKAGES=$(${LLDB} -Q -x -b --one-line 'script import site; print(site.getsitepackages()[0])'|tail -1) || quit "Failed to locate site-packages." 1
    else
        LLDB_SITE_PACKAGES=$(${LLDB} -Q -x -b --one-line 'script import site; print(site.getusersitepackages())'|tail -1) || quit "Failed to locate site-packages." 1
    fi

    install_packages || quit "Failed to install packages." 1

    if [ "$LLDB_SITE_PACKAGES" == "$GDB_SITE_PACKAGES" ]; then
        echo "Skipping installation for LLDB - same site-packages directory"
    else
        # Install Voltron and dependencies
        ${SUDO} ${LLDB_PYTHON} -m pip install -U $USER_MODE $DEV_MODE . || quit "Failed to install voltron." 1
    fi

    # Add Voltron to lldbinit
    LLDB_INIT_FILE="${HOME}/.lldbinit"
    if [ -e ${LLDB_INIT_FILE} ]; then
        sed -i.bak '/voltron/d' ${LLDB_INIT_FILE}
    fi

    if [ -z "${DEV_MODE}" ]; then
        LLDB_ENTRY_FILE="$LLDB_SITE_PACKAGES/voltron/entry.py"
    else
        LLDB_ENTRY_FILE="$(pwd)/voltron/entry.py"
    fi

    if [ -n "${VENV}" ]; then
        echo "script import sys;sys.path.append('${LLDB_SITE_PACKAGES}')" >> ${LLDB_INIT_FILE}
    fi
    echo "command script import $LLDB_ENTRY_FILE" >> ${LLDB_INIT_FILE}
fi

if [ "${BACKEND_GDB}" -ne 1 ] && [ "${BACKEND_LLDB}" -ne 1 ]; then
    # Find system Python
    PYTHON=$(command -v python)
    PYVER=$(${PYTHON} -c 'import platform; print(".".join(platform.python_version_tuple()[:2]))')
    if [ -z $USER_MODE ]; then
        PYTHON_SITE_PACKAGES=$(${PYTHON} -c 'import site; print(site.getsitepackages()[0])')
    else
        PYTHON_SITE_PACKAGES=$(${PYTHON} -c 'import site; print(site.getusersitepackages())')
    fi

    install_packages

    # Install Voltron and dependencies
    ${SUDO} ${PYTHON} -m pip install -U $USER_MODE $DEV_MODE .
fi

set +x
echo "=============================================================="
if [ "${BACKEND_GDB}" -eq 1 ]; then
    echo "Installed for GDB (${GDB}):"
    echo "  Python:             $GDB_PYTHON"
    echo "  Packages directory: $GDB_SITE_PACKAGES"
    echo "  Added voltron to:   $GDB_INIT_FILE"
    echo "  Entry point:        $GDB_ENTRY_FILE"
fi
if [ "${BACKEND_LLDB}" -eq 1 ]; then
    echo "Installed for LLDB (${LLDB}):"
    echo "  Python:             $LLDB_PYTHON"
    echo "  Packages directory: $LLDB_SITE_PACKAGES"
    echo "  Added voltron to:   $LLDB_INIT_FILE"
    echo "  Entry point:        $LLDB_ENTRY_FILE"
fi
if [ "${BACKEND_GDB}" -ne 1 ] && [ "${BACKEND_LLDB}" -ne 1 ]; then
    if [ -z "${GDB}" ] && [ -z "${LLDB}" ]; then
        echo -n "Couldn't find any debuggers. "
    else
        echo -n "No debuggers selected. "
    fi

    echo "Installed using the Python in your path:"
    echo "  Python:             $PYTHON"
    echo "  Packages directory: $PYTHON_SITE_PACKAGES"
    echo "  Did not add Voltron to any debugger init files."
fi

Web Proxy Viewer  |  New URL  |  Original Page