Rev 4 | Rev 7 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4 | Rev 5 | ||
|---|---|---|---|
| Line 132... | Line 132... | ||
| 132 | arraysize_var++; \ |
132 | arraysize_var++; \ |
| 133 | } while (0) |
133 | } while (0) |
| 134 | #define ADD_LINKER_ARG(val) ADD_CHAR_ARRAY (linker_argv, linker_argc, (val)) |
134 | #define ADD_LINKER_ARG(val) ADD_CHAR_ARRAY (linker_argv, linker_argc, (val)) |
| 135 | #define ADD_L_ARG(val) ADD_CHAR_ARRAY (largs, larg_count, (val)) |
135 | #define ADD_L_ARG(val) ADD_CHAR_ARRAY (largs, larg_count, (val)) |
| 136 | #define ADD_O_ARG(val) ADD_CHAR_ARRAY (oargs, oarg_count, (val)) |
136 | #define ADD_O_ARG(val) ADD_CHAR_ARRAY (oargs, oarg_count, (val)) |
| - | 137 | #define ADD_S_ARG(val) ADD_CHAR_ARRAY (sargs, sarg_count, (val)) |
|
| 137 | #define ARGV_CONTAINS_SINGLEARG(val) ((arg = array_contains (argc, argv, (val), ARGMODE_SINGLE)) != NULL) |
138 | #define ARGV_CONTAINS_SINGLEARG(val) ((arg = array_contains (argc, argv, (val), ARGMODE_SINGLE)) != NULL) |
| 138 | #define ARGV_CONTAINS_ARGWITHVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_HASVAL)) != NULL) |
139 | #define ARGV_CONTAINS_ARGWITHVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_HASVAL)) != NULL) |
| 139 | #define ARGV_CONTAINS_ARGWITHEQUALVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_EQUALVAL)) != NULL) |
140 | #define ARGV_CONTAINS_ARGWITHEQUALVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_EQUALVAL)) != NULL) |
| 140 | #define ARGV_SINGLEARG(val) array_contains (argc, argv, (val), ARGMODE_SINGLE) |
141 | #define ARGV_SINGLEARG(val) array_contains (argc, argv, (val), ARGMODE_SINGLE) |
| 141 | #define ARGV_ARGWITHVAL(val) array_contains (argc, argv, (val), ARGMODE_HASVAL) |
142 | #define ARGV_ARGWITHVAL(val) array_contains (argc, argv, (val), ARGMODE_HASVAL) |
| Line 144... | Line 145... | ||
| 144 | static char filebuf[1024 * 1024]; |
145 | static char filebuf[1024 * 1024]; |
| 145 | char **linker_argv = NULL; |
146 | char **linker_argv = NULL; |
| 146 | size_t linker_argc = 0; |
147 | size_t linker_argc = 0; |
| 147 | char **largs = NULL; // array of "-lxxx" arguments |
148 | char **largs = NULL; // array of "-lxxx" arguments |
| 148 | size_t larg_count = 0; |
149 | size_t larg_count = 0; |
| - | 150 | char **sargs = NULL; // array of source files arguments |
|
| - | 151 | size_t sarg_count = 0; |
|
| 149 | char **oargs = NULL; // array of object files arguments |
152 | char **oargs = NULL; // array of object files arguments |
| 150 | size_t oarg_count = 0; |
153 | size_t oarg_count = 0; |
| 151 | size_t read_count; |
154 | size_t read_count; |
| 152 | size_t byte_index; |
155 | size_t byte_index; |
| 153 | bool was_cpluspluslib_included = false; |
156 | bool was_cpluspluslib_included = false; |
| 154 | bool requires_libcplusplus = false; |
157 | bool requires_libcplusplus = false; |
| 155 | int arg_index; |
158 | int arg_index; |
| 156 | char *arg; |
159 | char *arg; |
| 157 | FILE *fp; |
160 | FILE *fp; |
| 158 | 161 | ||
| - | 162 | // if *any* of these flags are present, it means we don't want to link anything, so direct everything to the compiler |
|
| 159 | if ( ARGV_CONTAINS_SINGLEARG ("-fsyntax-only") |
163 | if ( ARGV_CONTAINS_SINGLEARG ("-fsyntax-only") |
| 160 | || ARGV_CONTAINS_SINGLEARG ("-c") |
164 | || ARGV_CONTAINS_SINGLEARG ("-c") |
| 161 | || ARGV_CONTAINS_SINGLEARG ("-M") |
165 | || ARGV_CONTAINS_SINGLEARG ("-M") |
| 162 | || ARGV_CONTAINS_SINGLEARG ("-MM") |
166 | || ARGV_CONTAINS_SINGLEARG ("-MM") |
| 163 | || ARGV_CONTAINS_SINGLEARG ("-E") |
167 | || ARGV_CONTAINS_SINGLEARG ("-E") |
| Line 165... | Line 169... | ||
| 165 | { |
169 | { |
| 166 | argv[0] = "clang"; |
170 | argv[0] = "clang"; |
| 167 | execvpe ("clang", argv, envp); |
171 | execvpe ("clang", argv, envp); |
| 168 | } |
172 | } |
| 169 | 173 | ||
| 170 | // collect |
174 | // collect source files |
| 171 | for (arg_index = 1; arg_index < argc; arg_index++) |
175 | for (arg_index = 1; arg_index < argc; arg_index++) |
| 172 | if ((strcmp (argv[arg_index - 1], "-o") != 0) // arg |
176 | if ((strcmp (argv[arg_index - 1], "-o") != 0) // this arg is NOT preceded by "-o"... |
| 173 | && (access (argv[arg_index], 0) == 0) |
177 | && (access (argv[arg_index], 0) == 0) // ... this arg is an existing file... |
| 174 | && ((arg = strrchr (argv[arg_index], '.')) != NULL) |
178 | && ((arg = strrchr (argv[arg_index], '.')) != NULL)) // this filename has an extension (FIXME: what if "-x <language>" is specified?) |
| - | 179 | { |
|
| 175 |
|
180 | if ( (strcasecmp (arg, ".s") == 0) |
| 176 |
|
181 | || (strcasecmp (arg, ".c") == 0) |
| 177 |
|
182 | || (strcasecmp (arg, ".cc") == 0) |
| 178 |
|
183 | || (strcasecmp (arg, ".c++") == 0) |
| 179 |
|
184 | || (strcasecmp (arg, ".cpp") == 0) |
| 180 |
|
185 | || (strcasecmp (arg, ".cxx") == 0) |
| 181 |
|
186 | || (strcasecmp (arg, ".m") == 0) |
| 182 |
|
187 | || (strcasecmp (arg, ".mm") == 0) |
| 183 |
|
188 | || (strcasecmp (arg, ".mxx") == 0)) |
| - | 189 | ADD_S_ARG (argv[arg_index]); // this file is one of the known source file extensions: add to source files list |
|
| 184 |
|
190 | else |
| 185 | ADD_O_ARG (argv[arg_index]); |
191 | ADD_O_ARG (argv[arg_index]); // this file is NOT one of the known file extensions: add to object files list |
| - | 192 | } |
|
| 186 | 193 | ||
| - | 194 | // if we have zero .o file, OR if we have some source files, we have to compile first |
|
| 187 | if (oarg_count == 0) |
195 | if ((sarg_count > 0) || (oarg_count == 0)) |
| 188 | { |
196 | { |
| 189 | argv[0] = "clang"; |
197 | argv[0] = "clang"; |
| 190 | execvpe ("clang", argv, envp); |
198 | execvpe ("clang", argv, envp); |
| 191 | } |
199 | } |
| 192 | 200 | ||