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 |