﻿""" Post process SWIG Bridge wrapper code Python script for Windows/LINUX/OSX platform

    --------------------------------------------------------------------------
    File:           finishSwigWrapperClasses.py

    Overview:       Python script(s) to finish off the SWIG Python C++ Script
                    Bridge wrapper code on the Windows/LINUX/OSX platform.
                    The Python scripts are equivalent to the shell script (.sh)
                    files.
                    We use SWIG to create a C++ file containing the appropriate
                    wrapper classes and functions for each scripting language,
                    before liblldb is built (thus the C++ file can be compiled
                    into liblldb.  In some cases, additional work may need to be
                    done after liblldb has been compiled, to make the scripting
                    language stuff fully functional.  Any such post-processing
                    is handled through the Python scripts called here.

    Gotchas:        None.

    Copyright:      None.
    --------------------------------------------------------------------------

"""

# Python modules:
import sys      # Provide argument parsing
import os       # Provide directory and file handling

# Third party modules:

# In-house modules:
import utilsArgsParse   # Parse and validate this script's input arguments
import utilsOsType      # Determine the OS type this script is running on
import utilsDebug       # Debug Python scripts

# Instantiations:
# True = Turn on script function tracing, False = off.
gbDbgVerbose = False
gbDbgFlag = False              # Global debug mode flag, set by input parameter
# --dbgFlag. True = operate in debug mode.
# True = yes called from makefile system, False = not.
gbMakeFileFlag = False

# User facing text:
strMsgErrorNoMain = "Program called by another Python script not allowed"
strExitMsgSuccess = "Program successful"
strExitMsgError = "Program error: "
strParameter = "Parameter: "
strMsgErrorOsTypeUnknown = "Unable to determine OS type"
strScriptDirNotFound = "Unable to locate the script directory \'/script\'"
strScriptLangsFound = "Found the following script languages:"
strPostProcessError = "Executing \'%s\' post process script failed: "
strScriptNotFound = "Unable to locate the post process script file \'%s\' in \'%s\'"
strScriptLangFound = "Found \'%s\' build script."
strScriptLangsFound = "Found the following script languages:"
strExecuteMsg = "Executing \'%s\' build script..."
strExecuteError = "Executing \'%s\' build script failed: "
strHelpInfo = "\
Python script(s) to finish off the SWIG Python C++ Script \n\
Bridge wrapper code on the Windows/LINUX/OSX platform.  The Python \n\
scripts are equivalent to the shell script (.sh) files \n\
run on others platforms.\n\
Args:   -h              (optional) Print help information on this program.\n\
    -d              (optional) Determines whether or not this script\n\
                    outputs additional information when running.\n\
    -m              (optional) Specify called from Makefile system.\n\
    --srcRoot=          The root of the lldb source tree.\n\
    --targetDir=            Where the lldb framework/shared library gets put.\n\
    --cfgBldDir=            (optional) Where the build-swig-Python-LLDB.py program \n\
                    will put the lldb.py file it generated from running\n\
                    SWIG.\n\
    --prefix=           (optional) Is the root directory used to determine where\n\
                    third-party modules for scripting languages should\n\
                    be installed. Where non-Darwin systems want to put\n\
                    the .py and .so files so that Python can find them\n\
                    automatically. Python install directory.\n\
    --lldbLibDir    (optional) The name of the directory containing liblldb.so.\n\
                    \"lib\" by default.\n\
    --cmakeBuildConfiguration=  (optional) Is the build configuration(Debug, Release, RelWithDebugInfo)\n\
                    used to determine where the bin and lib directories are \n\
                    created for a Windows build.\n\
    --argsFile=         The args are read from a file instead of the\n\
                    command line. Other command line args are ignored.\n\
    --useSystemSix  Use system six.py version.\n\
\n\
Usage:\n\
    finishSwigWrapperClasses.py --srcRoot=ADirPath --targetDir=ADirPath\n\
    --cfgBldDir=ADirPath --prefix=ADirPath --lldbLibDir=ADirPath -m -d\n\
\n\
"  # TAG_PROGRAM_HELP_INFO

#++---------------------------------------------------------------------------
# Details:  Exit the program on success. Called on program successfully done
#           its work. Returns a status result to the caller.
# Args:     vnResult    - (R) 0 or greater indicating success.
#           vMsg        - (R) Success message if any to show success to user.
# Returns:  None.
# Throws:   None.
#--


def program_exit_success(vnResult, vMsg):
    strMsg = ""

    if vMsg.__len__() != 0:
        strMsg = "%s: %s (%d)" % (strExitMsgSuccess, vMsg, vnResult)
        print(strMsg)

    sys.exit(vnResult)

#++---------------------------------------------------------------------------
# Details:  Exit the program with error. Called on exit program failed its
#           task. Returns a status result to the caller.
# Args:     vnResult    - (R) A negative number indicating error condition.
#           vMsg        - (R) Error message to show to user.
# Returns:  None.
# Throws:   None.
#--


def program_exit_on_failure(vnResult, vMsg):
    print(("%s%s (%d)" % (strExitMsgError, vMsg, vnResult)))
    sys.exit(vnResult)

