summaryrefslogtreecommitdiff
path: root/rtemstoolkit/rld-cc.h
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-cc.h
parent749ddf1ed53c3903823eed031649441a59edd264 (diff)
Refactor code into the RTEMS Toolkit.
Diffstat (limited to 'rtemstoolkit/rld-cc.h')
-rw-r--r--rtemstoolkit/rld-cc.h215
1 files changed, 215 insertions, 0 deletions
diff --git a/rtemstoolkit/rld-cc.h b/rtemstoolkit/rld-cc.h
new file mode 100644
index 0000000..6c200d2
--- /dev/null
+++ b/rtemstoolkit/rld-cc.h
@@ -0,0 +1,215 @@
+/*
+ * 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.
+ */
+/**
+ * @file
+ *
+ * @ingroup rtems-ld
+ *
+ * @brief Various calls to CC.
+ *
+ */
+
+#if !defined (_RLD_CC_H_)
+#define _RLD_CC_H_
+
+#include <string>
+
+#include <rld-files.h>
+#include <rld-process.h>
+
+namespace rld
+{
+ namespace cc
+ {
+ /*
+ * The type of flags.
+ */
+ enum flag_type
+ {
+ ft_cppflags = 1 << 0,
+ ft_cflags = 1 << 1,
+ ft_cxxflags = 1 << 2,
+ ft_ldflags = 1 << 3
+ };
+
+ /*
+ * Flags groups.
+ */
+ enum flag_group
+ {
+ fg_warning_flags,
+ fg_include_flags,
+ fg_machine_flags,
+ fg_spec_flags
+ };
+
+ /**
+ * Strip the flags of -O and -g options.
+ *
+ * @param flags The flags a space delimited list to strip.
+ * @return const std::string The stripped flags.
+ */
+ const std::string strip_cflags (const std::string& flags);
+
+ /**
+ * Filter the flags. Provide the type of flags being passed, the flags as a
+ * space separated list, the architure, and a path. Provide strings
+ * containers for the different flag groups so they can be sorted and
+ * returned.
+ *
+ * @param flags The flags a space delimited list to strip.
+ * @param arch The architecure per the OS specific name.
+ * @param path A path to adjust based on the architecture.
+ * @param type The type of flags being passed.
+ * @param warnings Return warning flags in this string.
+ * @param includes Return include flags in this string.
+ * @param machines Return machine flags in this string.
+ * @param specs Return spec flags in this string.
+ * @return const std::string The filtered flags.
+ */
+ const std::string filter_flags (const std::string& flags,
+ const std::string& arch,
+ const std::string& path,
+ flag_type type,
+ std::string& warnings,
+ std::string& includes,
+ std::string& machines,
+ std::string& specs);
+
+ /**
+ * Filter the cflags and update the warnings, includes, machines and specs
+ * if the type of flags is cflags. Provide the cflags as a space separated
+ * list, the architure, and a path.
+ *
+ * @param flags The flags a space delimited list to strip.
+ * @param arch The architecure per the OS specific name.
+ * @param path A path to adjust based on the architecture.
+ * @param type The type of flags being passed.
+ * @return const std::string The filtered flags.
+ */
+ const std::string filter_flags (const std::string& flags,
+ const std::string& arch,
+ const std::string& path,
+ flag_type type);
+
+ /**
+ * Set CC. The exec-prefix is ignored if this is set.
+ */
+ void set_cc (const std::string& cc);
+
+ /**
+ * Get the CC.
+ */
+ const std::string get_cc ();
+
+ /**
+ * Is the CC set ?
+ */
+ bool is_cc_set ();
+
+ /**
+ * Set LD. The exec-prefix is ignored if this is set.
+ */
+ void set_ld (const std::string& ld);
+
+ /**
+ * Get the LD.
+ */
+ const std::string get_ld ();
+
+ /**
+ * Is the LD set ?
+ */
+ bool is_ld_set ();
+
+ /**
+ * Set the exec-prefix. If CC is set the exec-prefix is ignored.
+ */
+ void set_exec_prefix (const std::string& exec_prefix);
+
+ /**
+ * Get the exec-prefix.
+ */
+ const std::string get_exec_prefix ();
+
+ /**
+ * Is exec-prefix set ?
+ */
+ bool is_exec_prefix_set ();
+
+ /**
+ * Set the flags with a specific arch and include path.
+ */
+ void set_flags (const std::string& flags,
+ const std::string& arch,
+ const std::string& path,
+ flag_type type);
+
+ /**
+ * Set the flags.
+ */
+ void set_flags (const std::string& flags, flag_type type);
+
+ /**
+ * Append the flags with a specific arch and include path.
+ */
+ void append_flags (const std::string& flags,
+ const std::string& arch,
+ const std::string& path,
+ flag_type type);
+
+ /**
+ * Append the flags.
+ */
+ void append_flags (const std::string& flags, flag_type type);
+
+ /**
+ * Get the flags.
+ */
+ const std::string get_flags (flag_type type);
+ const std::string get_flags (flag_group group);
+
+ /**
+ * Append the flags if set.
+ */
+ void append_flags (flag_type type, rld::process::arg_container& args);
+
+ /**
+ * Make a CC command from the set arguments.
+ */
+ void make_cc_command (rld::process::arg_container& args);
+
+ /**
+ * Make a LD command from the set arguments.
+ */
+ void make_ld_command (rld::process::arg_container& args);
+
+ /**
+ * Get the standard libraries paths from the compiler.
+ */
+ void get_standard_libpaths (rld::path::paths& libpaths);
+
+ /**
+ * Get the standard libraries. Optionally add the C++ library.
+ */
+ void get_standard_libs (rld::path::paths& libs,
+ rld::path::paths& libpaths,
+ bool cpp = false);
+
+ }
+}
+
+#endif