1 /****************************************************************************
3 * GNAT COMPILER TOOLS *
7 * C Implementation File *
11 * Copyright (C) 1992-2001 Free Software Foundation, Inc. *
13 * GNAT is free software; you can redistribute it and/or modify it under *
14 * terms of the GNU General Public License as published by the Free Soft- *
15 * ware Foundation; either version 2, or (at your option) any later ver- *
16 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
17 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
18 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
19 * for more details. You should have received a copy of the GNU General *
20 * Public License distributed with GNAT; see file COPYING. If not, write *
21 * to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, *
22 * MA 02111-1307, USA. *
24 * GNAT was originally developed by the GNAT team at New York University. *
25 * It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). *
27 ****************************************************************************/
32 #if defined (__EMX__) || defined (MSDOS)
41 #define exit __posix_exit
44 /* These can be set by command line arguments */
45 char *binder_path
= 0;
46 char *linker_path
= 0;
47 char *exec_file_name
= 0;
48 char *ali_file_name
= 0;
49 #define BIND_ARG_MAX 512
50 char *bind_args
[BIND_ARG_MAX
];
51 int bind_arg_index
= -1;
53 char *coff2exe_path
= 0;
54 char *coff2exe_args
[] = {(char *) 0, (char *) 0};
55 char *del_command
= 0;
61 int link_arg_max
= -1;
62 char **link_args
= (char **) 0;
63 int link_arg_index
= -1;
69 #define DIR_SEPARATOR '\\'
71 #define DIR_SEPARATOR '/'
75 static int linkonly
= 0;
77 static void addarg
PARAMS ((char *));
78 static void process_args
PARAMS ((int *, char *[]));
86 if (++link_arg_index
>= link_arg_max
)
89 = (char **) xcalloc (link_arg_max
+ 1000, sizeof (char *));
91 for (i
= 0; i
<= link_arg_max
; i
++)
92 new_link_args
[i
] = link_args
[i
];
98 link_args
= new_link_args
;
101 link_args
[link_arg_index
] = str
;
105 process_args (p_argc
, argv
)
111 for (i
= 1; i
< *p_argc
; i
++)
113 /* -I is passed on to gnatbind */
114 if (! strncmp( argv
[i
], "-I", 2))
117 if (bind_arg_index
>= BIND_ARG_MAX
)
119 fprintf (stderr
, "Too many arguments to gnatbind\n");
123 bind_args
[bind_arg_index
] = argv
[i
];
126 /* -B is passed on to gcc */
127 if (! strncmp (argv
[i
], "-B", 2))
130 /* -v turns on verbose option here and is passed on to gcc */
132 if (! strcmp (argv
[i
], "-v"))
135 if (! strcmp (argv
[i
], "-o"))
138 exec_file_name
= argv
[i
+ 1];
141 if (! strcmp (argv
[i
], "-g"))
144 if (! strcmp (argv
[i
], "-gnatbind"))
146 /* Explicit naming of binder. Grab the value then remove the
147 two arguments from the argument list. */
148 if ( i
+ 1 >= *p_argc
)
150 fprintf (stderr
, "Missing argument for -gnatbind\n");
154 binder_path
= __gnat_locate_exec (argv
[i
+ 1], (char *) ".");
157 fprintf (stderr
, "Could not locate binder: %s\n", argv
[i
+ 1]);
161 for (j
= i
+ 2; j
< *p_argc
; j
++)
162 argv
[j
- 2] = argv
[j
];
168 else if (! strcmp (argv
[i
], "-linkonly"))
170 /* Don't call the binder. Set the flag and then remove the
171 argument from the argument list. */
173 for (j
= i
+ 1; j
< *p_argc
; j
++)
174 argv
[j
- 1] = argv
[j
];
180 else if (! strcmp (argv
[i
], "-gnatlink"))
182 /* Explicit naming of binder. Grab the value then remove the
183 two arguments from the argument list. */
184 if (i
+ 1 >= *p_argc
)
186 fprintf (stderr
, "Missing argument for -gnatlink\n");
190 linker_path
= __gnat_locate_exec (argv
[i
+ 1], (char *) ".");
193 fprintf (stderr
, "Could not locate linker: %s\n", argv
[i
+ 1]);
197 for (j
= i
+ 2; j
< *p_argc
; j
++)
198 argv
[j
- 2] = argv
[j
];
204 extern int main
PARAMS ((int, char **));
215 /* Warning: getenv only retrieves the first directory in VAXC$PATH */
217 strdup (__gnat_to_canonical_dir_spec (getenv ("VAXC$PATH"), 0));
219 char *pathval
= getenv ("PATH");
221 char *spawn_args
[5];
224 #if defined (__EMX__) || defined(MSDOS)
225 char *tmppathval
= malloc (strlen (pathval
) + 3);
226 strcpy (tmppathval
, ".;");
227 pathval
= strcat (tmppathval
, pathval
);
230 process_args (&argc
, argv
);
236 "Usage: %s 'name'.ali\n", argv
[0]);
239 " [-o exec_name] -- by default it is 'name'\n");
242 " [-v] -- verbose mode\n");
245 " [-linkonly] -- doesn't call binder\n");
248 " [-gnatbind name] -- full name for gnatbind\n");
251 " [-gnatlink name] -- full name for linker (gcc)\n");
254 " [list of objects] -- non Ada binaries\n");
257 " [linker options] -- other options for linker\n");
261 if (!binder_path
&& !linkonly
)
262 binder_path
= __gnat_locate_exec ((char *) "gnatbind", pathval
);
264 if (!binder_path
&& !linkonly
)
266 fprintf (stderr
, "Couldn't locate gnatbind\n");
271 linker_path
= __gnat_locate_exec ((char *) "gnatlink", pathval
);
274 fprintf (stderr
, "Couldn't locate gnatlink\n");
279 coff2exe_path
= __gnat_locate_regular_file ("coff2exe.bat", pathval
);
282 fprintf (stderr
, "Couldn't locate %s\n", "coff2exe.bat");
286 coff2exe_args
[0] = coff2exe_path
;
289 addarg (linker_path
);
291 for (i
= 1; i
< argc
; i
++)
293 int arg_len
= strlen (argv
[i
]);
295 if (arg_len
> 4 && ! strcmp (&argv
[i
][arg_len
- 4], ".ali"))
300 "Sorry - cannot handle more than one ALI file\n");
306 if (__gnat_is_regular_file (argv
[i
]))
308 ali_file_name
= argv
[i
];
313 spawn_args
[spawn_index
++] = binder_path
;
314 spawn_args
[spawn_index
++] = ali_file_name
;
315 for (j
= 0 ; j
<= bind_arg_index
; j
++ )
316 spawn_args
[spawn_index
++] = bind_args
[j
];
317 spawn_args
[spawn_index
] = 0;
322 for (i
= 0; i
< 2; i
++)
323 printf ("%s ", spawn_args
[i
]);
328 retcode
= __gnat_portable_spawn (spawn_args
);
337 else if (!strcmp (argv
[i
], "-o"))
344 char *ptr
= strstr (argv
[i
], ".exe");
346 arg_len
= strlen (argv
[i
]);
347 coff2exe_args
[1] = malloc (arg_len
+ 1);
348 strcpy (coff2exe_args
[1], argv
[i
]);
349 if (ptr
!= NULL
&& strlen (ptr
) == 4)
350 coff2exe_args
[1][arg_len
-4] = 0;
352 addarg (coff2exe_args
[1]);
362 fprintf (stderr
, "No \".ali\" file specified\n");
366 addarg (ali_file_name
);
373 for (i
= 0; i
< link_arg_index
; i
++)
374 printf ("%s ", link_args
[i
]);
379 retcode
= __gnat_portable_spawn (link_args
);
384 retcode
= __gnat_portable_spawn (coff2exe_args
);
390 del_command
= malloc (strlen (coff2exe_args
[1]) + 5);
391 sprintf (del_command
, "del %s", coff2exe_args
[1]);
392 retcode
= system (del_command
);