diff options
author | Chris Johns <chrisj@rtems.org> | 2014-09-13 12:09:16 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2014-09-13 12:09:16 +1000 |
commit | 87e0e76be5b17d1dd27274d58ac9b58cdf71c0ca (patch) | |
tree | 0d44623ad165fa69cd0946f2baab79339b3e6215 /rtemstoolkit/rld-cc.h | |
parent | 749ddf1ed53c3903823eed031649441a59edd264 (diff) |
Refactor code into the RTEMS Toolkit.
Diffstat (limited to 'rtemstoolkit/rld-cc.h')
-rw-r--r-- | rtemstoolkit/rld-cc.h | 215 |
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 |