|
|
1.1 root 1: /* Call Windows NT 3.x linker.
2: Copyright (C) 1994 Free Software Foundation, Inc.
3: Contributed by Douglas B. Rupp ([email protected]).
4:
5: This file is part of GNU CC.
6:
7: GNU CC is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: GNU CC is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with GNU CC; see the file COPYING. If not, write to
19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20:
21: #include "config.h"
22: #include <stdio.h>
23: #include <sys/types.h>
24: #include <sys/stat.h>
25: #include <stdlib.h>
26: #include <string.h>
27: #include <process.h>
28:
29: /* These can be set by command line arguments */
30: char *linker_path = 0;
31: int verbose = 0;
32:
33: int link_arg_max = -1;
34: char **link_args = (char **) 0;
35: int link_arg_index = -1;
36:
37: char *search_dirs = ".";
38:
39: static int is_regular_file (char *name);
40:
41: static void
42: addarg (str)
43: char *str;
44: {
45: int i;
46:
47: if (++link_arg_index >= link_arg_max)
48: {
49: char **new_link_args
50: = (char **) calloc (link_arg_max + 1000, sizeof (char *));
51:
52: for (i = 0; i <= link_arg_max; i++)
53: new_link_args [i] = link_args [i];
54:
55: if (link_args)
56: free (link_args);
57:
58: link_arg_max += 1000;
59: link_args = new_link_args;
60: }
61:
62: link_args [link_arg_index] = str;
63: }
64:
65: static char *
66: locate_file (file_name, path_val)
67: char *file_name;
68: char *path_val;
69: {
70: char buf [1000];
71: int file_len = strlen (file_name);
72: char *end_path = path_val + strlen (path_val);
73: char *ptr;
74:
75: /* Handle absolute pathnames */
76: if (file_name [0] == '/' || file_name [0] == DIR_SEPARATOR
77: || isalpha (file_name [0]) && file_name [1] == ':')
78: {
79: strncpy (buf, file_name, sizeof buf);
80: buf[sizeof buf - 1] = '\0';
81: if (is_regular_file (buf))
82: return strdup (buf);
83: else
84: return 0;
85: }
86:
87: if (! path_val)
88: return 0;
89:
90: for (;;)
91: {
92: for (; *path_val == PATH_SEPARATOR ; path_val++)
93: ;
94: if (! *path_val)
95: return 0;
96:
97: for (ptr = buf; *path_val && *path_val != PATH_SEPARATOR; )
98: *ptr++ = *path_val++;
99:
100: ptr--;
101: if (*ptr != '/' && *ptr != DIR_SEPARATOR)
102: *++ptr = DIR_SEPARATOR;
103:
104: strcpy (++ptr, file_name);
105:
106: if (is_regular_file (buf))
107: return strdup (buf);
108: }
109:
110: return 0;
111: }
112:
113: static char *
114: expand_lib (name)
115: char *name;
116: {
117: char *lib, *lib_path;
118:
119: lib = malloc (strlen (name) + 6);
120: strcpy (lib, "lib");
121: strcat (lib, name);
122: strcat (lib, ".a");
123: lib_path = locate_file (lib, search_dirs);
124: if (!lib_path)
125: {
126: fprintf (stderr, "Couldn't locate library: %s\n", lib);
127: exit (1);
128: }
129:
130: return lib_path;
131: }
132:
133: static int
134: is_regular_file (name)
135: char *name;
136: {
137: int ret;
138: struct stat statbuf;
139:
140: ret = stat(name, &statbuf);
141: return !ret && S_ISREG (statbuf.st_mode);
142: }
143:
144: static void
145: process_args (p_argc, argv)
146: int *p_argc;
147: char *argv[];
148: {
149: int i, j;
150:
151: for (i = 1; i < *p_argc; i++)
152: {
153: /* -v turns on verbose option here and is passed on to gcc */
154: if (! strcmp (argv [i], "-v"))
155: verbose = 1;
156: }
157: }
158:
159: main (argc, argv)
160: int argc;
161: char *argv[];
162: {
163: int i;
164: int done_an_ali = 0;
165: int file_name_index;
166: char *pathval = getenv ("PATH");
167: char *spawn_args [5];
168: char *tmppathval = malloc (strlen (pathval) + 3);
169:
170: strcpy (tmppathval, ".;");
171: pathval = strcat (tmppathval, pathval);
172:
173: process_args (&argc , argv);
174:
175: linker_path = locate_file ("link32.exe", pathval);
176: if (!linker_path)
177: {
178: linker_path = locate_file ("link.exe", pathval);
179: if (!linker_path)
180: {
181: fprintf (stderr, "Couldn't locate link32 or link\n");
182: exit (1);
183: }
184: }
185:
186: addarg (linker_path);
187:
188: for (i = 1; i < argc; i++)
189: {
190: int arg_len = strlen (argv [i]);
191:
192: if (!strcmp (argv [i], "-o"))
193: {
194: char *buff, *ptr;
195: int out_len;
196:
197: i++;
198: out_len = strlen (argv[i]) + 10;
199: buff = malloc (out_len);
200: strcpy (buff, "-out:");
201: strcat (buff, argv[i]);
202: ptr = strstr (buff, ".exe");
203: if (ptr == NULL || strlen (ptr) != 4)
204: strcat (buff, ".exe");
205: addarg (buff);
206: addarg ("-debug:full -debugtype:coff");
207: }
208: else if (arg_len > 2 && !strncmp (argv [i], "-L", 2))
209: {
210: char *nbuff, *sdbuff;
211: int j, new_len, search_dirs_len;
212:
213: new_len = strlen (&argv[i][2]);
214: search_dirs_len = strlen (search_dirs);
215:
216: nbuff = malloc (new_len + 1);
217: strcpy (nbuff, &argv[i][2]);
218:
219: for (j = 0; j < new_len; j++)
220: if (nbuff[j] == '/') nbuff[j] = DIR_SEPARATOR;
221:
222: sdbuff = malloc (search_dirs_len + new_len + 2);
223: strcpy (sdbuff, search_dirs);
224: sdbuff[search_dirs_len] = PATH_SEPARATOR;
225: sdbuff[search_dirs_len+1] = 0;
226: strcat (sdbuff, nbuff);
227:
228: if (search_dirs)
229: free (search_dirs);
230:
231: search_dirs = sdbuff;
232: }
233:
234: else if (arg_len > 2 && !strncmp (argv [i], "-l", 2))
235: addarg (expand_lib (&argv[i][2]));
236: else if (!strcmp (argv [i], "-v"))
237: ;
238: else
239: addarg (argv [i]);
240: }
241:
242: addarg (NULL);
243:
244: if (verbose)
245: {
246: int i;
247:
248: for (i = 0; i < link_arg_index; i++)
249: printf ("%s ", link_args [i]);
250: putchar ('\n');
251: }
252:
253: if (spawnvp (P_WAIT, linker_path, (const char * const *)link_args) != 0)
254: {
255: fprintf (stderr, "Error executing %s\n", link_args[0]);
256: exit (1);
257: }
258:
259: exit (0);
260: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.