summaryrefslogtreecommitdiff
path: root/rtemstoolkit/rld-rtems.cpp
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-09-13 12:09:16 +1000
committerChris Johns <chrisj@rtems.org>2014-09-13 12:09:16 +1000
commit87e0e76be5b17d1dd27274d58ac9b58cdf71c0ca (patch)
tree0d44623ad165fa69cd0946f2baab79339b3e6215 /rtemstoolkit/rld-rtems.cpp
parent749ddf1ed53c3903823eed031649441a59edd264 (diff)
Refactor code into the RTEMS Toolkit.
Diffstat (limited to 'rtemstoolkit/rld-rtems.cpp')
-rw-r--r--rtemstoolkit/rld-rtems.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/rtemstoolkit/rld-rtems.cpp b/rtemstoolkit/rld-rtems.cpp
new file mode 100644
index 0000000..d85f845
--- /dev/null
+++ b/rtemstoolkit/rld-rtems.cpp
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2011-2014, Chris Johns <chrisj@rtems.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <rld.h>
+#include <rld-cc.h>
+#include <rld-rtems.h>
+
+#include <pkgconfig.h>
+
+namespace rld
+{
+ namespace rtems
+ {
+ static std::string _version = "4.11";
+ static std::string _path;
+ static std::string _arch_bsp;
+
+ static void
+ load_cc ()
+ {
+ path::paths parts;
+ std::string rtems_pkgconfig;
+ std::string bsp;
+
+ if (_path.empty ())
+ throw rld::error ("Not set", "RTEMS path");
+
+ bsp = rtems_arch_bsp ();
+
+ parts.push_back ("lib");
+ parts.push_back ("pkgconfig");
+
+ rld::path::path_join (path (), parts, rtems_pkgconfig);
+
+ if (!path::check_directory (rtems_pkgconfig))
+ throw rld::error ("Invalid RTEMS path", path ());
+
+ rld::path::path_join (rtems_pkgconfig, bsp + ".pc", rtems_pkgconfig);
+
+ if (!path::check_file (rtems_pkgconfig))
+ throw rld::error ("RTEMS BSP not found", arch_bsp ());
+
+ if (rld::verbose () >= RLD_VERBOSE_INFO)
+ std::cout << " rtems: " << _arch_bsp << ": "
+ << rtems_pkgconfig << std::endl;
+
+ pkgconfig::package pkg (rtems_pkgconfig);
+
+ /*
+ * Check the pc file matches what we ask for.
+ */
+ std::string name;
+ if (!pkg.get ("name", name))
+ throw rld::error ("RTEMS BSP no name in pkgconfig file", _arch_bsp);
+
+ if (name != bsp)
+ throw rld::error ("RTEMS BSP does not match the name in pkgconfig file",
+ _arch_bsp);
+
+ std::string flags;
+
+ if (pkg.get ("CPPFLAGS", flags))
+ {
+ rld::cc::append_flags (flags, arch (), path (), rld::cc::ft_cppflags);
+ if (rld::verbose () >= RLD_VERBOSE_INFO)
+ std::cout << " rtems: " << arch_bsp ()
+ << ": CPPFLAGS="
+ << rld::cc::get_flags (rld::cc::ft_cppflags)
+ << std::endl;
+ }
+
+ if (pkg.get ("CFLAGS", flags))
+ {
+ rld::cc::append_flags (flags, arch (), path (), rld::cc::ft_cflags);
+ if (rld::verbose () >= RLD_VERBOSE_INFO)
+ {
+ std::cout << " rtems: " << arch_bsp ()
+ << ": CFLAGS=" << rld::cc::get_flags (rld::cc::ft_cflags)
+ << std::endl;
+ std::cout << " rtems: " << _arch_bsp
+ << ": WARNINGS=" << rld::cc::get_flags (rld::cc::fg_warning_flags)
+ << std::endl;
+ std::cout << " rtems: " << arch_bsp ()
+ << ": INCLUDES=" << rld::cc::get_flags (rld::cc::fg_include_flags)
+ << std::endl;
+ std::cout << " rtems: " << arch_bsp ()
+ << ": MACHINES=" << rld::cc::get_flags (rld::cc::fg_machine_flags)
+ << std::endl;
+ std::cout << " rtems: " << arch_bsp ()
+ << ": SPECS=" << rld::cc::get_flags (rld::cc::fg_spec_flags)
+ << std::endl;
+ }
+ }
+
+ if (pkg.get ("CXXFLAGS", flags))
+ {
+ rld::cc::append_flags (flags, arch (), path (), rld::cc::ft_cxxflags);
+ if (rld::verbose () >= RLD_VERBOSE_INFO)
+ std::cout << " rtems: " << arch_bsp ()
+ << ": CXXFLAGS=" << rld::cc::get_flags (rld::cc::ft_cxxflags)
+ << std::endl;
+ }
+
+ if (pkg.get ("LDFLAGS", flags))
+ {
+ rld::cc::append_flags (flags, arch (), path (), rld::cc::ft_ldflags);
+ if (rld::verbose () >= RLD_VERBOSE_INFO)
+ std::cout << " rtems: " << arch_bsp ()
+ << ": LDFLAGS=" << rld::cc::get_flags (rld::cc::ft_ldflags)
+ << std::endl;
+ }
+
+ rld::cc::set_exec_prefix (arch ());
+ }
+
+ void
+ set_version (const std::string& version_)
+ {
+ _version = version_;
+ }
+
+ void
+ set_arch_bsp (const std::string& arch_bsp_)
+ {
+ _arch_bsp = arch_bsp_;
+ if (!_path.empty ())
+ load_cc ();
+ }
+
+ void
+ set_path (const std::string& path_)
+ {
+ _path = path_;
+ if (!_arch_bsp.empty ())
+ load_cc ();
+ }
+
+ const std::string
+ version ()
+ {
+ return _version;
+ }
+
+ const std::string
+ arch_bsp ()
+ {
+ return _arch_bsp;
+ }
+
+ const std::string
+ arch ()
+ {
+ if (_arch_bsp.empty ())
+ throw rld::error ("No arch/bsp name", "rtems: arch");
+ std::string::size_type slash = _arch_bsp.find_first_of ('/');
+ if (slash == std::string::npos)
+ throw rld::error ("Invalid BSP name", _arch_bsp);
+ return _arch_bsp.substr (0, slash);
+ std::string bsp = _arch_bsp.substr (slash + 1);
+ }
+
+ const std::string
+ bsp ()
+ {
+ if (_arch_bsp.empty ())
+ throw rld::error ("No arch/bsp name", "rtems: bsp");
+ std::string::size_type slash = _arch_bsp.find_first_of ('/');
+ if (slash == std::string::npos)
+ throw rld::error ("Invalid BSP name", _arch_bsp);
+ return _arch_bsp.substr (slash + 1);
+ }
+
+ const std::string
+ path ()
+ {
+ return _path;
+ }
+
+ const std::string
+ rtems_arch_prefix ()
+ {
+ return arch () + "-rtems" + version ();
+ }
+
+ const std::string
+ rtems_arch_bsp ()
+ {
+ return rtems_arch_prefix () + '-' + bsp ();
+ }
+
+ }
+}