summaryrefslogtreecommitdiff
path: root/rld-cc.h
blob: f5365c45aee5e53eb489f640124d06ddcfe21de2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * 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
  {
    /*
     * Defintion of flags to be filtered.
     */
    enum flag_type
    {
      ft_cppflags = 1 << 0,
      ft_cflags   = 1 << 1,
      ft_cxxflags = 1 << 2,
      ft_ldflags  = 1 << 3
    };

    extern std::string cc;             //< The CC executable as absolute path.
    extern std::string cc_name;        //< The CC name, ie gcc, clang.
    extern std::string exec_prefix;    //< The CC executable prefix.

    extern std::string cppflags;       //< The CPP flags.
    extern std::string cflags;         //< The CC flags.
    extern std::string cxxflags;       //< The CXX flags.
    extern std::string ldflags;        //< The LD flags.

    extern std::string warning_cflags; //< The warning flags in cflags.
    extern std::string include_cflags; //< The include flags in cflags.
    extern std::string machine_cflags; //< The machine flags in cflags.
    extern std::string spec_cflags;    //< The spec flags in cflags.

    extern std::string install_path;   //< The CC reported install path.
    extern std::string programs_path;  //< The CC reported programs path.
    extern std::string libraries_path; //< The CC reported libraries path.

    /**
     * Make a CC command from the set arguments.
     */
    void make_cc_command (rld::process::arg_container& args);

    /**
     * If the cppflags has been set append to the arguments.
     */
    void add_cppflags (rld::process::arg_container& args);

    /**
     * If the cflags has been set append to the arguments.
     */
    void add_cflags (rld::process::arg_container& args);

    /**
     * If the cxxflags has been set append to the arguments.
     */
    void add_cxxflags (rld::process::arg_container& args);

    /**
     * If the ldflags has been set append to the arguments.
     */
    void add_ldflags (rld::process::arg_container& args);

    /**
     * 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);

    /**
     * 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