#++---------------------------------------------------------------------------
# Details:  Exit the program return a exit result number and print a message.
#           Positive numbers and zero are returned for success other error
#           occurred.
# Args:     vnResult    - (R) A -ve (an error), 0 or +ve number (ok or status).
#           vMsg        - (R) Error message to show to user.
# Returns:  None.
# Throws:   None.
#--


def program_exit(vnResult, vMsg):
    if vnResult >= 0:
        program_exit_success(vnResult, vMsg)
    else:
        program_exit_on_failure(vnResult, vMsg)

#++---------------------------------------------------------------------------
# Details:  Dump input parameters.
# Args:     vDictArgs   - (R) Map of input args to value.
# Returns:  None.
# Throws:   None.
#--


def print_out_input_parameters(vDictArgs):
    for arg, val in list(vDictArgs.items()):
        strEqs = ""
        strQ = ""
        if val.__len__() != 0:
            strEqs = " ="
            strQ = "\""
        print(("%s%s%s %s%s%s\n" % (strParameter, arg, strEqs, strQ, val, strQ)))

#++---------------------------------------------------------------------------
# Details:  Validate the arguments passed to the program. This function exits
#           the program should error with the arguments be found.
# Args:     vArgv   - (R) List of arguments and values.
# Returns:  Int     - 0 = success, -ve = some failure.
#           Dict    - Map of arguments names to argument values
# Throws:   None.
#--


def validate_arguments(vArgv):
    dbg = utilsDebug.CDebugFnVerbose("validate_arguments()")
    strMsg = ""
    dictArgs = {}
    nResult = 0
    strListArgs = "hdm"  # Format "hiox:" = -h -i -o -x <arg>
    listLongArgs = [
        "srcRoot=",
        "targetDir=",
        "cfgBldDir=",
        "prefix=",
        "cmakeBuildConfiguration=",
        "lldbLibDir=",
        "argsFile",
        "useSystemSix"]
    dictArgReq = {"-h": "o",          # o = optional, m = mandatory
                  "-d": "o",
                  "-m": "o",
                  "--srcRoot": "m",
                  "--targetDir": "m",
                  "--cfgBldDir": "o",
                  "--prefix": "o",
                  "--cmakeBuildConfiguration": "o",
                  "--lldbLibDir": "o",
                  "--argsFile": "o",
                  "--useSystemSix": "o"}

    # Check for mandatory parameters
    nResult, dictArgs, strMsg = utilsArgsParse.parse(vArgv, strListArgs,
                                                     listLongArgs,
                                                     dictArgReq,
                                                     strHelpInfo)
    if nResult < 0:
        program_exit_on_failure(nResult, strMsg)

    # User input -h for help
    if nResult == 1:
        program_exit_success(0, strMsg)

    return (nResult, dictArgs)

#++---------------------------------------------------------------------------
# Details:  Locate post process script language directory and the script within
#           and execute.
# Args:     vStrScriptLang      - (R) Name of the script language to build.
#           vstrFinishFileName  - (R) Prefix file name to build full name.
#           vDictArgs           - (R) Program input parameters.
# Returns:  Int     - 0 = Success, < 0 some error condition.
#           Str     - Error message.
# Throws:   None.
#--


def run_post_process(vStrScriptLang, vstrFinishFileName, vDictArgs):
    dbg = utilsDebug.CDebugFnVerbose("run_post_process()")
    nResult = 0
    strStatusMsg = ""
    strScriptFile = vstrFinishFileName % vStrScriptLang
    strScriptFileDir = os.path.normpath(
        os.path.join(
            vDictArgs["--srcRoot"],
            "scripts",
            vStrScriptLang))
    strScriptFilePath = os.path.join(strScriptFileDir, strScriptFile)

    # Check for the existence of the script file
    strPath = os.path.normcase(strScriptFilePath)
    bOk = os.path.exists(strPath)
    if not bOk:
        strDir = os.path.normcase(strScriptFileDir)
        strStatusMsg = strScriptNotFound % (strScriptFile, strDir)
        return (-9, strStatusMsg)

    if gbDbgFlag:
        print((strScriptLangFound % vStrScriptLang))
        print((strExecuteMsg % vStrScriptLang))

    # Change where Python looks for our modules
    strDir = os.path.normcase(strScriptFileDir)
    sys.path.append(strDir)

    # Execute the specific language script
    dictArgs = vDictArgs  # Remove any args not required before passing on
    strModuleName = strScriptFile[: strScriptFile.__len__() - 3]
    module = __import__(strModuleName)
    nResult, strStatusMsg = module.main(dictArgs)

    # Revert sys path
    sys.path.remove(strDir)

    return (nResult, strStatusMsg)

#++---------------------------------------------------------------------------
# Details:  Step through each script language sub directory supported
#           and execute post processing script for each scripting language,
#           make sure the build script for that language exists.
#           For now the only language we support is Python, but we expect this
#           to change.
# Args:     vDictArgs   - (R) Program input parameters.
# Returns:  Int     - 0 = Success, < 0 some error condition.
#           Str     - Error message.
# Throws:   None.
#--


