annotate gcc/ada/gnatcmd.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- G N A T C M D --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1996-2017, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Gnatvsn;
kono
parents:
diff changeset
27 with Namet; use Namet;
kono
parents:
diff changeset
28 with Opt; use Opt;
kono
parents:
diff changeset
29 with Osint; use Osint;
kono
parents:
diff changeset
30 with Output; use Output;
kono
parents:
diff changeset
31 with Switch; use Switch;
kono
parents:
diff changeset
32 with Table;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with Ada.Characters.Handling; use Ada.Characters.Handling;
kono
parents:
diff changeset
35 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
36 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 procedure GNATCmd is
kono
parents:
diff changeset
41 Gprbuild : constant String := "gprbuild";
kono
parents:
diff changeset
42 Gprclean : constant String := "gprclean";
kono
parents:
diff changeset
43 Gprname : constant String := "gprname";
kono
parents:
diff changeset
44 Gprls : constant String := "gprls";
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 Error_Exit : exception;
kono
parents:
diff changeset
47 -- Raise this exception if error detected
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 type Command_Type is
kono
parents:
diff changeset
50 (Bind,
kono
parents:
diff changeset
51 Chop,
kono
parents:
diff changeset
52 Clean,
kono
parents:
diff changeset
53 Compile,
kono
parents:
diff changeset
54 Check,
kono
parents:
diff changeset
55 Elim,
kono
parents:
diff changeset
56 Find,
kono
parents:
diff changeset
57 Krunch,
kono
parents:
diff changeset
58 Link,
kono
parents:
diff changeset
59 List,
kono
parents:
diff changeset
60 Make,
kono
parents:
diff changeset
61 Metric,
kono
parents:
diff changeset
62 Name,
kono
parents:
diff changeset
63 Preprocess,
kono
parents:
diff changeset
64 Pretty,
kono
parents:
diff changeset
65 Stack,
kono
parents:
diff changeset
66 Stub,
kono
parents:
diff changeset
67 Test,
kono
parents:
diff changeset
68 Xref,
kono
parents:
diff changeset
69 Undefined);
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 subtype Real_Command_Type is Command_Type range Bind .. Xref;
kono
parents:
diff changeset
72 -- All real command types (excludes only Undefined).
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 type Alternate_Command is (Comp, Ls, Kr, Pp, Prep);
kono
parents:
diff changeset
75 -- Alternate command label
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 Corresponding_To : constant array (Alternate_Command) of Command_Type :=
kono
parents:
diff changeset
78 (Comp => Compile,
kono
parents:
diff changeset
79 Ls => List,
kono
parents:
diff changeset
80 Kr => Krunch,
kono
parents:
diff changeset
81 Prep => Preprocess,
kono
parents:
diff changeset
82 Pp => Pretty);
kono
parents:
diff changeset
83 -- Mapping of alternate commands to commands
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 package First_Switches is new Table.Table
kono
parents:
diff changeset
86 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
87 Table_Index_Type => Integer,
kono
parents:
diff changeset
88 Table_Low_Bound => 1,
kono
parents:
diff changeset
89 Table_Initial => 20,
kono
parents:
diff changeset
90 Table_Increment => 100,
kono
parents:
diff changeset
91 Table_Name => "Gnatcmd.First_Switches");
kono
parents:
diff changeset
92 -- A table to keep the switches from the project file
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 package Last_Switches is new Table.Table
kono
parents:
diff changeset
95 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
96 Table_Index_Type => Integer,
kono
parents:
diff changeset
97 Table_Low_Bound => 1,
kono
parents:
diff changeset
98 Table_Initial => 20,
kono
parents:
diff changeset
99 Table_Increment => 100,
kono
parents:
diff changeset
100 Table_Name => "Gnatcmd.Last_Switches");
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 ----------------------------------
kono
parents:
diff changeset
103 -- Declarations for GNATCMD use --
kono
parents:
diff changeset
104 ----------------------------------
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 The_Command : Command_Type;
kono
parents:
diff changeset
107 -- The command specified in the invocation of the GNAT driver
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 Command_Arg : Positive := 1;
kono
parents:
diff changeset
110 -- The index of the command in the arguments of the GNAT driver
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 My_Exit_Status : Exit_Status := Success;
kono
parents:
diff changeset
113 -- The exit status of the spawned tool
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 type Command_Entry is record
kono
parents:
diff changeset
116 Cname : String_Access;
kono
parents:
diff changeset
117 -- Command name for GNAT xxx command
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 Unixcmd : String_Access;
kono
parents:
diff changeset
120 -- Corresponding Unix command
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 Unixsws : Argument_List_Access;
kono
parents:
diff changeset
123 -- List of switches to be used with the Unix command
kono
parents:
diff changeset
124 end record;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 Command_List : constant array (Real_Command_Type) of Command_Entry :=
kono
parents:
diff changeset
127 (Bind =>
kono
parents:
diff changeset
128 (Cname => new String'("BIND"),
kono
parents:
diff changeset
129 Unixcmd => new String'("gnatbind"),
kono
parents:
diff changeset
130 Unixsws => null),
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 Chop =>
kono
parents:
diff changeset
133 (Cname => new String'("CHOP"),
kono
parents:
diff changeset
134 Unixcmd => new String'("gnatchop"),
kono
parents:
diff changeset
135 Unixsws => null),
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 Clean =>
kono
parents:
diff changeset
138 (Cname => new String'("CLEAN"),
kono
parents:
diff changeset
139 Unixcmd => new String'("gnatclean"),
kono
parents:
diff changeset
140 Unixsws => null),
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 Compile =>
kono
parents:
diff changeset
143 (Cname => new String'("COMPILE"),
kono
parents:
diff changeset
144 Unixcmd => new String'("gnatmake"),
kono
parents:
diff changeset
145 Unixsws => new Argument_List'(1 => new String'("-f"),
kono
parents:
diff changeset
146 2 => new String'("-u"),
kono
parents:
diff changeset
147 3 => new String'("-c"))),
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 Check =>
kono
parents:
diff changeset
150 (Cname => new String'("CHECK"),
kono
parents:
diff changeset
151 Unixcmd => new String'("gnatcheck"),
kono
parents:
diff changeset
152 Unixsws => null),
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 Elim =>
kono
parents:
diff changeset
155 (Cname => new String'("ELIM"),
kono
parents:
diff changeset
156 Unixcmd => new String'("gnatelim"),
kono
parents:
diff changeset
157 Unixsws => null),
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 Find =>
kono
parents:
diff changeset
160 (Cname => new String'("FIND"),
kono
parents:
diff changeset
161 Unixcmd => new String'("gnatfind"),
kono
parents:
diff changeset
162 Unixsws => null),
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 Krunch =>
kono
parents:
diff changeset
165 (Cname => new String'("KRUNCH"),
kono
parents:
diff changeset
166 Unixcmd => new String'("gnatkr"),
kono
parents:
diff changeset
167 Unixsws => null),
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 Link =>
kono
parents:
diff changeset
170 (Cname => new String'("LINK"),
kono
parents:
diff changeset
171 Unixcmd => new String'("gnatlink"),
kono
parents:
diff changeset
172 Unixsws => null),
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 List =>
kono
parents:
diff changeset
175 (Cname => new String'("LIST"),
kono
parents:
diff changeset
176 Unixcmd => new String'("gnatls"),
kono
parents:
diff changeset
177 Unixsws => null),
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 Make =>
kono
parents:
diff changeset
180 (Cname => new String'("MAKE"),
kono
parents:
diff changeset
181 Unixcmd => new String'("gnatmake"),
kono
parents:
diff changeset
182 Unixsws => null),
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 Metric =>
kono
parents:
diff changeset
185 (Cname => new String'("METRIC"),
kono
parents:
diff changeset
186 Unixcmd => new String'("gnatmetric"),
kono
parents:
diff changeset
187 Unixsws => null),
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 Name =>
kono
parents:
diff changeset
190 (Cname => new String'("NAME"),
kono
parents:
diff changeset
191 Unixcmd => new String'("gnatname"),
kono
parents:
diff changeset
192 Unixsws => null),
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 Preprocess =>
kono
parents:
diff changeset
195 (Cname => new String'("PREPROCESS"),
kono
parents:
diff changeset
196 Unixcmd => new String'("gnatprep"),
kono
parents:
diff changeset
197 Unixsws => null),
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 Pretty =>
kono
parents:
diff changeset
200 (Cname => new String'("PRETTY"),
kono
parents:
diff changeset
201 Unixcmd => new String'("gnatpp"),
kono
parents:
diff changeset
202 Unixsws => null),
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 Stack =>
kono
parents:
diff changeset
205 (Cname => new String'("STACK"),
kono
parents:
diff changeset
206 Unixcmd => new String'("gnatstack"),
kono
parents:
diff changeset
207 Unixsws => null),
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 Stub =>
kono
parents:
diff changeset
210 (Cname => new String'("STUB"),
kono
parents:
diff changeset
211 Unixcmd => new String'("gnatstub"),
kono
parents:
diff changeset
212 Unixsws => null),
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 Test =>
kono
parents:
diff changeset
215 (Cname => new String'("TEST"),
kono
parents:
diff changeset
216 Unixcmd => new String'("gnattest"),
kono
parents:
diff changeset
217 Unixsws => null),
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 Xref =>
kono
parents:
diff changeset
220 (Cname => new String'("XREF"),
kono
parents:
diff changeset
221 Unixcmd => new String'("gnatxref"),
kono
parents:
diff changeset
222 Unixsws => null)
kono
parents:
diff changeset
223 );
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 -----------------------
kono
parents:
diff changeset
226 -- Local Subprograms --
kono
parents:
diff changeset
227 -----------------------
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 procedure Output_Version;
kono
parents:
diff changeset
230 -- Output the version of this program
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 procedure Usage;
kono
parents:
diff changeset
233 -- Display usage
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 --------------------
kono
parents:
diff changeset
236 -- Output_Version --
kono
parents:
diff changeset
237 --------------------
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 procedure Output_Version is
kono
parents:
diff changeset
240 begin
kono
parents:
diff changeset
241 Put ("GNAT ");
kono
parents:
diff changeset
242 Put_Line (Gnatvsn.Gnat_Version_String);
kono
parents:
diff changeset
243 Put_Line ("Copyright 1996-" & Gnatvsn.Current_Year
kono
parents:
diff changeset
244 & ", Free Software Foundation, Inc.");
kono
parents:
diff changeset
245 end Output_Version;
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 -----------
kono
parents:
diff changeset
248 -- Usage --
kono
parents:
diff changeset
249 -----------
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 procedure Usage is
kono
parents:
diff changeset
252 begin
kono
parents:
diff changeset
253 Output_Version;
kono
parents:
diff changeset
254 New_Line;
kono
parents:
diff changeset
255 Put_Line ("List of available commands");
kono
parents:
diff changeset
256 New_Line;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 for C in Command_List'Range loop
kono
parents:
diff changeset
259 Put ("gnat ");
kono
parents:
diff changeset
260 Put (To_Lower (Command_List (C).Cname.all));
kono
parents:
diff changeset
261 Set_Col (25);
kono
parents:
diff changeset
262 Put (Program_Name (Command_List (C).Unixcmd.all, "gnat").all);
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 declare
kono
parents:
diff changeset
265 Sws : Argument_List_Access renames Command_List (C).Unixsws;
kono
parents:
diff changeset
266 begin
kono
parents:
diff changeset
267 if Sws /= null then
kono
parents:
diff changeset
268 for J in Sws'Range loop
kono
parents:
diff changeset
269 Put (' ');
kono
parents:
diff changeset
270 Put (Sws (J).all);
kono
parents:
diff changeset
271 end loop;
kono
parents:
diff changeset
272 end if;
kono
parents:
diff changeset
273 end;
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 New_Line;
kono
parents:
diff changeset
276 end loop;
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 New_Line;
kono
parents:
diff changeset
279 end Usage;
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 -- Start of processing for GNATCmd
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 begin
kono
parents:
diff changeset
286 -- All output from GNATCmd is debugging or error output: send to stderr
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 Set_Standard_Error;
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 -- Initializations
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 Last_Switches.Init;
kono
parents:
diff changeset
293 Last_Switches.Set_Last (0);
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 First_Switches.Init;
kono
parents:
diff changeset
296 First_Switches.Set_Last (0);
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 -- Put the command line in environment variable GNAT_DRIVER_COMMAND_LINE,
kono
parents:
diff changeset
299 -- so that the spawned tool may know the way the GNAT driver was invoked.
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 Name_Len := 0;
kono
parents:
diff changeset
302 Add_Str_To_Name_Buffer (Command_Name);
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 for J in 1 .. Argument_Count loop
kono
parents:
diff changeset
305 Add_Char_To_Name_Buffer (' ');
kono
parents:
diff changeset
306 Add_Str_To_Name_Buffer (Argument (J));
kono
parents:
diff changeset
307 end loop;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 Setenv ("GNAT_DRIVER_COMMAND_LINE", Name_Buffer (1 .. Name_Len));
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 -- Add the directory where the GNAT driver is invoked in front of the path,
kono
parents:
diff changeset
312 -- if the GNAT driver is invoked with directory information.
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 declare
kono
parents:
diff changeset
315 Command : constant String := Command_Name;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 begin
kono
parents:
diff changeset
318 for Index in reverse Command'Range loop
kono
parents:
diff changeset
319 if Command (Index) = Directory_Separator then
kono
parents:
diff changeset
320 declare
kono
parents:
diff changeset
321 Absolute_Dir : constant String :=
kono
parents:
diff changeset
322 Normalize_Pathname (Command (Command'First .. Index));
kono
parents:
diff changeset
323 PATH : constant String :=
kono
parents:
diff changeset
324 Absolute_Dir & Path_Separator & Getenv ("PATH").all;
kono
parents:
diff changeset
325 begin
kono
parents:
diff changeset
326 Setenv ("PATH", PATH);
kono
parents:
diff changeset
327 end;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 exit;
kono
parents:
diff changeset
330 end if;
kono
parents:
diff changeset
331 end loop;
kono
parents:
diff changeset
332 end;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 -- Scan the command line
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 -- First, scan to detect --version and/or --help
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 Check_Version_And_Help ("GNAT", "1996");
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 begin
kono
parents:
diff changeset
341 loop
kono
parents:
diff changeset
342 if Command_Arg <= Argument_Count
kono
parents:
diff changeset
343 and then Argument (Command_Arg) = "-v"
kono
parents:
diff changeset
344 then
kono
parents:
diff changeset
345 Verbose_Mode := True;
kono
parents:
diff changeset
346 Command_Arg := Command_Arg + 1;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 elsif Command_Arg <= Argument_Count
kono
parents:
diff changeset
349 and then Argument (Command_Arg) = "-dn"
kono
parents:
diff changeset
350 then
kono
parents:
diff changeset
351 Keep_Temporary_Files := True;
kono
parents:
diff changeset
352 Command_Arg := Command_Arg + 1;
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 else
kono
parents:
diff changeset
355 exit;
kono
parents:
diff changeset
356 end if;
kono
parents:
diff changeset
357 end loop;
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 -- If there is no command, just output the usage
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 if Command_Arg > Argument_Count then
kono
parents:
diff changeset
362 Usage;
kono
parents:
diff changeset
363 return;
kono
parents:
diff changeset
364 end if;
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 The_Command := Real_Command_Type'Value (Argument (Command_Arg));
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 exception
kono
parents:
diff changeset
369 when Constraint_Error =>
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 -- Check if it is an alternate command
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 declare
kono
parents:
diff changeset
374 Alternate : Alternate_Command;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 begin
kono
parents:
diff changeset
377 Alternate := Alternate_Command'Value (Argument (Command_Arg));
kono
parents:
diff changeset
378 The_Command := Corresponding_To (Alternate);
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 exception
kono
parents:
diff changeset
381 when Constraint_Error =>
kono
parents:
diff changeset
382 Usage;
kono
parents:
diff changeset
383 Fail ("unknown command: " & Argument (Command_Arg));
kono
parents:
diff changeset
384 end;
kono
parents:
diff changeset
385 end;
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 -- Get the arguments from the command line and from the eventual
kono
parents:
diff changeset
388 -- argument file(s) specified on the command line.
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 for Arg in Command_Arg + 1 .. Argument_Count loop
kono
parents:
diff changeset
391 declare
kono
parents:
diff changeset
392 The_Arg : constant String := Argument (Arg);
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 begin
kono
parents:
diff changeset
395 -- Check if an argument file is specified
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 if The_Arg'Length > 0 and then The_Arg (The_Arg'First) = '@' then
kono
parents:
diff changeset
398 declare
kono
parents:
diff changeset
399 Arg_File : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
400 Line : String (1 .. 256);
kono
parents:
diff changeset
401 Last : Natural;
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 begin
kono
parents:
diff changeset
404 -- Open the file and fail if the file cannot be found
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 begin
kono
parents:
diff changeset
407 Open (Arg_File, In_File,
kono
parents:
diff changeset
408 The_Arg (The_Arg'First + 1 .. The_Arg'Last));
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 exception
kono
parents:
diff changeset
411 when others =>
kono
parents:
diff changeset
412 Put (Standard_Error, "Cannot open argument file """);
kono
parents:
diff changeset
413 Put (Standard_Error,
kono
parents:
diff changeset
414 The_Arg (The_Arg'First + 1 .. The_Arg'Last));
kono
parents:
diff changeset
415 Put_Line (Standard_Error, """");
kono
parents:
diff changeset
416 raise Error_Exit;
kono
parents:
diff changeset
417 end;
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 -- Read line by line and put the content of each non-
kono
parents:
diff changeset
420 -- empty line in the Last_Switches table.
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 while not End_Of_File (Arg_File) loop
kono
parents:
diff changeset
423 Get_Line (Arg_File, Line, Last);
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 if Last /= 0 then
kono
parents:
diff changeset
426 Last_Switches.Increment_Last;
kono
parents:
diff changeset
427 Last_Switches.Table (Last_Switches.Last) :=
kono
parents:
diff changeset
428 new String'(Line (1 .. Last));
kono
parents:
diff changeset
429 end if;
kono
parents:
diff changeset
430 end loop;
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 Close (Arg_File);
kono
parents:
diff changeset
433 end;
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 elsif The_Arg'Length > 0 then
kono
parents:
diff changeset
436 -- It is not an argument file; just put the argument in
kono
parents:
diff changeset
437 -- the Last_Switches table.
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 Last_Switches.Increment_Last;
kono
parents:
diff changeset
440 Last_Switches.Table (Last_Switches.Last) := new String'(The_Arg);
kono
parents:
diff changeset
441 end if;
kono
parents:
diff changeset
442 end;
kono
parents:
diff changeset
443 end loop;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 declare
kono
parents:
diff changeset
446 Program : String_Access;
kono
parents:
diff changeset
447 Exec_Path : String_Access;
kono
parents:
diff changeset
448 Get_Target : Boolean := False;
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 begin
kono
parents:
diff changeset
451 if The_Command = Stack then
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 -- Never call gnatstack with a prefix
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 Program := new String'(Command_List (The_Command).Unixcmd.all);
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 else
kono
parents:
diff changeset
458 Program :=
kono
parents:
diff changeset
459 Program_Name (Command_List (The_Command).Unixcmd.all, "gnat");
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 -- If we want to invoke gnatmake/gnatclean with -P, then check if
kono
parents:
diff changeset
462 -- gprbuild/gprclean is available; if it is, use gprbuild/gprclean
kono
parents:
diff changeset
463 -- instead of gnatmake/gnatclean.
kono
parents:
diff changeset
464 -- Ditto for gnatname -> gprname and gnatls -> gprls.
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 if The_Command = Make
kono
parents:
diff changeset
467 or else The_Command = Compile
kono
parents:
diff changeset
468 or else The_Command = Bind
kono
parents:
diff changeset
469 or else The_Command = Link
kono
parents:
diff changeset
470 or else The_Command = Clean
kono
parents:
diff changeset
471 or else The_Command = Name
kono
parents:
diff changeset
472 or else The_Command = List
kono
parents:
diff changeset
473 then
kono
parents:
diff changeset
474 declare
kono
parents:
diff changeset
475 Switch : String_Access;
kono
parents:
diff changeset
476 Call_GPR_Tool : Boolean := False;
kono
parents:
diff changeset
477 begin
kono
parents:
diff changeset
478 for J in 1 .. Last_Switches.Last loop
kono
parents:
diff changeset
479 Switch := Last_Switches.Table (J);
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 if Switch'Length >= 2
kono
parents:
diff changeset
482 and then Switch (Switch'First .. Switch'First + 1) = "-P"
kono
parents:
diff changeset
483 then
kono
parents:
diff changeset
484 Call_GPR_Tool := True;
kono
parents:
diff changeset
485 exit;
kono
parents:
diff changeset
486 end if;
kono
parents:
diff changeset
487 end loop;
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 if Call_GPR_Tool then
kono
parents:
diff changeset
490 case The_Command is
kono
parents:
diff changeset
491 when Bind
kono
parents:
diff changeset
492 | Compile
kono
parents:
diff changeset
493 | Link
kono
parents:
diff changeset
494 | Make
kono
parents:
diff changeset
495 =>
kono
parents:
diff changeset
496 if Locate_Exec_On_Path (Gprbuild) /= null then
kono
parents:
diff changeset
497 Program := new String'(Gprbuild);
kono
parents:
diff changeset
498 Get_Target := True;
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 if The_Command = Bind then
kono
parents:
diff changeset
501 First_Switches.Append (new String'("-b"));
kono
parents:
diff changeset
502 elsif The_Command = Link then
kono
parents:
diff changeset
503 First_Switches.Append (new String'("-l"));
kono
parents:
diff changeset
504 end if;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 elsif The_Command = Bind then
kono
parents:
diff changeset
507 Fail
kono
parents:
diff changeset
508 ("'gnat bind -P' is no longer supported;" &
kono
parents:
diff changeset
509 " use 'gprbuild -b' instead.");
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 elsif The_Command = Link then
kono
parents:
diff changeset
512 Fail
kono
parents:
diff changeset
513 ("'gnat Link -P' is no longer supported;" &
kono
parents:
diff changeset
514 " use 'gprbuild -l' instead.");
kono
parents:
diff changeset
515 end if;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 when Clean =>
kono
parents:
diff changeset
518 if Locate_Exec_On_Path (Gprclean) /= null then
kono
parents:
diff changeset
519 Program := new String'(Gprclean);
kono
parents:
diff changeset
520 Get_Target := True;
kono
parents:
diff changeset
521 end if;
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 when Name =>
kono
parents:
diff changeset
524 if Locate_Exec_On_Path (Gprname) /= null then
kono
parents:
diff changeset
525 Program := new String'(Gprname);
kono
parents:
diff changeset
526 Get_Target := True;
kono
parents:
diff changeset
527 end if;
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 when List =>
kono
parents:
diff changeset
530 if Locate_Exec_On_Path (Gprls) /= null then
kono
parents:
diff changeset
531 Program := new String'(Gprls);
kono
parents:
diff changeset
532 Get_Target := True;
kono
parents:
diff changeset
533 end if;
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535 when others =>
kono
parents:
diff changeset
536 null;
kono
parents:
diff changeset
537 end case;
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 if Get_Target then
kono
parents:
diff changeset
540 Find_Program_Name;
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 if Name_Len > 5 then
kono
parents:
diff changeset
543 First_Switches.Append
kono
parents:
diff changeset
544 (new String'
kono
parents:
diff changeset
545 ("--target=" & Name_Buffer (1 .. Name_Len - 5)));
kono
parents:
diff changeset
546 end if;
kono
parents:
diff changeset
547 end if;
kono
parents:
diff changeset
548 end if;
kono
parents:
diff changeset
549 end;
kono
parents:
diff changeset
550 end if;
kono
parents:
diff changeset
551 end if;
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 -- Locate the executable for the command
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 Exec_Path := Locate_Exec_On_Path (Program.all);
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 if Exec_Path = null then
kono
parents:
diff changeset
558 Put_Line (Standard_Error, "could not locate " & Program.all);
kono
parents:
diff changeset
559 raise Error_Exit;
kono
parents:
diff changeset
560 end if;
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 -- If there are switches for the executable, put them as first switches
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 if Command_List (The_Command).Unixsws /= null then
kono
parents:
diff changeset
565 for J in Command_List (The_Command).Unixsws'Range loop
kono
parents:
diff changeset
566 First_Switches.Increment_Last;
kono
parents:
diff changeset
567 First_Switches.Table (First_Switches.Last) :=
kono
parents:
diff changeset
568 Command_List (The_Command).Unixsws (J);
kono
parents:
diff changeset
569 end loop;
kono
parents:
diff changeset
570 end if;
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 -- For FIND and XREF, look for switch -P. If it is specified, then
kono
parents:
diff changeset
573 -- report an error indicating that the command is no longer supporting
kono
parents:
diff changeset
574 -- project files.
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 if The_Command = Find or else The_Command = Xref then
kono
parents:
diff changeset
577 declare
kono
parents:
diff changeset
578 Argv : String_Access;
kono
parents:
diff changeset
579 begin
kono
parents:
diff changeset
580 for Arg_Num in 1 .. Last_Switches.Last loop
kono
parents:
diff changeset
581 Argv := Last_Switches.Table (Arg_Num);
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 if Argv'Length >= 2 and then
kono
parents:
diff changeset
584 Argv (Argv'First .. Argv'First + 1) = "-P"
kono
parents:
diff changeset
585 then
kono
parents:
diff changeset
586 if The_Command = Find then
kono
parents:
diff changeset
587 Fail ("'gnat find -P' is no longer supported;");
kono
parents:
diff changeset
588 else
kono
parents:
diff changeset
589 Fail ("'gnat xref -P' is no longer supported;");
kono
parents:
diff changeset
590 end if;
kono
parents:
diff changeset
591 end if;
kono
parents:
diff changeset
592 end loop;
kono
parents:
diff changeset
593 end;
kono
parents:
diff changeset
594 end if;
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 -- Gather all the arguments and invoke the executable
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 declare
kono
parents:
diff changeset
599 The_Args : Argument_List
kono
parents:
diff changeset
600 (1 .. First_Switches.Last + Last_Switches.Last);
kono
parents:
diff changeset
601 Arg_Num : Natural := 0;
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 begin
kono
parents:
diff changeset
604 for J in 1 .. First_Switches.Last loop
kono
parents:
diff changeset
605 Arg_Num := Arg_Num + 1;
kono
parents:
diff changeset
606 The_Args (Arg_Num) := First_Switches.Table (J);
kono
parents:
diff changeset
607 end loop;
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 for J in 1 .. Last_Switches.Last loop
kono
parents:
diff changeset
610 Arg_Num := Arg_Num + 1;
kono
parents:
diff changeset
611 The_Args (Arg_Num) := Last_Switches.Table (J);
kono
parents:
diff changeset
612 end loop;
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 if Verbose_Mode then
kono
parents:
diff changeset
615 Put (Exec_Path.all);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 for Arg in The_Args'Range loop
kono
parents:
diff changeset
618 Put (" " & The_Args (Arg).all);
kono
parents:
diff changeset
619 end loop;
kono
parents:
diff changeset
620
kono
parents:
diff changeset
621 New_Line;
kono
parents:
diff changeset
622 end if;
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 My_Exit_Status := Exit_Status (Spawn (Exec_Path.all, The_Args));
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 Set_Exit_Status (My_Exit_Status);
kono
parents:
diff changeset
627 end;
kono
parents:
diff changeset
628 end;
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 exception
kono
parents:
diff changeset
631 when Error_Exit =>
kono
parents:
diff changeset
632 Set_Exit_Status (Failure);
kono
parents:
diff changeset
633 end GNATCmd;