| # Copyright (C) 2011-2022 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, print a warning; the corresponding | 
 |     value in the returned dictionary will be None. | 
 |     """ | 
 |     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) | 
 |             result[key] = None | 
 |  | 
 |     if result["project"] is not None: | 
 |         result["xenomai"] = glob.glob(result["project"] + "/xenomai-[0-9.]*") | 
 |     else: | 
 |         result["xenomai"] = [] | 
 |  | 
 |     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 some environment | 
 |     variables are missing, warn about which library may be missing. | 
 |     """ | 
 |     elinos_env = get_elinos_environment() | 
 |  | 
 |     solib_dirs = [] | 
 |  | 
 |     # System libraries | 
 |     if None in (elinos_env[key] for key in ("cdk", "target")): | 
 |         warn("ELinOS system libraries will not be loaded") | 
 |     else: | 
 |         solib_prefix = "%s/%s" % (elinos_env["cdk"], elinos_env["target"]) | 
 |         solib_dirs += ["%s/%s" % (solib_prefix, "lib")] | 
 |         gdb.execute("set solib-absolute-prefix %s" % solib_prefix) | 
 |  | 
 |     # Xenomai libraries. Those are optional, so have a lighter warning | 
 |     # if they cannot be located. | 
 |     if elinos_env["project"] is None: | 
 |         warn("Xenomai libraries may not be loaded") | 
 |     else: | 
 |         for dir in elinos_env["xenomai"]: | 
 |             solib_dirs += ["%s/%s" % (dir, "xenomai-build/usr/realtime/lib")] | 
 |  | 
 |     if len(solib_dirs) != 0: | 
 |         gdb.execute("set solib-search-path %s" % ":".join(solib_dirs)) | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |     elinos_init() |