def run_post_process_for_each_script_supported(vDictArgs):
    dbg = utilsDebug.CDebugFnVerbose(
        "run_post_process_for_each_script_supported()")
    nResult = 0
    strStatusMsg = ""
    strScriptDir = os.path.normpath(
        os.path.join(
            vDictArgs["--srcRoot"],
            "scripts"))
    strFinishFileName = "finishSwig%sLLDB.py"

    # Check for the existence of the scripts folder
    strScriptsDir = os.path.normcase(strScriptDir)
    bOk = os.path.exists(strScriptsDir)
    if not bOk:
        return (-8, strScriptDirNotFound)

    # Look for any script language directories to build for
    listDirs = ["Python"]

    # Iterate script directory find any script language directories
    for scriptLang in listDirs:
        # __pycache__ is a magic directory in Python 3 that holds .pyc files
        if scriptLang != "__pycache__" and scriptLang != "swig_bot_lib":
            dbg.dump_text("Executing language script for \'%s\'" % scriptLang)
            nResult, strStatusMsg = run_post_process(
                scriptLang, strFinishFileName, vDictArgs)
        if nResult < 0:
            break

    if nResult < 0:
        strTmp = strPostProcessError % scriptLang
        strTmp += strStatusMsg
        strStatusMsg = strTmp

    return (nResult, strStatusMsg)

#++---------------------------------------------------------------------------
# Details:  Program's main() with arguments passed in from the command line.
#           Program either exits normally or with error from this function -
#           top most level function.
# Args:     vArgv   - (R) List of arguments and values.
# Returns:  None
# Throws:   None.
#--


def main(vArgv):
    dbg = utilsDebug.CDebugFnVerbose("main()")
    bOk = False
    dictArgs = {}
    nResult = 0
    strMsg = ""

    # The validate arguments fn will exit the program if tests fail
    nResult, dictArgs = validate_arguments(vArgv)

    eOSType = utilsOsType.determine_os_type()
    if eOSType == utilsOsType.EnumOsType.Unknown:
        program_exit(-4, strMsgErrorOsTypeUnknown)

    global gbDbgFlag
    gbDbgFlag = "-d" in dictArgs
    if gbDbgFlag:
        print_out_input_parameters(dictArgs)

    # Check to see if we were called from the Makefile system. If we were, check
    # if the caller wants SWIG to generate a dependency file.
    # Not used in this program, but passed through to the language script file
    # called by this program
    global gbMakeFileFlag
    gbMakeFileFlag = "-m" in dictArgs

    nResult, strMsg = run_post_process_for_each_script_supported(dictArgs)

    program_exit(nResult, strMsg)

#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------

# TAG_PROGRAM_HELP_INFO
""" Details: Program main entry point.

    --------------------------------------------------------------------------
    Args:   -h (optional)   Print help information on this program.
            -d (optional)   Determines whether or not this script
                            outputs additional information when running.
            -m (optional)   Specify called from Makefile system. If given locate
                            the LLDBWrapPython.cpp in --srcRoot/source folder
                            else in the --targetDir folder.
            --srcRoot=      The root of the lldb source tree.
            --targetDir=    Where the lldb framework/shared library gets put.
            --cfgBldDir=    Where the buildSwigPythonLLDB.py program will
            (optional)      put the lldb.py file it generated from running
                            SWIG.
            --prefix=       Is the root directory used to determine where
            (optional)      third-party modules for scripting languages should
                            be installed. Where non-Darwin systems want to put
                            the .py and .so files so that Python can find them
                            automatically. Python install directory.
            --cmakeBuildConfiguration=  (optional) Is the build configuration(Debug, Release, RelWithDebugInfo)\n\
                            used to determine where the bin and lib directories are \n\
                            created for a Windows build.\n\
            --lldbLibDir=   The name of the directory containing liblldb.so.
            (optional)      "lib" by default.
            --argsFile=     The args are read from a file instead of the
                            command line. Other command line args are ignored.
            --useSystemSix  Use system six.py version.
    Usage:
            finishSwigWrapperClasses.py --srcRoot=ADirPath --targetDir=ADirPath
            --cfgBldDir=ADirPath --prefix=ADirPath --lldbLibDir=ADirPath -m -d
            --useSystemSix

    Results:    0 Success
                -1 Error - invalid parameters passed.
                -2 Error - incorrect number of mandatory parameters passed.

                -4 Error - unable to determine OS type.
                -5 Error - program not run with name of "__main__".
                -8 Error - unable to locate the scripts folder.
                -9 Error - unable to locate the post process language script
                           file.

                -100+    - Error messages from the child language script file.

    --------------------------------------------------------------------------

"""

# Called using "__main__" when not imported i.e. from the command line
if __name__ == "__main__":
    utilsDebug.CDebugFnVerbose.bVerboseOn = gbDbgVerbose
    dbg = utilsDebug.CDebugFnVerbose("__main__")
    main(sys.argv[1:])
else:
    program_exit(-5, strMsgErrorNoMain)
