# Copyright (C) 2011-2013 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""Configure GDB using the ELinOS environment."""

import os
import glob
import gdb


def warn(msg):
    print "warning: %s" % msg


def get_elinos_environment():
    """Return the ELinOS environment.

    If the ELinOS environment is properly set up, return a dictionary
    which contains:
      * The path to the ELinOS project at key 'project';
      * The path to the ELinOS CDK at key 'cdk';
      * The ELinOS target name at key 'target' (Eg. 'i486-linux');
      * A list of Xenomai install prefixes (which could be empty, if
        the ELinOS project does not include Xenomai) at key 'xenomai'.

    If one of these cannot be found, it is then assumed that the ELinOS
    environment is not properly set up. Return None in such a case,
    and print a warning.
    """
    result = {}
    for key in ("project", "cdk", "target"):
        var = "ELINOS_" + key.upper()
        if var in os.environ:
            result[key] = os.environ[var]
        else:
            warn("%s not set" % var)
            return None

    result["xenomai"] = glob.glob(result["project"] + "/xenomai-[0-9.]*")
    return result


def elinos_init():
    """Initialize debugger environment for ELinOS.

    Let the debugger know where to find the ELinOS libraries on host. This
    assumes that an ELinOS environment is properly set up. If not, abort
    with a warning.
    """
    elinos_env = get_elinos_environment()

    if elinos_env is None:
        warn("ELinOS system libraries will not be loaded")
    else:
        solib_prefix = "%s/%s" % (elinos_env["cdk"], elinos_env["target"])

        solib_dirs = []
        for dir in elinos_env['xenomai']:
            solib_dirs += ["%s/%s" % (dir, "xenomai-build/usr/realtime/lib")]
        solib_dirs += ["%s/%s" % (solib_prefix, "lib")]

        gdb.execute("set solib-absolute-prefix %s" % solib_prefix)
        gdb.execute("set solib-search-path %s" % ":".join(solib_dirs))


if __name__ == "__main__":
    elinos_init()
