Mercurial > hg > aboriginal
annotate sources/toys/gcc-uClibc.c @ 435:d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
author | Rob Landley <rob@landley.net> |
---|---|
date | Fri, 31 Oct 2008 00:45:57 -0500 |
parents | 116c10067f4a |
children | e9f3011ec40d |
rev | line source |
---|---|
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* vi: set ts=4 :*/ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 /* |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright (C) 2000 Manuel Novoa III |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright (C) 2002-2003 Erik Andersen |
22
775c1fdc1730
Minor cleanup on the wrapper script (much more cleanup needed before it's
Rob Landley <rob@landley.net>
parents:
20
diff
changeset
|
5 * Copyright (C) 2006 Rob Landley <rob@landley.net> |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 * Wrapper to use uClibc with gcc, and make gcc relocatable. |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
10 #define _GNU_SOURCE |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
11 #include <alloca.h> |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 #include <stdio.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 #include <stdlib.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 #include <stdarg.h> |
76
5703436a408e
Update the uClibc snapshot and make config changes it needs.
Rob Landley <rob@landley.net>
parents:
65
diff
changeset
|
15 #include <string.h> |
57
f393a630a5b3
Weird ordering dependency. I think it's a uClibc bug?
Rob Landley <rob@landley.net>
parents:
56
diff
changeset
|
16 #include <strings.h> |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 #include <unistd.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 #include <errno.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 #include <sys/stat.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #include <sys/wait.h> |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 static char *topdir; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 static char static_linking[] = "-static"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 static char nostdinc[] = "-nostdinc"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 static char nostartfiles[] = "-nostartfiles"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 static char nodefaultlibs[] = "-nodefaultlibs"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 static char nostdlib[] = "-nostdlib"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 // For C++ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 static char nostdinc_plus[] = "-nostdinc++"; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 |
390
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
32 #ifdef GIMME_AN_S |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
33 #define ADD_GCC_S() gcc_argv[argcnt++] = "-Wl,--as-needed,-lgcc_s,--no-as-needed" |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
34 #else |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
35 #define ADD_GCC_S() |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
36 #endif |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
37 |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
38 |
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
39 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
41 // Confirm that a regular file exists, and (optionally) has the executable bit. |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
42 int is_file(char *filename, int has_exe) |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 { |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
44 // Confirm it has the executable bit set, if necessary. |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
45 if (!has_exe || !access(filename, X_OK)) { |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
46 struct stat st; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
48 // Confirm it exists and is not a directory. |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
49 if (!stat(filename, &st) && S_ISREG(st.st_mode)) return 1; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 } |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
51 return 0; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
54 // Find an executable in a colon-separated path |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
56 char *find_in_path(char *path, char *filename, int has_exe) |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 { |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
58 char *cwd = getcwd(NULL, 0); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
59 |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
60 if (index(filename, '/') && is_file(filename, has_exe)) |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
61 return strdup(filename); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
62 |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
63 for (;;) { |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
64 char *str, *next = path ? index(path, ':') : NULL; |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
65 int len = next ? next-path : strlen(path); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
66 |
64
51b8220c37e7
Make wrapper script work when /bin is a symlink to /usr/bin and the wrapper
Rob Landley <rob@landley.net>
parents:
63
diff
changeset
|
67 // The +3 is a corner case: if strlen(filename) is 1, make sure we |
51b8220c37e7
Make wrapper script work when /bin is a symlink to /usr/bin and the wrapper
Rob Landley <rob@landley.net>
parents:
63
diff
changeset
|
68 // have enough space to append ".." to make topdir. |
51b8220c37e7
Make wrapper script work when /bin is a symlink to /usr/bin and the wrapper
Rob Landley <rob@landley.net>
parents:
63
diff
changeset
|
69 str = malloc(strlen(filename) + (len ? len : strlen(cwd)) + 3); |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
70 if (!len) sprintf(str, "%s/%s", cwd, filename); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
71 else { |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
72 char *str2 = str; |
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
73 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
74 strncpy(str, path, len); |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
75 str2 = str+len; |
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
76 *(str2++) = '/'; |
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
77 strcpy(str2, filename); |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
78 } |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
79 |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
80 // If it's not a directory, return it. |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
81 if (is_file(str, has_exe)) return str; |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
82 else free(str); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
83 |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
84 if (!next) break; |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
85 path += len; |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
86 path++; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 } |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
88 free(cwd); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
90 return NULL; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 int main(int argc, char **argv) |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 { |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
95 int linking = 1, use_static_linking = 0; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_pic = 0; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
97 int source_count = 0, verbose = 0; |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
98 int i, argcnt, liblen, lplen, sawM = 0, sawdotoa = 0, sawcES = 0; |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
99 char **gcc_argv, **libraries, **libpath; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
100 char *dlstr, *incstr, *devprefix, *libstr; |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
101 char *cc, *rpath_link, *rpath, *uClibc_inc, *our_lib_path[2]; |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
102 char *crt0_path, *crtbegin_path[2], *crtend_path[2]; |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
103 char *debug_wrapper=getenv("DEBUG_WRAPPER"); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 // For C++ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
107 char *crti_path, *crtn_path, *cpp = NULL; |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
108 int len, ctor_dtor = 1, cplusplus = 0, use_nostdinc_plus = 0; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 // For profiling |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 int profile = 0; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
112 char *gcrt1_path; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
114 if(debug_wrapper) { |
217
01fd30185476
Use fprintf(stderr,...) instead of dprintf(2,...) to be more portable.
Rob Landley <rob@landley.net>
parents:
76
diff
changeset
|
115 fprintf(stderr,"incoming: "); |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
116 for(gcc_argv=argv;*gcc_argv;gcc_argv++) |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
117 fprintf(stderr,"%s ",*gcc_argv); |
217
01fd30185476
Use fprintf(stderr,...) instead of dprintf(2,...) to be more portable.
Rob Landley <rob@landley.net>
parents:
76
diff
changeset
|
118 fprintf(stderr,"\n\n"); |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
119 } |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
120 |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
121 // Allocate space for new command line |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
122 gcc_argv = alloca(sizeof(char*) * (argc + 128)); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
123 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
124 // What directory is the wrapper script in? |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
125 if(!(topdir = find_in_path(getenv("PATH"), argv[0], 1))) { |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
126 fprintf(stderr, "can't find %s in $PATH\n", argv[0]); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
127 exit(1); |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
128 } else { |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
129 char *path = getenv("PATH"), *temp; |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
130 |
64
51b8220c37e7
Make wrapper script work when /bin is a symlink to /usr/bin and the wrapper
Rob Landley <rob@landley.net>
parents:
63
diff
changeset
|
131 // Add that directory to the start of $PATH. (Better safe than sorry.) |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
132 *rindex(topdir,'/') = 0; |
257
d37e39370d39
Fix cross compiler toolchain to be properly relocatable on x86-64 host.
Rob Landley <rob@landley.net>
parents:
217
diff
changeset
|
133 temp = malloc(5+strlen(topdir)+1+strlen(topdir)+14+strlen(path)+1); |
d37e39370d39
Fix cross compiler toolchain to be properly relocatable on x86-64 host.
Rob Landley <rob@landley.net>
parents:
217
diff
changeset
|
134 sprintf(temp,"PATH=%s:%s/../tools/bin:%s",topdir,topdir,path); |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
135 putenv(temp); |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
136 |
64
51b8220c37e7
Make wrapper script work when /bin is a symlink to /usr/bin and the wrapper
Rob Landley <rob@landley.net>
parents:
63
diff
changeset
|
137 // The directory above the wrapper script should have include, gcc, |
65
79295919b775
Ok, when appending .. instead of truncating at /, remember the "stop truncating"
Rob Landley <rob@landley.net>
parents:
64
diff
changeset
|
138 // and lib directories. However, the script could have a symlink |
79295919b775
Ok, when appending .. instead of truncating at /, remember the "stop truncating"
Rob Landley <rob@landley.net>
parents:
64
diff
changeset
|
139 // pointing to its directory (ala /bin -> /usr/bin), so append ".." |
79295919b775
Ok, when appending .. instead of truncating at /, remember the "stop truncating"
Rob Landley <rob@landley.net>
parents:
64
diff
changeset
|
140 // instead of trucating the path. |
79295919b775
Ok, when appending .. instead of truncating at /, remember the "stop truncating"
Rob Landley <rob@landley.net>
parents:
64
diff
changeset
|
141 strcat(topdir,"/.."); |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
142 } |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
143 |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
144 // What's the name of the C compiler we're wrapping? (It may have a |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
145 // cross-prefix.) |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 cc = getenv("UCLIBC_CC"); |
390
a9a9eee9e620
Teach the wrapper script to do the libgcc_s --as-needed stuff when
Rob Landley <rob@landley.net>
parents:
257
diff
changeset
|
147 if (!cc) cc = GCC_UNWRAPPED_NAME; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
149 |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
150 // Check end of name, since there could be a cross-prefix on the thing |
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
151 len = strlen(argv[0]); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
152 if (!strcmp(argv[0]+len-2, "ld")) { |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
153 |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
154 // TODO: put support for wrapping the linker here. |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
155 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
156 // Wrapping the c++ compiler? |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
157 } else if (!strcmp(argv[0]+len-2, "++")) { |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 len = strlen(cc); |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
159 cpp = alloca(len+1); |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
160 strcpy(cpp, cc); |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
161 cpp[len-1]='+'; |
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
162 cpp[len-2]='+'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 cplusplus = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 use_nostdinc_plus = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 devprefix = getenv("UCLIBC_DEVEL_PREFIX"); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 if (!devprefix) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 devprefix = topdir; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 incstr = getenv("UCLIBC_GCC_INC"); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 libstr = getenv("UCLIBC_GCC_LIB"); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
175 asprintf(&rpath_link,"-Wl,-rpath-link,%s/lib", devprefix); |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
176 asprintf(&rpath, "-Wl,-rpath,%s/lib", devprefix); |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
177 asprintf(&uClibc_inc, "%s/include/", devprefix); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
179 asprintf(&crt0_path, "%s/lib/crt1.o", devprefix); |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
180 asprintf(&crti_path, "%s/lib/crti.o", devprefix); |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
181 asprintf(&crtn_path, "%s/lib/crtn.o", devprefix); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 // profiling |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
184 asprintf(&gcrt1_path, "%s/lib/gcrt1.o", devprefix); |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
185 asprintf(our_lib_path, "-L%s/lib", devprefix); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 // Figure out where the dynamic linker is. |
63
89cf9497824e
Teach the native build about ld-uClibc.so.0 can living in /tools.
Rob Landley <rob@landley.net>
parents:
57
diff
changeset
|
188 dlstr = getenv("UCLIBC_DYNAMIC_LINKER"); |
89cf9497824e
Teach the native build about ld-uClibc.so.0 can living in /tools.
Rob Landley <rob@landley.net>
parents:
57
diff
changeset
|
189 if (!dlstr) dlstr = "/lib/ld-uClibc.so.0"; |
89cf9497824e
Teach the native build about ld-uClibc.so.0 can living in /tools.
Rob Landley <rob@landley.net>
parents:
57
diff
changeset
|
190 asprintf(&dlstr, "-Wl,--dynamic-linker,%s", dlstr); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
192 liblen = 0; |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
193 libraries = alloca(sizeof(char*) * (argc)); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
194 libraries[liblen] = '\0'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
196 lplen = 0; |
433
c7a1631711f4
Smallish wrapper cleanups, more to come.
Rob Landley <rob@landley.net>
parents:
403
diff
changeset
|
197 libpath = alloca(sizeof(char*) * (argc)); |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
198 libpath[lplen] = '\0'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
200 // Parse the incoming gcc arguments. |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
201 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 for ( i = 1 ; i < argc ; i++ ) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 if (argv[i][0] == '-' && argv[i][1]) { /* option */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 switch (argv[i][1]) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 case 'c': /* compile or assemble */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 case 'S': /* generate assembler code */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 case 'E': /* preprocess only */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 case 'M': /* generate dependencies */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 linking = 0; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
210 if (argv[i][1] == 'M') sawM = 1; |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
211 else sawcES = 1; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
213 |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
214 case 'L': /* library path */ |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
215 libpath[lplen++] = argv[i]; |
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
216 libpath[lplen] = '\0'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 if (argv[i][2] == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 argv[i] = '\0'; |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
219 libpath[lplen++] = argv[++i]; |
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
220 libpath[lplen] = '\0'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 argv[i] = '\0'; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
224 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 case 'l': /* library */ |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
226 libraries[liblen++] = argv[i]; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
227 libraries[liblen] = '\0'; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 argv[i] = '\0'; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
230 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 case 'v': /* verbose */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 if (argv[i][2] == 0) verbose = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 printf("Invoked as %s\n", argv[0]); |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
234 printf("Reference path: %s\n", topdir); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
236 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 case 'n': |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 if (strcmp(nostdinc,argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 use_stdinc = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 } else if (strcmp(nostartfiles,argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 ctor_dtor = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 use_start = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 } else if (strcmp(nodefaultlibs,argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 use_stdlib = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 argv[i] = '\0'; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 } else if (strcmp(nostdlib,argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 ctor_dtor = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 use_start = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 use_stdlib = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 } else if (strcmp(nostdinc_plus,argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 if (cplusplus==1) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 use_nostdinc_plus = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
256 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 case 's': |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 if (strstr(argv[i],static_linking) != NULL) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 use_static_linking = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 if (strcmp("-shared",argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 use_start = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 use_pic = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
266 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 case 'W': /* -static could be passed directly to ld */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 if (strncmp("-Wl,",argv[i],4) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 if (strstr(argv[i],static_linking) != 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 use_static_linking = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 if (strstr(argv[i],"--dynamic-linker") != 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 dlstr = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 break; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
278 case 'p': |
29
db08bdb5e9de
The poor design of the gcc command line never ceases to amaze. Notice how
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
279 wow_this_sucks: |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
280 if (!strncmp("-print-",argv[i],7)) { |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
281 char *temp, *temp2; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
282 int itemp, showall = 0; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
283 |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
284 temp = argv[i]+7; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
285 if (!strcmp(temp, "search-dirs")) { |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
286 printf("install: %s/\n",devprefix); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
287 printf("programs: %s\n",getenv("PATH")); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
288 printf("libraries: "); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
289 temp2 = ""; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
290 showall = 1; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
291 } else if (!strncmp(temp, "file-name=", 10)) |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
292 temp2 = temp+10; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
293 else if (!strcmp(temp, "libgcc-file-name")) |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
294 temp2="libgcc.a"; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
295 else break; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
297 // Find this entry in the library path. |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
298 for(itemp=0;;itemp++) { |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
299 if (itemp == lplen) { |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
300 asprintf(&temp, "%s/gcc/lib/%s", devprefix, temp2); |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
301 } else if (itemp == lplen+1) { |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
302 // This is so "include" finds the gcc internal |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
303 // include dir. The uClibc build needs this. |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
304 asprintf(&temp, "%s/gcc/%s", devprefix, temp2); |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
305 } else if (itemp == lplen+2) { |
20
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
306 temp = temp2; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
307 break; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
308 } else { |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
309 asprintf(&temp, "%s/%s", libpath[itemp], |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
310 temp2); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
311 } |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
312 if (showall) printf(":%s"+(itemp?0:1), temp); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
313 else if (!access(temp, F_OK)) break; |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
314 } |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
315 |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
316 printf("%s\n"+(showall ? 2 : 0), temp); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
317 exit(0); |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
318 |
44067ab61cd2
Switch linking back on as the default, add support for -print-search-dirs,
Rob Landley <rob@landley.net>
parents:
19
diff
changeset
|
319 // Profiling. |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
320 } else if (!strcmp("-pg",argv[i])) profile = 1; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 break; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
322 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 case 'f': |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 /* Check if we are doing PIC */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 if (strcmp("-fPIC",argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 use_pic = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 } else if (strcmp("-fpic",argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 use_pic = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 // profiling |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 } else if (strcmp("-fprofile-arcs",argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 profile = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 break; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 |
19
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
336 // --longopts |
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
337 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 case '-': |
29
db08bdb5e9de
The poor design of the gcc command line never ceases to amaze. Notice how
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
339 if (!strncmp(argv[i],"--print-",8)) { |
db08bdb5e9de
The poor design of the gcc command line never ceases to amaze. Notice how
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
340 argv[i]++; |
db08bdb5e9de
The poor design of the gcc command line never ceases to amaze. Notice how
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
341 goto wow_this_sucks; |
db08bdb5e9de
The poor design of the gcc command line never ceases to amaze. Notice how
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
342 } else if (strstr(argv[i]+1,static_linking) != NULL) { |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 use_static_linking = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 argv[i]='\0'; |
19
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
345 } else if (!strcmp("--version",argv[i])) { |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 printf("uClibc "); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 fflush(stdout); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 break; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 } else if (strcmp ("--uclibc-cc", argv[i]) == 0 && argv[i + 1]) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 cc = argv[i + 1]; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 argv[i] = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 argv[i + 1] = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 } else if (strncmp ("--uclibc-cc=", argv[i], 12) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 cc = argv[i] + 12; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 argv[i] = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 } else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 ctor_dtor = 0; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 argv[i]='\0'; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 break; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 } else { /* assume it is an existing source file */ |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 char *p = strchr (argv[i], '\0') - 2; |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
364 if (p > argv[i] && sawM && (!strcmp(p, ".o") || !strcmp(p, ".a"))) |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 sawdotoa = 1; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 ++source_count; |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 |
19
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
370 if (sawdotoa && sawM && !sawcES) |
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
371 linking = 1; |
b5ffd82d9ae5
Two problems: 1) Needed to parse -print-file-name= to make the uClibc build
Rob Landley <rob@landley.net>
parents:
18
diff
changeset
|
372 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
373 argcnt = 0; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 if (ctor_dtor) { |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
375 asprintf(crtbegin_path, "%s/gcc/lib/crtbegin.o", devprefix); |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
376 asprintf(crtbegin_path+1, "%s/gcc/lib/crtbeginS.o", devprefix); |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
377 asprintf(crtend_path, "%s/gcc/lib/crtend.o", devprefix); |
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
378 asprintf(crtend_path+1, "%s/gcc/lib/crtendS.o", devprefix); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
381 gcc_argv[argcnt++] = cpp ? cpp : cc; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
383 if (cplusplus) gcc_argv[argcnt++] = "-fno-use-cxa-atexit"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 if (linking && source_count) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 //#if defined HAS_ELF && ! defined HAS_MMU |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
387 // gcc_argv[argcnt++] = "-Wl,-elf2flt"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 //#endif |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
389 gcc_argv[argcnt++] = nostdlib; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 if (use_static_linking) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
391 gcc_argv[argcnt++] = static_linking; |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
392 } else { |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
393 if (dlstr) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
394 gcc_argv[argcnt++] = dlstr; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 } |
434
116c10067f4a
Replace variable "n" with something greppable.
Rob Landley <rob@landley.net>
parents:
433
diff
changeset
|
397 for ( i = 0 ; i < lplen ; i++ ) |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
398 if (libpath[i]) gcc_argv[argcnt++] = libpath[i]; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
399 gcc_argv[argcnt++] = rpath_link; /* just to be safe */ |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 if( libstr ) |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
401 gcc_argv[argcnt++] = libstr; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
402 gcc_argv[argcnt++] = our_lib_path[0]; |
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
403 asprintf(gcc_argv+(argcnt++), "-L%s/gcc/lib", devprefix); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 if (use_stdinc && source_count) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
406 gcc_argv[argcnt++] = nostdinc; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 if (cplusplus) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 if (use_nostdinc_plus) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
410 gcc_argv[argcnt++] = nostdinc_plus; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 } |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
412 gcc_argv[argcnt++] = "-isystem"; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
413 asprintf(gcc_argv+(argcnt++), "%sc++/4.1.1", uClibc_inc); |
18
eaf7a8d5e697
Managed to get a working toolchain, with wrapper script, to build a hello
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
414 //char *cppinc; |
22
775c1fdc1730
Minor cleanup on the wrapper script (much more cleanup needed before it's
Rob Landley <rob@landley.net>
parents:
20
diff
changeset
|
415 //#define TARGET_DIR "gcc/armv4l-unknown-linux/gnu/4.1.1" |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
416 //xstrcat(&cppinc, uClibc_inc, "c++/4.1.1/" TARGET_DIR, NULL); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
417 //gcc_argv[argcnt++] = "-isystem"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
418 //gcc_argv[argcnt++] = cppinc; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
419 //xstrcat(&cppinc, uClibc_inc, "c++/4.1.1", NULL); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
420 //gcc_argv[argcnt++] = "-isystem"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
421 //gcc_argv[argcnt++] = cppinc; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
424 gcc_argv[argcnt++] = "-isystem"; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
425 gcc_argv[argcnt++] = uClibc_inc; |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
426 gcc_argv[argcnt++] = "-isystem"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
427 asprintf(gcc_argv+(argcnt++), "%s/gcc/include", devprefix); |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
428 if(incstr) gcc_argv[argcnt++] = incstr; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
431 gcc_argv[argcnt++] = "-U__nptl__"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 if (linking && source_count) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 if (profile) { |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
436 gcc_argv[argcnt++] = gcrt1_path; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 if (ctor_dtor) { |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
439 gcc_argv[argcnt++] = crti_path; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 if (use_pic) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
441 gcc_argv[argcnt++] = crtbegin_path[1]; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 } else { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
443 gcc_argv[argcnt++] = crtbegin_path[0]; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 } |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
446 if (use_start && !profile) gcc_argv[argcnt++] = crt0_path; |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
447 |
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
448 // Add remaining unclaimed arguments. |
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
449 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
450 for (i=1; i<argc; i++) if (argv[i]) gcc_argv[argcnt++] = argv[i]; |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
451 |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 if (use_stdlib) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
453 //gcc_argv[argcnt++] = "-Wl,--start-group"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
454 gcc_argv[argcnt++] = "-lgcc"; |
403
34fed9a885f3
Fix wrapper so static build doesn't look for libgcc_s.a.
Rob Landley <rob@landley.net>
parents:
390
diff
changeset
|
455 if (!use_static_linking) ADD_GCC_S(); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
456 // gcc_argv[argcnt++] = "-lgcc_eh"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 } |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
458 for (i = 0 ; i < liblen ; i++) |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
459 if (libraries[i]) gcc_argv[argcnt++] = libraries[i]; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 if (use_stdlib) { |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 if (cplusplus) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
462 gcc_argv[argcnt++] = "-lstdc++"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
463 gcc_argv[argcnt++] = "-lm"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 } |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
465 gcc_argv[argcnt++] = "-lc"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
466 gcc_argv[argcnt++] = "-lgcc"; |
403
34fed9a885f3
Fix wrapper so static build doesn't look for libgcc_s.a.
Rob Landley <rob@landley.net>
parents:
390
diff
changeset
|
467 if (!use_static_linking) ADD_GCC_S(); |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
468 // gcc_argv[argcnt++] = "-lgcc_eh"; |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
469 //gcc_argv[argcnt++] = "-Wl,--end-group"; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 if (ctor_dtor) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
472 gcc_argv[argcnt++] = crtend_path[use_pic ? 1 : 0]; |
435
d8e531563e35
Clean out some of the old uClibc build dir stuff nothing uses anymore.
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
473 gcc_argv[argcnt++] = crtn_path; |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
474 } |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
475 } else for (i=1; i<argc; i++) if (argv[i]) gcc_argv[argcnt++] = argv[i]; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
477 gcc_argv[argcnt++] = NULL; |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 if (verbose) { |
28
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
480 for ( i = 0 ; gcc_argv[i] ; i++ ) { |
a6a06bf0c541
Replace single character variable names with ones that are easier to grep for.
Rob Landley <rob@landley.net>
parents:
22
diff
changeset
|
481 printf("arg[%2i] = %s\n", i, gcc_argv[i]); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 } |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 fflush(stdout); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 } |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
485 |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
486 if (debug_wrapper) { |
217
01fd30185476
Use fprintf(stderr,...) instead of dprintf(2,...) to be more portable.
Rob Landley <rob@landley.net>
parents:
76
diff
changeset
|
487 fprintf(stderr, "outgoing: "); |
01fd30185476
Use fprintf(stderr,...) instead of dprintf(2,...) to be more portable.
Rob Landley <rob@landley.net>
parents:
76
diff
changeset
|
488 for(i=0; gcc_argv[i]; i++) fprintf(stderr, "%s ",gcc_argv[i]); |
01fd30185476
Use fprintf(stderr,...) instead of dprintf(2,...) to be more portable.
Rob Landley <rob@landley.net>
parents:
76
diff
changeset
|
489 fprintf(stderr, "\n\n"); |
42
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
490 } |
7b0f34fbc35a
Fix inappropriate activation of profiling support, and add environment variable
Rob Landley <rob@landley.net>
parents:
30
diff
changeset
|
491 |
65
79295919b775
Ok, when appending .. instead of truncating at /, remember the "stop truncating"
Rob Landley <rob@landley.net>
parents:
64
diff
changeset
|
492 //no need to free memory from xstrcat because we never return. |
16
7946bc54424b
Some more work on the wrapper. Still doesn't work yet.
Rob Landley <rob@landley.net>
parents:
14
diff
changeset
|
493 execvp(gcc_argv[0], gcc_argv); |
14
8b4600334a3d
Replace the path finding logic with the stuff from toybox.
Rob Landley <rob@landley.net>
parents:
13
diff
changeset
|
494 fprintf(stderr, "%s: %s\n", cpp ? cpp : cc, strerror(errno)); |
13
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 exit(EXIT_FAILURE); |
d34028ce8602
A version of the old uClibc wrapper script, which Chris Faylor maintained for
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 } |