]> git.pld-linux.org Git - packages/uClibc.git/blob - uClibc-toolchain-wrapper.patch
- updated for 0.9.30
[packages/uClibc.git] / uClibc-toolchain-wrapper.patch
1 diff -urN uClibc-0.9.29.org/extra/gcc-uClibc/gcc-uClibc.c uClibc-0.9.29/extra/gcc-uClibc/gcc-uClibc.c
2 --- uClibc-0.9.29.org/extra/gcc-uClibc/gcc-uClibc.c     1970-01-01 01:00:00.000000000 +0100
3 +++ uClibc-0.9.29/extra/gcc-uClibc/gcc-uClibc.c 2007-06-03 22:10:49.372320596 +0200
4 @@ -0,0 +1,668 @@
5 +/* vi: set sw=4 ts=4: */
6 +/*
7 + * Copyright (C) 2000 Manuel Novoa III
8 + * Copyright (C) 2002-2003 Erik Andersen
9 + *
10 + * This is a crude wrapper to use uClibc with gcc.
11 + * It was originally written to work around ./configure for ext2fs-utils.
12 + * It certainly can be improved, but it works for me in the normal cases.
13 + *
14 + * April 7, 2001
15 + *
16 + * A bug was fixed in building the gcc command line when dynamic linking.
17 + * The functions dlopen, etc. now work.  At this time, you must make sure
18 + * the correct libdl.so is included however.  It is safest to, for example,
19 + * add /lib/libdl.so.1 if using ld-linux.so.1 rather than adding -ldl to the
20 + * command line.
21 + *
22 + * Note: This is only a problem if devel and target archs are the same.  To
23 + * avoid the problem, you can use a customized dynamic linker.
24 + *
25 + *
26 + * April 18, 2001
27 + *
28 + * The wrapper now works with either installed and uninstalled uClibc versions.
29 + * If you want to use the uninstalled header files and libs, either include
30 + * the string "build" in the invocation name such as
31 + *       'ln -s <ARCH>-uclibc-gcc <ARCH>-uclibc-gcc-build'
32 + * or include it in the environment variable setting of UCLIBC_ENV.
33 + * Note: This automatically enables the "rpath" behavior described below.
34 + *
35 + * The wrapper will now pass the location of the uClibc shared libs used to
36 + * the linker with the "-rpath" option if the invocation name includes the
37 + * string "rpath" or if the environment variable UCLIBC_ENV include it (as
38 + * with "build" above).  This is primarily intended to be used on devel
39 + * platforms of the same arch as the target.  A good place to use this feature
40 + * would be in the uClibc/test directory.
41 + *
42 + * The wrapper now displays the command line passed to gcc when '-v' is used.
43 + *
44 + * May 31, 2001
45 + *
46 + * "rpath" and "build" behavior are now decoupled.  You can of course get
47 + * the old "build" behavior by setting UCLIBC_ENV="rpath-build".  Order
48 + * isn't important here, as only the substrings are searched for.
49 + *
50 + * Added environment variable check for UCLIBC_GCC_DLOPT to let user specify
51 + * an alternative dynamic linker at runtime without using command line args.
52 + * Since this wouldn't commonly be used, I made it easy on myself.  You have
53 + * to match the option you would have passed to the gcc wrapper.  As an
54 + * example,
55 + *
56 + *   export UCLIBC_GCC_DLOPT="-Wl,--dynamic-linker,/lib/ld-alt-linker.so.3"
57 + *
58 + * This is really only useful if target arch == devel arch and DEVEL_PREFIX
59 + * isn't empty.  It involves a recompile, but you can at least test apps
60 + * on your devel system if combined with the "rpath" behavor if by using
61 + * LD_LIBRARY_PATH, etc.
62 + *
63 + * Also added check for "-Wl,--dynamic-linker" on the command line.  The
64 + * use default dynamic linker or the envirnment-specified dynamic linker
65 + * is disabled in that case.
66 + *
67 + * Added options --uclibc-use-build-dir and --uclibc-use-rpath so that those
68 + * behaviors can be invoked from the command line.
69 + *
70 + */
71 +
72 +/*
73 + *
74 + * TODO:
75 + * Check/modify gcc-specific environment variables?
76 + */
77 +
78 +#include <stdio.h>
79 +#include <stdlib.h>
80 +#include <stdarg.h>
81 +#include <string.h>
82 +#include <unistd.h>
83 +#include <errno.h>
84 +#include <sys/stat.h>
85 +#include <sys/wait.h>
86 +
87 +#include "gcc-uClibc.h"
88 +
89 +static char *our_usr_lib_path = "-L"UCLIBC_DEVEL_PREFIX"/lib";
90 +
91 +static char static_linking[] = "-static";
92 +static char nostdinc[] = "-nostdinc";
93 +static char nostartfiles[] = "-nostartfiles";
94 +static char nodefaultlibs[] = "-nodefaultlibs";
95 +static char nostdlib[] = "-nostdlib";
96 +#ifdef __UCLIBC_CTOR_DTOR__
97 +static char nostdinc_plus[] = "-nostdinc++";
98 +#endif
99 +
100 +/* Include a local implementation of basename, since this
101 + * uses the host system's C lib, and CYGWIN apparently
102 + * doesn't provide an implementation of basename(). */
103 +char *basename(const char *path)
104 +{
105 +       register const char *s;
106 +       register const char *p;
107 +       p = s = path;
108 +       while (*s) {
109 +               if (*s++ == '/') {
110 +                       p = s;
111 +               }
112 +       }
113 +       return (char *) p;
114 +}
115 +
116 +char *dirname(char *path)
117 +{
118 +       static const char null_or_empty_or_noslash[] = ".";
119 +       register char *s;
120 +       register char *last;
121 +       char *first;
122 +
123 +       last = s = path;
124 +
125 +       if (s != NULL) {
126 +
127 +LOOP:
128 +               while (*s && (*s != '/')) ++s;
129 +               first = s;
130 +               while (*s == '/') ++s;
131 +               if (*s) {
132 +                       last = first;
133 +                       goto LOOP;
134 +               }
135 +
136 +               if (last == path) {
137 +                       if (*last != '/') {
138 +                               goto DOT;
139 +                       }
140 +                       if ((*++last == '/') && (last[1] == 0)) {
141 +                               ++last;
142 +                       }
143 +               }
144 +               *last = 0;
145 +               return path;
146 +       }
147 +DOT:
148 +       return (char *) null_or_empty_or_noslash;
149 +}
150 +
151 +
152 +extern void *xmalloc(size_t size)
153 +{
154 +       void *ptr = malloc(size);
155 +
156 +       if (!ptr) {
157 +               fprintf(stderr, "memory exhausted");
158 +               exit(EXIT_FAILURE);
159 +       }
160 +       return ptr;
161 +}
162 +
163 +void xstrcat(char **string, ...)
164 +{
165 +       const char *c;
166 +       va_list p; 
167 +       /* Don't bother to calculate how big exerything 
168 +        * will be, just be careful to not overflow...  */
169 +       va_start(p, string);
170 +       *string = xmalloc(BUFSIZ);
171 +       **string = '\0';
172 +       while(1) {
173 +               if (!(c = va_arg(p, const char *)))
174 +                       break;
175 +               strcat(*string, c); 
176 +       }
177 +       va_end(p);
178 +}
179 +
180 +int main(int argc, char **argv)
181 +{
182 +       int use_build_dir = 0, linking = 1, use_static_linking = 0;
183 +       int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_pic = 0;
184 +       int source_count = 0, use_rpath = 0, verbose = 0;
185 +       int i, j, k, l, m, n;
186 +       char ** gcc_argv;
187 +       char ** gcc_argument;
188 +       char ** libraries;
189 +       char ** libpath;
190 +       char *dlstr;
191 +       char *incstr;
192 +       char *devprefix;
193 +   char *runprefix;
194 +       char *builddir;
195 +       char *libstr;
196 +       char *build_dlstr = 0;
197 +       char *cc;
198 +       char *ep;
199 +       char *rpath_link[2];
200 +       char *rpath[2];
201 +       char *uClibc_inc[2];
202 +       char *our_lib_path[2];
203 +       char *crt0_path[2];
204 +       char *crtbegin_path[2];
205 +       char *crtend_path[2];
206 +       const char *application_name;
207 +#ifdef __UCLIBC_CTOR_DTOR__
208 +       char *crti_path[2];
209 +       char *crtn_path[2];
210 +       int len;
211 +       int ctor_dtor = 1, cplusplus = 0, use_nostdinc_plus = 0;
212 +       int findlibgcc = 1;
213 +       char *cpp = NULL;
214 +#endif
215 +#ifdef __UCLIBC_PROFILING__
216 +       int profile = 0;
217 +       char *gcrt1_path[2];
218 +#endif
219 +
220 +       cc     = getenv("UCLIBC_CC");
221 +       if (cc==NULL) {
222 +               cc = GCC_BIN;
223 +#ifdef __UCLIBC_CTOR_DTOR__
224 +               findlibgcc = 0;
225 +#endif
226 +       }
227 +
228 +       application_name = basename(argv[0]);
229 +       if (application_name[0] == '-')
230 +               application_name++;
231 +
232 +#ifdef __UCLIBC_CTOR_DTOR__
233 +       /* We must use strstr since g++ might be named like a
234 +        * cross compiler (i.e. arm-linux-g++).   We must also
235 +        * search carefully, in case we are searching something 
236 +        * like /opt/c++/gcc-3.1/bin/arm-linux-g++ or some similar 
237 +        * perversion...  */
238 +       len = strlen(application_name);
239 +       if ((strcmp(application_name+len-3, "g++")==0) ||
240 +                       (strcmp(application_name+len-3, "c++")==0)) {
241 +               len = strlen(cc);
242 +               if (strcmp(cc+len-3, "gcc")==0) {
243 +                       cpp = strdup(cc);
244 +                       cpp[len-1]='+';
245 +                       cpp[len-2]='+';
246 +               }
247 +               cplusplus = 1;
248 +               use_nostdinc_plus = 1;
249 +       }
250 +#endif
251 +
252 +       devprefix = getenv("UCLIBC_DEVEL_PREFIX");
253 +       if (!devprefix) {
254 +               devprefix = UCLIBC_DEVEL_PREFIX;
255 +       }
256 +
257 +       runprefix = getenv("UCLIBC_RUNTIME_PREFIX");
258 +       if (!runprefix) {
259 +               runprefix = UCLIBC_RUNTIME_PREFIX;
260 +       }
261 +
262 +       builddir = getenv("UCLIBC_BUILD_DIR");
263 +       if (!builddir) {
264 +               builddir = UCLIBC_BUILD_DIR;
265 +       }
266 +
267 +       incstr = getenv("UCLIBC_GCC_INC");
268 +       libstr = getenv("UCLIBC_GCC_LIB");
269 +
270 +       ep     = getenv("UCLIBC_ENV");
271 +       if (!ep) {
272 +               ep = "";
273 +       }
274 +
275 +       if (strstr(ep,"build") != 0) {
276 +               use_build_dir = 1;
277 +       }
278 +
279 +       if (strstr(ep,"rpath") != 0) {
280 +               use_rpath = 1;
281 +       }
282 +
283 +
284 +       xstrcat(&(rpath_link[0]), "-Wl,-rpath-link,", devprefix, "/lib:", runprefix, "/lib", NULL);
285 +       xstrcat(&(rpath_link[1]), "-Wl,-rpath-link,", builddir, "/lib", NULL);
286 +
287 +       xstrcat(&(rpath[0]), "-Wl,-rpath,", devprefix, "/lib:", runprefix, "/lib", NULL);
288 +       xstrcat(&(rpath[1]), "-Wl,-rpath,", builddir, "/lib", NULL);
289 +
290 +       xstrcat(&(uClibc_inc[0]), devprefix, "/include/", NULL);
291 +       xstrcat(&(uClibc_inc[1]), builddir, "/include/", NULL);
292 +
293 +#ifdef __UCLIBC_CTOR_DTOR__
294 +       xstrcat(&(crt0_path[0]), devprefix, "/lib/crt1.o", NULL);
295 +       xstrcat(&(crt0_path[1]), builddir, "/lib/crt1.o", NULL);
296 +       xstrcat(&(crti_path[0]), devprefix, "/lib/crti.o", NULL);
297 +       xstrcat(&(crti_path[1]), builddir, "/lib/crti.o", NULL);
298 +       xstrcat(&(crtn_path[0]), devprefix, "/lib/crtn.o", NULL);
299 +       xstrcat(&(crtn_path[1]), builddir, "/lib/crtn.o", NULL);
300 +#else
301 +       xstrcat(&(crt0_path[0]), devprefix, "/lib/crt0.o", NULL);
302 +       xstrcat(&(crt0_path[1]), builddir, "/lib/crt0.o", NULL);
303 +#endif
304 +#ifdef __UCLIBC_PROFILING__
305 +       xstrcat(&(gcrt1_path[0]), devprefix, "/lib/gcrt1.o", NULL);
306 +       xstrcat(&(gcrt1_path[1]), builddir, "/lib/gcrt1.o", NULL);
307 +#endif
308 +
309 +       xstrcat(&(our_lib_path[0]), "-L", devprefix, "/lib", NULL);
310 +       xstrcat(&(our_lib_path[1]), "-L", builddir, "/lib", NULL);
311 +
312 +#ifdef __UCLIBC_HAS_SHARED__
313 +       build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER;
314 +       dlstr = getenv("UCLIBC_GCC_DLOPT");
315 +       if (!dlstr) {
316 +               dlstr = "-Wl,--dynamic-linker," DYNAMIC_LINKER;
317 +       }
318 +#endif
319 +
320 +       m = 0;
321 +       libraries = __builtin_alloca(sizeof(char*) * (argc));
322 +       libraries[m] = '\0';
323 +
324 +       n = 0;
325 +       libpath = __builtin_alloca(sizeof(char*) * (argc));
326 +       libpath[n] = '\0';
327 +
328 +       for ( i = 1 ; i < argc ; i++ ) {
329 +               if (argv[i][0] == '-') { /* option */
330 +                       switch (argv[i][1]) {
331 +                               case 'c':               /* compile or assemble */
332 +                               case 'S':               /* generate assembler code */
333 +                               case 'E':               /* preprocess only */
334 +                               case 'M':           /* generate dependencies */
335 +                                       linking = 0;
336 +                                       break;
337 +                               case 'L':               /* library */
338 +                                       libpath[n++] = argv[i];
339 +                                       libpath[n] = '\0';
340 +                                       if (argv[i][2] == 0) {
341 +                                               argv[i] = '\0';
342 +                                               libpath[n++] = argv[++i];
343 +                                               libpath[n] = '\0';
344 +                                       }
345 +                                       argv[i] = '\0';
346 +                                       break;
347 +                               case 'l':               /* library */
348 +                                       libraries[m++] = argv[i];
349 +                                       libraries[m] = '\0';
350 +                                       argv[i] = '\0';
351 +                                       break;
352 +                               case 'v':               /* verbose */
353 +                                       if (argv[i][2] == 0) verbose = 1;
354 +                                       printf("Invoked as %s\n", argv[0]);
355 +                                       break;
356 +                               case 'n':
357 +                                       if (strcmp(nostdinc,argv[i]) == 0) {
358 +                                               use_stdinc = 0;
359 +                                       } else if (strcmp(nostartfiles,argv[i]) == 0) {
360 +#ifdef __UCLIBC_CTOR_DTOR__
361 +                                               ctor_dtor = 0;
362 +#endif
363 +                                               use_start = 0;
364 +                                       } else if (strcmp(nodefaultlibs,argv[i]) == 0) {
365 +                                               use_stdlib = 0;
366 +                                               argv[i] = '\0';
367 +                                       } else if (strcmp(nostdlib,argv[i]) == 0) {
368 +#ifdef __UCLIBC_CTOR_DTOR__
369 +                                               ctor_dtor = 0;
370 +#endif
371 +                                               use_start = 0;
372 +                                               use_stdlib = 0;
373 +                                       } 
374 +#ifdef __UCLIBC_CTOR_DTOR__
375 +                                       else if (strcmp(nostdinc_plus,argv[i]) == 0) {
376 +                                               if (cplusplus==1) {
377 +                                                       use_nostdinc_plus = 0;
378 +                                               }
379 +                                       }
380 +#endif
381 +                                       break;
382 +                               case 's':
383 +                                       if (strstr(argv[i],static_linking) != NULL) {
384 +                                               use_static_linking = 1;
385 +                                       }
386 +                                       if (strcmp("-shared",argv[i]) == 0) {
387 +                                               use_start = 0;
388 +                                               use_pic = 1;
389 +                                       }
390 +                                       break;
391 +                               case 'W':               /* -static could be passed directly to ld */
392 +                                       if (strncmp("-Wl,",argv[i],4) == 0) {
393 +                                               if (strstr(argv[i],static_linking) != 0) {
394 +                                                       use_static_linking = 1;
395 +                                               }
396 +                                               if (strstr(argv[i],"--dynamic-linker") != 0) {
397 +                                                       dlstr = 0;
398 +                                               }
399 +                                       }
400 +                                       break;
401 +#ifdef __UCLIBC_PROFILING__
402 +                               case 'p':
403 +                                       if (strcmp("-pg",argv[i]) == 0) {
404 +                                               profile = 1;
405 +                                       }
406 +                                       break;
407 +#endif
408 +                               case 'f':
409 +                                       /* Check if we are doing PIC */
410 +                                       if (strcmp("-fPIC",argv[i]) == 0) {
411 +                                               use_pic = 1;
412 +                                       } else if (strcmp("-fpic",argv[i]) == 0) {
413 +                                               use_pic = 1;
414 +                                       } 
415 +#ifdef __UCLIBC_PROFILING__
416 +                                       else if (strcmp("-fprofile-arcs",argv[i]) == 0) {
417 +                                               profile = 1;
418 +                                       }
419 +#endif
420 +                                       break;
421 +
422 +                               case '-':
423 +                                       if (strstr(argv[i]+1,static_linking) != NULL) {
424 +                                               use_static_linking = 1;
425 +                                               argv[i]='\0';
426 +                                       } else if (strcmp("--uclibc-use-build-dir",argv[i]) == 0) {
427 +                                               use_build_dir = 1;
428 +                                               argv[i]='\0';
429 +                                       } else if (strcmp("--uclibc-use-rpath",argv[i]) == 0) {
430 +                                               use_rpath = 1;
431 +                                               argv[i]='\0';
432 +                                       } else if (strcmp ("--uclibc-cc", argv[i]) == 0 && argv[i + 1]) {
433 +                                               cc = argv[i + 1];
434 +                                               argv[i] = 0;
435 +                                               argv[i + 1] = 0;
436 +                                       } else if (strncmp ("--uclibc-cc=", argv[i], 12) == 0) {
437 +                                               cc = argv[i] + 12;
438 +                                               argv[i] = 0;
439 +                                       }
440 +#ifdef __UCLIBC_CTOR_DTOR__
441 +                                       else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) {
442 +                                               ctor_dtor = 0;
443 +                                               argv[i]='\0';
444 +                                       }
445 +#endif
446 +                                       break;
447 +                       }
448 +               } else {                                /* assume it is an existing source file */
449 +                       ++source_count;
450 +               }
451 +       }
452 +
453 +       gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 64));
454 +       gcc_argument = __builtin_alloca(sizeof(char*) * (argc + 20));
455 +
456 +       i = 0; k = 0;
457 +#ifdef __UCLIBC_CTOR_DTOR__
458 +       if (ctor_dtor) {
459 +               struct stat statbuf;
460 +               if (findlibgcc==1 || stat(LIBGCC_DIR, &statbuf)!=0 || 
461 +                               !S_ISDIR(statbuf.st_mode))
462 +               {
463 +                       /* Bummer, gcc is hiding from us. This is going
464 +                        * to really slow things down... bummer.  */
465 +                       int status, gcc_pipe[2];
466 +                       pid_t pid, wpid;
467 +
468 +                       pipe(gcc_pipe);
469 +                       if (!(pid = fork())) {
470 +                               char *argv[4];
471 +                               close(gcc_pipe[0]);
472 +                               close(1);
473 +                               close(2);
474 +                               dup2(gcc_pipe[1], 1);
475 +                               dup2(gcc_pipe[1], 2);
476 +                               argv[0] = cc;
477 +                               argv[1] = "-print-libgcc-file-name";
478 +                               argv[2] = NULL;
479 +                               execvp(cc, argv);
480 +                               close(gcc_pipe[1]);
481 +                               _exit(EXIT_FAILURE);
482 +                       }
483 +                       wpid=0;
484 +                       while (wpid != pid) {
485 +                               wpid = wait(&status);
486 +                       }
487 +                       close(gcc_pipe[1]);
488 +                       if (WIFEXITED(status) && WEXITSTATUS(status)) {
489 +crash_n_burn:
490 +                               fprintf(stderr, "Unable to locale crtbegin.o provided by gcc");
491 +                               exit(EXIT_FAILURE);
492 +                       }
493 +                       if (WIFSIGNALED(status)) {
494 +                               fprintf(stderr, "%s exited because of uncaught signal %d", cc, WTERMSIG(status));
495 +                               exit(EXIT_FAILURE);
496 +                       }
497 +
498 +                       {
499 +                               char buf[1024], *dir;
500 +                               status = read(gcc_pipe[0], buf, sizeof(buf));
501 +                               close(gcc_pipe[0]);
502 +                               if (status < 0) {
503 +                                       goto crash_n_burn;
504 +                               }
505 +                               buf[(status == sizeof(buf)) ? status-1 : status] = 0;
506 +                               dir = dirname(buf);
507 +                               xstrcat(&(crtbegin_path[0]), dir, "/crtbegin.o", NULL);
508 +                               xstrcat(&(crtbegin_path[1]), dir, "/crtbeginS.o", NULL);
509 +                               xstrcat(&(crtend_path[0]), dir, "/crtend.o", NULL);
510 +                               xstrcat(&(crtend_path[1]), dir, "/crtendS.o", NULL);
511 +                       }
512 +
513 +               } else {
514 +                       xstrcat(&(crtbegin_path[0]), LIBGCC_DIR, "crtbegin.o", NULL);
515 +                       xstrcat(&(crtbegin_path[1]), LIBGCC_DIR, "crtbeginS.o", NULL);
516 +                       xstrcat(&(crtend_path[0]), LIBGCC_DIR, "crtend.o", NULL);
517 +                       xstrcat(&(crtend_path[1]), LIBGCC_DIR, "crtendS.o", NULL);
518 +               }
519 +       }
520 +
521 +       if (cplusplus && cpp)
522 +               gcc_argv[i++] = cpp;
523 +       else
524 +#endif
525 +               gcc_argv[i++] = cc;
526 +
527 +       for ( j = 1 ; j < argc ; j++ ) {
528 +               if (argv[j]=='\0') {
529 +                       continue;
530 +               } else {
531 +                       gcc_argument[k++] = argv[j];
532 +                       gcc_argument[k] = '\0';
533 +               }
534 +       }
535 +
536 +       if (linking && source_count) {
537 +               gcc_argv[i++] = "-Wl,--hash-style=sysv";
538 +#if defined __HAVE_ELF__ && ! defined __UCLIBC_HAS_MMU__
539 +               gcc_argv[i++] = "-Wl,-elf2flt";
540 +#endif
541 +               gcc_argv[i++] = nostdlib;
542 +               if (use_static_linking) {
543 +                       gcc_argv[i++] = static_linking;
544 +               }
545 +               if (!use_static_linking) {
546 +                       if (dlstr && use_build_dir) {
547 +                               gcc_argv[i++] = build_dlstr;
548 +                       } else if (dlstr) {
549 +                               gcc_argv[i++] = dlstr;
550 +                       }
551 +                       if (use_rpath) {
552 +                               gcc_argv[i++] = rpath[use_build_dir];
553 +                       }
554 +               }
555 +               for ( l = 0 ; l < n ; l++ ) {
556 +                       if (libpath[l]) gcc_argv[i++] = libpath[l];
557 +               }
558 +               gcc_argv[i++] = rpath_link[use_build_dir]; /* just to be safe */
559 +               if( libstr )
560 +                       gcc_argv[i++] = libstr;
561 +               gcc_argv[i++] = our_lib_path[use_build_dir];
562 +               if (!use_build_dir) {
563 +                       gcc_argv[i++] = our_usr_lib_path;
564 +               }
565 +       }
566 +       if (use_stdinc && source_count) {
567 +               gcc_argv[i++] = nostdinc;
568 +#ifdef __UCLIBC_CTOR_DTOR__
569 +               if (cplusplus) {
570 +                       char *cppinc;
571 +                       if (use_nostdinc_plus) {
572 +                               gcc_argv[i++] = nostdinc_plus;
573 +                       }
574 +                       xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++/", NULL);
575 +                       gcc_argv[i++] = "-isystem";
576 +                       gcc_argv[i++] = cppinc;
577 +                       xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++-v3/", NULL);
578 +                       gcc_argv[i++] = "-isystem";
579 +                       gcc_argv[i++] = cppinc;
580 +               }
581 +#endif
582 +               gcc_argv[i++] = "-isystem";
583 +               gcc_argv[i++] = uClibc_inc[use_build_dir];
584 +               gcc_argv[i++] = "-iwithprefix";
585 +               gcc_argv[i++] = "include";
586 +               if( incstr )
587 +                       gcc_argv[i++] = incstr;
588 +       }
589 +
590 +       if (linking && source_count) {
591 +
592 +#ifdef __UCLIBC_PROFILING__
593 +               if (profile) {
594 +                       gcc_argv[i++] = gcrt1_path[use_build_dir];
595 +               }
596 +#endif
597 +#ifdef __UCLIBC_CTOR_DTOR__
598 +               if (ctor_dtor) {
599 +                       gcc_argv[i++] = crti_path[use_build_dir];
600 +                       if (use_pic) {
601 +                               gcc_argv[i++] = crtbegin_path[1];
602 +                       } else {
603 +                               gcc_argv[i++] = crtbegin_path[0];
604 +                       }
605 +               }
606 +#endif
607 +               if (use_start) {
608 +#ifdef __UCLIBC_PROFILING__
609 +                       if (!profile)
610 +#endif
611 +                       {
612 +                               gcc_argv[i++] = crt0_path[use_build_dir];
613 +                       }
614 +               }
615 +               for ( l = 0 ; l < k ; l++ ) {
616 +                       if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
617 +               }
618 +               if (use_stdlib) {
619 +                       //gcc_argv[i++] = "-Wl,--start-group";
620 +                       gcc_argv[i++] = "-lgcc";
621 +               }
622 +               for ( l = 0 ; l < m ; l++ ) {
623 +                       if (libraries[l]) gcc_argv[i++] = libraries[l];
624 +               }
625 +               if (use_stdlib) {
626 +#ifdef __UCLIBC_CTOR_DTOR__
627 +                       if (cplusplus) {
628 +                               gcc_argv[ i++ ] = "-lstdc++";
629 +                               gcc_argv[ i++ ] = "-lm";
630 +                       }
631 +#endif
632 +                       gcc_argv[i++] = "-lc";
633 +                       gcc_argv[i++] = "-lgcc";
634 +                       //gcc_argv[i++] = "-Wl,--end-group";
635 +               }
636 +#ifdef __UCLIBC_CTOR_DTOR__
637 +               if (ctor_dtor) {
638 +                       if (use_pic) {
639 +                               gcc_argv[i++] = crtend_path[1];
640 +                       } else {
641 +                               gcc_argv[i++] = crtend_path[0];
642 +                       }
643 +
644 +                       gcc_argv[i++] = crtn_path[use_build_dir];
645 +               }
646 +#endif
647 +       } else {
648 +               for ( l = 0 ; l < k ; l++ ) {
649 +                       if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
650 +               }
651 +       }
652 +       gcc_argv[i++] = NULL;
653 +
654 +       if (verbose) {
655 +               for ( j = 0 ; gcc_argv[j] ; j++ ) {
656 +                       printf("arg[%2i] = %s\n", j, gcc_argv[j]);
657 +               }
658 +               fflush(stdout);
659 +       }
660 +       //no need to free memory from xstrcat because we never return... 
661 +#ifdef __UCLIBC_CTOR_DTOR__
662 +       if (cplusplus && cpp) {
663 +               execvp(cpp, gcc_argv);
664 +               fprintf(stderr, "%s: %s\n", cpp, strerror(errno));
665 +       } else
666 +#endif
667 +       {
668 +               execvp(cc, gcc_argv);
669 +               fprintf(stderr, "%s: %s\n", cc, strerror(errno));
670 +       }
671 +       exit(EXIT_FAILURE);
672 +}
673 diff -urN uClibc-0.9.29.org/extra/gcc-uClibc/Makefile uClibc-0.9.29/extra/gcc-uClibc/Makefile
674 --- uClibc-0.9.29.org/extra/gcc-uClibc/Makefile 1970-01-01 01:00:00.000000000 +0100
675 +++ uClibc-0.9.29/extra/gcc-uClibc/Makefile     2007-06-03 22:10:14.593807939 +0200
676 @@ -0,0 +1,93 @@
677 +# Makefile for building a fake gcc/binutils toolchain
678 +# that simply spoofs the location of the C library
679 +#
680 +# Copyright (C) 2000-2002 Erik Andersen <andersen@uclibc.org>
681 +#
682 +
683 +TOPDIR = ../../
684 +include $(TOPDIR)Rules.mak
685 +include $(TOPDIR)/.config
686 +
687 +UCLIBC_DIR = $(shell (cd ../.. ; /bin/pwd))
688 +GCC_BIN = $(shell which $(CC))
689 +LD_BIN = $(shell which $(LD))
690 +GCCINCDIR:= ${shell $(CC) -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp"}
691 +
692 +all: gcc-uClibc ld-uClibc
693 +
694 +gcc-uClibc.h: Makefile $(TOPDIR)/.config
695 +       @echo "/* this file was autogenerated by make */" > gcc-uClibc.h
696 +       @echo "#define UCLIBC_TARGET_PREFIX " \"$(TARGET_PREFIX)\" >> gcc-uClibc.h
697 +       @echo "#define UCLIBC_DEVEL_PREFIX " \"$(DEVEL_PREFIX)\" >> gcc-uClibc.h
698 +       @echo "#define UCLIBC_RUNTIME_PREFIX " \"$(RUNTIME_PREFIX)\" >> gcc-uClibc.h
699 +       @echo "#define UCLIBC_BUILD_DIR " \"$(UCLIBC_DIR)\" >> gcc-uClibc.h
700 +       @echo "#define GCC_BIN " \"$(GCC_BIN)\" >> gcc-uClibc.h
701 +       @echo "#define LIBGCC_DIR " \"$(LIBGCC_DIR)\" >> gcc-uClibc.h
702 +       @echo "#define TARGET_ARCH " \"$(TARGET_ARCH)\" >> gcc-uClibc.h
703 +       @echo "#define DYNAMIC_LINKER " \"$(RUNTIME_PREFIX)/lib/$(UCLIBC_LDSO)\" >> gcc-uClibc.h
704 +       @echo "#define BUILD_DYNAMIC_LINKER " \"$(UCLIBC_DIR)/lib/$(UCLIBC_LDSO)\" >> gcc-uClibc.h
705 +ifeq ($(strip $(HAVE_SHARED)),y)
706 +       @echo "#define __UCLIBC_HAS_SHARED__ 1" >> gcc-uClibc.h
707 +else
708 +       @echo "#undef __UCLIBC_HAS_SHARED__" >> gcc-uClibc.h
709 +endif
710 +ifeq ($(strip $(UCLIBC_HAS_MMU)),y)
711 +       @echo "#define __UCLIBC_HAS_MMU__ 1" >> gcc-uClibc.h
712 +else
713 +       @echo "#undef __UCLIBC_HAS_MMU__" >> gcc-uClibc.h
714 +endif
715 +ifeq ($(strip $(HAS_ELF)),y)
716 +       @echo "#define __HAS_ELF__ 1" >> gcc-uClibc.h
717 +else
718 +       @echo "#undef __HAS_ELF__" >> gcc-uClibc.h
719 +endif
720 +ifeq ($(strip $(UCLIBC_CTOR_DTOR)),y)
721 +       @echo "#define __UCLIBC_CTOR_DTOR__ 1" >> gcc-uClibc.h
722 +ifeq ($(strip $(UCLIBC_PROFILING)),y)
723 +       @echo "#define __UCLIBC_PROFILING__ 1" >> gcc-uClibc.h
724 +else
725 +       @echo "#undef __UCLIBC_PROFILING__" >> gcc-uClibc.h
726 +endif
727 +else
728 +       @echo "#undef __UCLIBC_CTOR_DTOR__" >> gcc-uClibc.h
729 +endif
730 +
731 +gcc-uClibc: gcc-uClibc.h gcc-uClibc.c
732 +       $(HOSTCC) $(HOSTCFLAGS) -s gcc-uClibc.c -o $(TARGET_ARCH)-uclibc-gcc
733 +       touch gcc-uClibc
734 +
735 +ld-uClibc:
736 +       @echo "#!/bin/sh" > $(TARGET_ARCH)-uclibc-ld
737 +       @echo "# This file was autogenerated by make" >> $(TARGET_ARCH)-uclibc-ld
738 +       @echo "exec $(LD_BIN) \$$@ -L$(DEVEL_PREFIX)/lib" >> $(TARGET_ARCH)-uclibc-ld
739 +       chmod a+x $(TARGET_ARCH)-uclibc-ld
740 +       touch ld-uClibc
741 +
742 +install: all
743 +       install -d $(PREFIX)$(DEVEL_PREFIX)/bin;
744 +       install -d $(PREFIX)$(RUNTIME_PREFIX)/bin;
745 +       install -m 755 $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/
746 +       install -m 755 $(TARGET_ARCH)-uclibc-ld $(PREFIX)$(RUNTIME_PREFIX)/bin/
747 +       ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-cc
748 +       ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/gcc
749 +       ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/cc
750 +       ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-ld  $(PREFIX)$(DEVEL_PREFIX)/bin/ld
751 +ifeq ($(strip $(UCLIBC_CTOR_DTOR)),y)
752 +       ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-g++
753 +       ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-c++
754 +       ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/c++
755 +       ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/g++
756 +endif
757 +       for app in addr2line ar as cpp gasp nm objcopy \
758 +           objdump ranlib size strings strip; do \
759 +         APPNAME=`which $(CROSS)$${app}`; \
760 +         if [ -x "$$APPNAME" ] ; then \
761 +         ln -fs "$$APPNAME" $(PREFIX)$(DEVEL_PREFIX)/bin/$${app}; \
762 +         ln -fs "$$APPNAME" $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-$${app}; \
763 +         fi; \
764 +       done
765 +
766 +clean:
767 +       rm -f gcc-uClibc.h *-uclibc-gcc *-uclibc-ld core
768 +
769 +
770 diff -urN uClibc-0.9.29.org/Makefile.in uClibc-0.9.29/Makefile.in
771 --- uClibc-0.9.30/Makefile.in.orig      2008-11-07 22:15:53.000000000 +0100
772 +++ uClibc-0.9.30/Makefile.in   2009-01-10 11:45:01.578456370 +0100
773 @@ -19,7 +19,7 @@
774  
775  ifeq ($(HAVE_DOT_CONFIG),y)
776  
777 -all: pregen libs
778 +all: pregen libs toolchain
779  libs: pregen
780  
781  # In this section, we need .config
782 @@ -178,7 +178,7 @@
783         HOSTCC="$(HOSTCC)" \
784         install_dev
785  
786 -install: install_runtime install_dev
787 +install: install_runtime install_dev install_toolchain
788  
789  
790  RUNTIME_PREFIX_LIB_FROM_DEVEL_PREFIX_LIB=$(shell $(top_srcdir)extra/scripts/relative_path.sh $(DEVEL_PREFIX)lib $(RUNTIME_PREFIX)lib)
791 @@ -420,6 +420,12 @@
792         fi
793  endif
794  
795 +toolchain:
796 +       $(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C extra/gcc-uClibc
797 +
798 +install_toolchain: toolchain
799 +       $(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C extra/gcc-uClibc install
800 +
801  hostutils:
802         $(Q)$(MAKE) CROSS="$(CROSS)" CC="$(CC)" HOSTCC="$(HOSTCC)" -C utils hostutils
803  utils:
This page took 0.134032 seconds and 4 git commands to generate.