annotate gcc/ada/gnatname.adb @ 138:fc828634a951

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:17:14 +0900
parents 84e7813d76e9
children 1830386684a0
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 N A M E --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2001-2018, Free Software Foundation, Inc. --
111
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 Ada.Characters.Handling; use Ada.Characters.Handling;
kono
parents:
diff changeset
27 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
28 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 with GNAT.Command_Line; use GNAT.Command_Line;
kono
parents:
diff changeset
31 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
32 with GNAT.Dynamic_Tables;
kono
parents:
diff changeset
33 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 with Make_Util; use Make_Util;
kono
parents:
diff changeset
36 with Namet; use Namet;
kono
parents:
diff changeset
37 with Opt;
kono
parents:
diff changeset
38 with Osint; use Osint;
kono
parents:
diff changeset
39 with Output;
kono
parents:
diff changeset
40 with Switch; use Switch;
kono
parents:
diff changeset
41 with Table;
kono
parents:
diff changeset
42 with Tempdir;
kono
parents:
diff changeset
43 with Types; use Types;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 with System.CRTL;
kono
parents:
diff changeset
46 with System.Regexp; use System.Regexp;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 procedure Gnatname is
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 pragma Warnings (Off);
kono
parents:
diff changeset
51 type Matched_Type is (True, False, Excluded);
kono
parents:
diff changeset
52 pragma Warnings (On);
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 Create_Project : Boolean := False;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 Subdirs_Switch : constant String := "--subdirs=";
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Usage_Output : Boolean := False;
kono
parents:
diff changeset
59 -- Set to True when usage is output, to avoid multiple output
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 Usage_Needed : Boolean := False;
kono
parents:
diff changeset
62 -- Set to True by -h switch
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Version_Output : Boolean := False;
kono
parents:
diff changeset
65 -- Set to True when version is output, to avoid multiple output
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 Very_Verbose : Boolean := False;
kono
parents:
diff changeset
68 -- Set to True with -v -v
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 File_Path : String_Access := new String'("gnat.adc");
kono
parents:
diff changeset
71 -- Path name of the file specified by -c or -P switch
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 File_Set : Boolean := False;
kono
parents:
diff changeset
74 -- Set to True by -c or -P switch.
kono
parents:
diff changeset
75 -- Used to detect multiple -c/-P switches.
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 Args : Argument_List_Access;
kono
parents:
diff changeset
78 -- The list of arguments for calls to the compiler to get the unit names
kono
parents:
diff changeset
79 -- and kinds (spec or body) in the Ada sources.
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 Path_Name : String_Access;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 Path_Last : Natural;
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 Directory_Last : Natural := 0;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 function Dup (Fd : File_Descriptor) return File_Descriptor;
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 procedure Dup2 (Old_Fd, New_Fd : File_Descriptor);
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 Gcc : constant String := "gcc";
kono
parents:
diff changeset
92 Gcc_Path : String_Access := null;
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 package Patterns is new GNAT.Dynamic_Tables
kono
parents:
diff changeset
95 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
96 Table_Index_Type => Natural,
kono
parents:
diff changeset
97 Table_Low_Bound => 0,
kono
parents:
diff changeset
98 Table_Initial => 10,
kono
parents:
diff changeset
99 Table_Increment => 100);
kono
parents:
diff changeset
100 -- Table to accumulate the patterns
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 type Argument_Data is record
kono
parents:
diff changeset
103 Directories : Patterns.Instance;
kono
parents:
diff changeset
104 Name_Patterns : Patterns.Instance;
kono
parents:
diff changeset
105 Excluded_Patterns : Patterns.Instance;
kono
parents:
diff changeset
106 Foreign_Patterns : Patterns.Instance;
kono
parents:
diff changeset
107 end record;
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 package Arguments is new Table.Table
kono
parents:
diff changeset
110 (Table_Component_Type => Argument_Data,
kono
parents:
diff changeset
111 Table_Index_Type => Natural,
kono
parents:
diff changeset
112 Table_Low_Bound => 0,
kono
parents:
diff changeset
113 Table_Initial => 10,
kono
parents:
diff changeset
114 Table_Increment => 100,
kono
parents:
diff changeset
115 Table_Name => "Gnatname.Arguments");
kono
parents:
diff changeset
116 -- Table to accumulate directories and patterns
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 package Preprocessor_Switches is new Table.Table
kono
parents:
diff changeset
119 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
120 Table_Index_Type => Natural,
kono
parents:
diff changeset
121 Table_Low_Bound => 0,
kono
parents:
diff changeset
122 Table_Initial => 10,
kono
parents:
diff changeset
123 Table_Increment => 100,
kono
parents:
diff changeset
124 Table_Name => "Gnatname.Preprocessor_Switches");
kono
parents:
diff changeset
125 -- Table to store the preprocessor switches to be used in the call
kono
parents:
diff changeset
126 -- to the compiler.
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 type Source is record
kono
parents:
diff changeset
129 File_Name : Name_Id;
kono
parents:
diff changeset
130 Unit_Name : Name_Id;
kono
parents:
diff changeset
131 Index : Int := 0;
kono
parents:
diff changeset
132 Spec : Boolean;
kono
parents:
diff changeset
133 end record;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 package Processed_Directories is new Table.Table
kono
parents:
diff changeset
136 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
137 Table_Index_Type => Natural,
kono
parents:
diff changeset
138 Table_Low_Bound => 0,
kono
parents:
diff changeset
139 Table_Initial => 10,
kono
parents:
diff changeset
140 Table_Increment => 100,
kono
parents:
diff changeset
141 Table_Name => "Prj.Makr.Processed_Directories");
kono
parents:
diff changeset
142 -- The list of already processed directories for each section, to avoid
kono
parents:
diff changeset
143 -- processing several times the same directory in the same section.
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 package Sources is new Table.Table
kono
parents:
diff changeset
146 (Table_Component_Type => Source,
kono
parents:
diff changeset
147 Table_Index_Type => Natural,
kono
parents:
diff changeset
148 Table_Low_Bound => 0,
kono
parents:
diff changeset
149 Table_Initial => 10,
kono
parents:
diff changeset
150 Table_Increment => 100,
kono
parents:
diff changeset
151 Table_Name => "Gnatname.Sources");
kono
parents:
diff changeset
152 -- The list of Ada sources found, with their unit name and kind, to be put
kono
parents:
diff changeset
153 -- in the pragmas Source_File_Name in the configuration pragmas file.
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 procedure Output_Version;
kono
parents:
diff changeset
156 -- Print name and version
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 procedure Usage;
kono
parents:
diff changeset
159 -- Print usage
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 procedure Scan_Args;
kono
parents:
diff changeset
162 -- Scan the command line arguments
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 procedure Add_Source_Directory (S : String);
kono
parents:
diff changeset
165 -- Add S in the Source_Directories table
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 procedure Get_Directories (From_File : String);
kono
parents:
diff changeset
168 -- Read a source directory text file
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 procedure Write_Eol;
kono
parents:
diff changeset
171 -- Output an empty line
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 procedure Write_A_String (S : String);
kono
parents:
diff changeset
174 -- Write a String to Output_FD
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 procedure Initialize
kono
parents:
diff changeset
177 (File_Path : String;
kono
parents:
diff changeset
178 Preproc_Switches : Argument_List);
kono
parents:
diff changeset
179 -- Start the creation of a configuration pragmas file
kono
parents:
diff changeset
180 --
kono
parents:
diff changeset
181 -- File_Path is the name of the configuration pragmas file to create
kono
parents:
diff changeset
182 --
kono
parents:
diff changeset
183 -- Preproc_Switches is a list of switches to be used when invoking the
kono
parents:
diff changeset
184 -- compiler to get the name and kind of unit of a source file.
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 type Regexp_List is array (Positive range <>) of Regexp;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 procedure Process
kono
parents:
diff changeset
189 (Directories : Argument_List;
kono
parents:
diff changeset
190 Name_Patterns : Regexp_List;
kono
parents:
diff changeset
191 Excluded_Patterns : Regexp_List;
kono
parents:
diff changeset
192 Foreign_Patterns : Regexp_List);
kono
parents:
diff changeset
193 -- Look for source files in the specified directories, with the specified
kono
parents:
diff changeset
194 -- patterns.
kono
parents:
diff changeset
195 --
kono
parents:
diff changeset
196 -- Directories is the list of source directories where to look for sources.
kono
parents:
diff changeset
197 --
kono
parents:
diff changeset
198 -- Name_Patterns is a potentially empty list of file name patterns to check
kono
parents:
diff changeset
199 -- for Ada Sources.
kono
parents:
diff changeset
200 --
kono
parents:
diff changeset
201 -- Excluded_Patterns is a potentially empty list of file name patterns that
kono
parents:
diff changeset
202 -- should not be checked for Ada or non Ada sources.
kono
parents:
diff changeset
203 --
kono
parents:
diff changeset
204 -- Foreign_Patterns is a potentially empty list of file name patterns to
kono
parents:
diff changeset
205 -- check for non Ada sources.
kono
parents:
diff changeset
206 --
kono
parents:
diff changeset
207 -- At least one of Name_Patterns and Foreign_Patterns is not empty
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 procedure Finalize;
kono
parents:
diff changeset
210 -- Write the configuration pragmas file indicated in a call to procedure
kono
parents:
diff changeset
211 -- Initialize, after one or several calls to procedure Process.
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 --------------------------
kono
parents:
diff changeset
214 -- Add_Source_Directory --
kono
parents:
diff changeset
215 --------------------------
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 procedure Add_Source_Directory (S : String) is
kono
parents:
diff changeset
218 begin
kono
parents:
diff changeset
219 Patterns.Append
kono
parents:
diff changeset
220 (Arguments.Table (Arguments.Last).Directories, new String'(S));
kono
parents:
diff changeset
221 end Add_Source_Directory;
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 ---------
kono
parents:
diff changeset
224 -- Dup --
kono
parents:
diff changeset
225 ---------
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 function Dup (Fd : File_Descriptor) return File_Descriptor is
kono
parents:
diff changeset
228 begin
kono
parents:
diff changeset
229 return File_Descriptor (System.CRTL.dup (Integer (Fd)));
kono
parents:
diff changeset
230 end Dup;
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 ----------
kono
parents:
diff changeset
233 -- Dup2 --
kono
parents:
diff changeset
234 ----------
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 procedure Dup2 (Old_Fd, New_Fd : File_Descriptor) is
kono
parents:
diff changeset
237 Fd : Integer;
kono
parents:
diff changeset
238 pragma Warnings (Off, Fd);
kono
parents:
diff changeset
239 begin
kono
parents:
diff changeset
240 Fd := System.CRTL.dup2 (Integer (Old_Fd), Integer (New_Fd));
kono
parents:
diff changeset
241 end Dup2;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 ---------------------
kono
parents:
diff changeset
244 -- Get_Directories --
kono
parents:
diff changeset
245 ---------------------
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 procedure Get_Directories (From_File : String) is
kono
parents:
diff changeset
248 File : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
249 Line : String (1 .. 2_000);
kono
parents:
diff changeset
250 Last : Natural;
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 begin
kono
parents:
diff changeset
253 Open (File, In_File, From_File);
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 while not End_Of_File (File) loop
kono
parents:
diff changeset
256 Get_Line (File, Line, Last);
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if Last /= 0 then
kono
parents:
diff changeset
259 Add_Source_Directory (Line (1 .. Last));
kono
parents:
diff changeset
260 end if;
kono
parents:
diff changeset
261 end loop;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 Close (File);
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 exception
kono
parents:
diff changeset
266 when Name_Error =>
kono
parents:
diff changeset
267 Fail ("cannot open source directory file """ & From_File & '"');
kono
parents:
diff changeset
268 end Get_Directories;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 --------------
kono
parents:
diff changeset
271 -- Finalize --
kono
parents:
diff changeset
272 --------------
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 procedure Finalize is
kono
parents:
diff changeset
275 Discard : Boolean;
kono
parents:
diff changeset
276 pragma Warnings (Off, Discard);
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 begin
kono
parents:
diff changeset
279 -- Delete the file if it already exists
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 Delete_File
kono
parents:
diff changeset
282 (Path_Name (Directory_Last + 1 .. Path_Last),
kono
parents:
diff changeset
283 Success => Discard);
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 -- Create a new one
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 if Opt.Verbose_Mode then
kono
parents:
diff changeset
288 Output.Write_Str ("Creating new file """);
kono
parents:
diff changeset
289 Output.Write_Str (Path_Name (Directory_Last + 1 .. Path_Last));
kono
parents:
diff changeset
290 Output.Write_Line ("""");
kono
parents:
diff changeset
291 end if;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 Output_FD := Create_New_File
kono
parents:
diff changeset
294 (Path_Name (Directory_Last + 1 .. Path_Last),
kono
parents:
diff changeset
295 Fmode => Text);
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 -- Fails if file cannot be created
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 if Output_FD = Invalid_FD then
kono
parents:
diff changeset
300 Fail_Program
kono
parents:
diff changeset
301 ("cannot create new """ & Path_Name (1 .. Path_Last) & """");
kono
parents:
diff changeset
302 end if;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 -- For each Ada source, write a pragma Source_File_Name to the
kono
parents:
diff changeset
305 -- configuration pragmas file.
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 for Index in 1 .. Sources.Last loop
kono
parents:
diff changeset
308 if Sources.Table (Index).Unit_Name /= No_Name then
kono
parents:
diff changeset
309 Write_A_String ("pragma Source_File_Name");
kono
parents:
diff changeset
310 Write_Eol;
kono
parents:
diff changeset
311 Write_A_String (" (");
kono
parents:
diff changeset
312 Write_A_String
kono
parents:
diff changeset
313 (Get_Name_String (Sources.Table (Index).Unit_Name));
kono
parents:
diff changeset
314 Write_A_String (",");
kono
parents:
diff changeset
315 Write_Eol;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 if Sources.Table (Index).Spec then
kono
parents:
diff changeset
318 Write_A_String (" Spec_File_Name => """);
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 else
kono
parents:
diff changeset
321 Write_A_String (" Body_File_Name => """);
kono
parents:
diff changeset
322 end if;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 Write_A_String
kono
parents:
diff changeset
325 (Get_Name_String (Sources.Table (Index).File_Name));
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 Write_A_String ("""");
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 if Sources.Table (Index).Index /= 0 then
kono
parents:
diff changeset
330 Write_A_String (", Index =>");
kono
parents:
diff changeset
331 Write_A_String (Sources.Table (Index).Index'Img);
kono
parents:
diff changeset
332 end if;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 Write_A_String (");");
kono
parents:
diff changeset
335 Write_Eol;
kono
parents:
diff changeset
336 end if;
kono
parents:
diff changeset
337 end loop;
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 Close (Output_FD);
kono
parents:
diff changeset
340 end Finalize;
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 ----------------
kono
parents:
diff changeset
343 -- Initialize --
kono
parents:
diff changeset
344 ----------------
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 procedure Initialize
kono
parents:
diff changeset
347 (File_Path : String;
kono
parents:
diff changeset
348 Preproc_Switches : Argument_List)
kono
parents:
diff changeset
349 is
kono
parents:
diff changeset
350 begin
kono
parents:
diff changeset
351 Sources.Set_Last (0);
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 -- Initialize the compiler switches
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 Args := new Argument_List (1 .. Preproc_Switches'Length + 6);
kono
parents:
diff changeset
356 Args (1) := new String'("-c");
kono
parents:
diff changeset
357 Args (2) := new String'("-gnats");
kono
parents:
diff changeset
358 Args (3) := new String'("-gnatu");
kono
parents:
diff changeset
359 Args (4 .. 3 + Preproc_Switches'Length) := Preproc_Switches;
kono
parents:
diff changeset
360 Args (4 + Preproc_Switches'Length) := new String'("-x");
kono
parents:
diff changeset
361 Args (5 + Preproc_Switches'Length) := new String'("ada");
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 -- Get the path and file names
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 Path_Name := new
kono
parents:
diff changeset
366 String (1 .. File_Path'Length);
kono
parents:
diff changeset
367 Path_Last := File_Path'Length;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 if File_Names_Case_Sensitive then
kono
parents:
diff changeset
370 Path_Name (1 .. Path_Last) := File_Path;
kono
parents:
diff changeset
371 else
kono
parents:
diff changeset
372 Path_Name (1 .. Path_Last) := To_Lower (File_Path);
kono
parents:
diff changeset
373 end if;
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 -- Get the end of directory information, if any
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 for Index in reverse 1 .. Path_Last loop
kono
parents:
diff changeset
378 if Path_Name (Index) = Directory_Separator then
kono
parents:
diff changeset
379 Directory_Last := Index;
kono
parents:
diff changeset
380 exit;
kono
parents:
diff changeset
381 end if;
kono
parents:
diff changeset
382 end loop;
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 -- Change the current directory to the directory of the project file,
kono
parents:
diff changeset
385 -- if any directory information is specified.
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 if Directory_Last /= 0 then
kono
parents:
diff changeset
388 begin
kono
parents:
diff changeset
389 Change_Dir (Path_Name (1 .. Directory_Last));
kono
parents:
diff changeset
390 exception
kono
parents:
diff changeset
391 when Directory_Error =>
kono
parents:
diff changeset
392 Fail_Program
kono
parents:
diff changeset
393 ("unknown directory """
kono
parents:
diff changeset
394 & Path_Name (1 .. Directory_Last)
kono
parents:
diff changeset
395 & """");
kono
parents:
diff changeset
396 end;
kono
parents:
diff changeset
397 end if;
kono
parents:
diff changeset
398 end Initialize;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 -------------
kono
parents:
diff changeset
401 -- Process --
kono
parents:
diff changeset
402 -------------
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 procedure Process
kono
parents:
diff changeset
405 (Directories : Argument_List;
kono
parents:
diff changeset
406 Name_Patterns : Regexp_List;
kono
parents:
diff changeset
407 Excluded_Patterns : Regexp_List;
kono
parents:
diff changeset
408 Foreign_Patterns : Regexp_List)
kono
parents:
diff changeset
409 is
kono
parents:
diff changeset
410 procedure Process_Directory (Dir_Name : String);
kono
parents:
diff changeset
411 -- Look for Ada and foreign sources in a directory, according to the
kono
parents:
diff changeset
412 -- patterns.
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 -----------------------
kono
parents:
diff changeset
415 -- Process_Directory --
kono
parents:
diff changeset
416 -----------------------
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 procedure Process_Directory (Dir_Name : String) is
kono
parents:
diff changeset
419 Matched : Matched_Type := False;
kono
parents:
diff changeset
420 Str : String (1 .. 2_000);
kono
parents:
diff changeset
421 Canon : String (1 .. 2_000);
kono
parents:
diff changeset
422 Last : Natural;
kono
parents:
diff changeset
423 Dir : Dir_Type;
kono
parents:
diff changeset
424 Do_Process : Boolean := True;
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 Temp_File_Name : String_Access := null;
kono
parents:
diff changeset
427 Save_Last_Source_Index : Natural := 0;
kono
parents:
diff changeset
428 File_Name_Id : Name_Id := No_Name;
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 Current_Source : Source;
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 begin
kono
parents:
diff changeset
433 -- Avoid processing the same directory more than once
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 for Index in 1 .. Processed_Directories.Last loop
kono
parents:
diff changeset
436 if Processed_Directories.Table (Index).all = Dir_Name then
kono
parents:
diff changeset
437 Do_Process := False;
kono
parents:
diff changeset
438 exit;
kono
parents:
diff changeset
439 end if;
kono
parents:
diff changeset
440 end loop;
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 if Do_Process then
kono
parents:
diff changeset
443 if Opt.Verbose_Mode then
kono
parents:
diff changeset
444 Output.Write_Str ("Processing directory """);
kono
parents:
diff changeset
445 Output.Write_Str (Dir_Name);
kono
parents:
diff changeset
446 Output.Write_Line ("""");
kono
parents:
diff changeset
447 end if;
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 Processed_Directories. Increment_Last;
kono
parents:
diff changeset
450 Processed_Directories.Table (Processed_Directories.Last) :=
kono
parents:
diff changeset
451 new String'(Dir_Name);
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 -- Get the source file names from the directory. Fails if the
kono
parents:
diff changeset
454 -- directory does not exist.
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 begin
kono
parents:
diff changeset
457 Open (Dir, Dir_Name);
kono
parents:
diff changeset
458 exception
kono
parents:
diff changeset
459 when Directory_Error =>
kono
parents:
diff changeset
460 Fail_Program ("cannot open directory """ & Dir_Name & """");
kono
parents:
diff changeset
461 end;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 -- Process each regular file in the directory
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 File_Loop : loop
kono
parents:
diff changeset
466 Read (Dir, Str, Last);
kono
parents:
diff changeset
467 exit File_Loop when Last = 0;
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 -- Copy the file name and put it in canonical case to match
kono
parents:
diff changeset
470 -- against the patterns that have themselves already been put
kono
parents:
diff changeset
471 -- in canonical case.
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 Canon (1 .. Last) := Str (1 .. Last);
kono
parents:
diff changeset
474 Canonical_Case_File_Name (Canon (1 .. Last));
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 if Is_Regular_File
kono
parents:
diff changeset
477 (Dir_Name & Directory_Separator & Str (1 .. Last))
kono
parents:
diff changeset
478 then
kono
parents:
diff changeset
479 Matched := True;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 Name_Len := Last;
kono
parents:
diff changeset
482 Name_Buffer (1 .. Name_Len) := Str (1 .. Last);
kono
parents:
diff changeset
483 File_Name_Id := Name_Find;
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 -- First, check if the file name matches at least one of
kono
parents:
diff changeset
486 -- the excluded expressions;
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 for Index in Excluded_Patterns'Range loop
kono
parents:
diff changeset
489 if
kono
parents:
diff changeset
490 Match (Canon (1 .. Last), Excluded_Patterns (Index))
kono
parents:
diff changeset
491 then
kono
parents:
diff changeset
492 Matched := Excluded;
kono
parents:
diff changeset
493 exit;
kono
parents:
diff changeset
494 end if;
kono
parents:
diff changeset
495 end loop;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 -- If it does not match any of the excluded expressions,
kono
parents:
diff changeset
498 -- check if the file name matches at least one of the
kono
parents:
diff changeset
499 -- regular expressions.
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 if Matched = True then
kono
parents:
diff changeset
502 Matched := False;
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504 for Index in Name_Patterns'Range loop
kono
parents:
diff changeset
505 if
kono
parents:
diff changeset
506 Match
kono
parents:
diff changeset
507 (Canon (1 .. Last), Name_Patterns (Index))
kono
parents:
diff changeset
508 then
kono
parents:
diff changeset
509 Matched := True;
kono
parents:
diff changeset
510 exit;
kono
parents:
diff changeset
511 end if;
kono
parents:
diff changeset
512 end loop;
kono
parents:
diff changeset
513 end if;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 if Very_Verbose
kono
parents:
diff changeset
516 or else (Matched = True and then Opt.Verbose_Mode)
kono
parents:
diff changeset
517 then
kono
parents:
diff changeset
518 Output.Write_Str (" Checking """);
kono
parents:
diff changeset
519 Output.Write_Str (Str (1 .. Last));
kono
parents:
diff changeset
520 Output.Write_Line (""": ");
kono
parents:
diff changeset
521 end if;
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 -- If the file name matches one of the regular expressions,
kono
parents:
diff changeset
524 -- parse it to get its unit name.
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 if Matched = True then
kono
parents:
diff changeset
527 declare
kono
parents:
diff changeset
528 FD : File_Descriptor;
kono
parents:
diff changeset
529 Success : Boolean;
kono
parents:
diff changeset
530 Saved_Output : File_Descriptor;
kono
parents:
diff changeset
531 Saved_Error : File_Descriptor;
kono
parents:
diff changeset
532 Tmp_File : Path_Name_Type;
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 begin
kono
parents:
diff changeset
535 -- If we don't have the path of the compiler yet,
kono
parents:
diff changeset
536 -- get it now. The compiler name may have a prefix,
kono
parents:
diff changeset
537 -- so we get the potentially prefixed name.
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 if Gcc_Path = null then
kono
parents:
diff changeset
540 declare
kono
parents:
diff changeset
541 Prefix_Gcc : String_Access :=
kono
parents:
diff changeset
542 Program_Name (Gcc, "gnatname");
kono
parents:
diff changeset
543 begin
kono
parents:
diff changeset
544 Gcc_Path :=
kono
parents:
diff changeset
545 Locate_Exec_On_Path (Prefix_Gcc.all);
kono
parents:
diff changeset
546 Free (Prefix_Gcc);
kono
parents:
diff changeset
547 end;
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 if Gcc_Path = null then
kono
parents:
diff changeset
550 Fail_Program ("could not locate " & Gcc);
kono
parents:
diff changeset
551 end if;
kono
parents:
diff changeset
552 end if;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 -- Create the temporary file
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 Tempdir.Create_Temp_File (FD, Tmp_File);
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 if FD = Invalid_FD then
kono
parents:
diff changeset
559 Fail_Program
kono
parents:
diff changeset
560 ("could not create temporary file");
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 else
kono
parents:
diff changeset
563 Temp_File_Name :=
kono
parents:
diff changeset
564 new String'(Get_Name_String (Tmp_File));
kono
parents:
diff changeset
565 end if;
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 Args (Args'Last) :=
kono
parents:
diff changeset
568 new String'
kono
parents:
diff changeset
569 (Dir_Name & Directory_Separator & Str (1 .. Last));
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 -- Save the standard output and error
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 Saved_Output := Dup (Standout);
kono
parents:
diff changeset
574 Saved_Error := Dup (Standerr);
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 -- Set standard output and error to the temporary file
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 Dup2 (FD, Standout);
kono
parents:
diff changeset
579 Dup2 (FD, Standerr);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 -- And spawn the compiler
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 Spawn (Gcc_Path.all, Args.all, Success);
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 -- Restore the standard output and error
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 Dup2 (Saved_Output, Standout);
kono
parents:
diff changeset
588 Dup2 (Saved_Error, Standerr);
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 -- Close the temporary file
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 Close (FD);
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 -- And close the saved standard output and error to
kono
parents:
diff changeset
595 -- avoid too many file descriptors.
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 Close (Saved_Output);
kono
parents:
diff changeset
598 Close (Saved_Error);
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 -- Now that standard output is restored, check if
kono
parents:
diff changeset
601 -- the compiler ran correctly.
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 -- Read the lines of the temporary file:
kono
parents:
diff changeset
604 -- they should contain the kind and name of the unit.
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 declare
kono
parents:
diff changeset
607 File : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
608 Text_Line : String (1 .. 1_000);
kono
parents:
diff changeset
609 Text_Last : Natural;
kono
parents:
diff changeset
610
kono
parents:
diff changeset
611 begin
kono
parents:
diff changeset
612 begin
kono
parents:
diff changeset
613 Open (File, In_File, Temp_File_Name.all);
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 exception
kono
parents:
diff changeset
616 when others =>
kono
parents:
diff changeset
617 Fail_Program
kono
parents:
diff changeset
618 ("could not read temporary file " &
kono
parents:
diff changeset
619 Temp_File_Name.all);
kono
parents:
diff changeset
620 end;
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 Save_Last_Source_Index := Sources.Last;
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 if End_Of_File (File) then
kono
parents:
diff changeset
625 if Opt.Verbose_Mode then
kono
parents:
diff changeset
626 if not Success then
kono
parents:
diff changeset
627 Output.Write_Str (" (process died) ");
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629 end if;
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 else
kono
parents:
diff changeset
632 Line_Loop : while not End_Of_File (File) loop
kono
parents:
diff changeset
633 Get_Line (File, Text_Line, Text_Last);
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 -- Find the first closing parenthesis
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 Char_Loop : for J in 1 .. Text_Last loop
kono
parents:
diff changeset
638 if Text_Line (J) = ')' then
kono
parents:
diff changeset
639 if J >= 13 and then
kono
parents:
diff changeset
640 Text_Line (1 .. 4) = "Unit"
kono
parents:
diff changeset
641 then
kono
parents:
diff changeset
642 -- Add entry to Sources table
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 Name_Len := J - 12;
kono
parents:
diff changeset
645 Name_Buffer (1 .. Name_Len) :=
kono
parents:
diff changeset
646 Text_Line (6 .. J - 7);
kono
parents:
diff changeset
647 Current_Source :=
kono
parents:
diff changeset
648 (Unit_Name => Name_Find,
kono
parents:
diff changeset
649 File_Name => File_Name_Id,
kono
parents:
diff changeset
650 Index => 0,
kono
parents:
diff changeset
651 Spec => Text_Line (J - 5 .. J) =
kono
parents:
diff changeset
652 "(spec)");
kono
parents:
diff changeset
653
kono
parents:
diff changeset
654 Sources.Append (Current_Source);
kono
parents:
diff changeset
655 end if;
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 exit Char_Loop;
kono
parents:
diff changeset
658 end if;
kono
parents:
diff changeset
659 end loop Char_Loop;
kono
parents:
diff changeset
660 end loop Line_Loop;
kono
parents:
diff changeset
661 end if;
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 if Save_Last_Source_Index = Sources.Last then
kono
parents:
diff changeset
664 if Opt.Verbose_Mode then
kono
parents:
diff changeset
665 Output.Write_Line (" not a unit");
kono
parents:
diff changeset
666 end if;
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 else
kono
parents:
diff changeset
669 if Sources.Last >
kono
parents:
diff changeset
670 Save_Last_Source_Index + 1
kono
parents:
diff changeset
671 then
kono
parents:
diff changeset
672 for Index in Save_Last_Source_Index + 1 ..
kono
parents:
diff changeset
673 Sources.Last
kono
parents:
diff changeset
674 loop
kono
parents:
diff changeset
675 Sources.Table (Index).Index :=
kono
parents:
diff changeset
676 Int (Index - Save_Last_Source_Index);
kono
parents:
diff changeset
677 end loop;
kono
parents:
diff changeset
678 end if;
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 for Index in Save_Last_Source_Index + 1 ..
kono
parents:
diff changeset
681 Sources.Last
kono
parents:
diff changeset
682 loop
kono
parents:
diff changeset
683 Current_Source := Sources.Table (Index);
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 if Opt.Verbose_Mode then
kono
parents:
diff changeset
686 if Current_Source.Spec then
kono
parents:
diff changeset
687 Output.Write_Str (" spec of ");
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 else
kono
parents:
diff changeset
690 Output.Write_Str (" body of ");
kono
parents:
diff changeset
691 end if;
kono
parents:
diff changeset
692
kono
parents:
diff changeset
693 Output.Write_Line
kono
parents:
diff changeset
694 (Get_Name_String
kono
parents:
diff changeset
695 (Current_Source.Unit_Name));
kono
parents:
diff changeset
696 end if;
kono
parents:
diff changeset
697 end loop;
kono
parents:
diff changeset
698 end if;
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 Close (File);
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 Delete_File (Temp_File_Name.all, Success);
kono
parents:
diff changeset
703 end;
kono
parents:
diff changeset
704 end;
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 -- File name matches none of the regular expressions
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 else
kono
parents:
diff changeset
709 -- If file is not excluded, see if this is foreign source
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 if Matched /= Excluded then
kono
parents:
diff changeset
712 for Index in Foreign_Patterns'Range loop
kono
parents:
diff changeset
713 if Match (Canon (1 .. Last),
kono
parents:
diff changeset
714 Foreign_Patterns (Index))
kono
parents:
diff changeset
715 then
kono
parents:
diff changeset
716 Matched := True;
kono
parents:
diff changeset
717 exit;
kono
parents:
diff changeset
718 end if;
kono
parents:
diff changeset
719 end loop;
kono
parents:
diff changeset
720 end if;
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 if Very_Verbose then
kono
parents:
diff changeset
723 case Matched is
kono
parents:
diff changeset
724 when False =>
kono
parents:
diff changeset
725 Output.Write_Line ("no match");
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 when Excluded =>
kono
parents:
diff changeset
728 Output.Write_Line ("excluded");
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 when True =>
kono
parents:
diff changeset
731 Output.Write_Line ("foreign source");
kono
parents:
diff changeset
732 end case;
kono
parents:
diff changeset
733 end if;
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 if Matched = True then
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 -- Add source file name without unit name
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 Name_Len := 0;
kono
parents:
diff changeset
740 Add_Str_To_Name_Buffer (Canon (1 .. Last));
kono
parents:
diff changeset
741 Sources.Append
kono
parents:
diff changeset
742 ((File_Name => Name_Find,
kono
parents:
diff changeset
743 Unit_Name => No_Name,
kono
parents:
diff changeset
744 Index => 0,
kono
parents:
diff changeset
745 Spec => False));
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747 end if;
kono
parents:
diff changeset
748 end if;
kono
parents:
diff changeset
749 end loop File_Loop;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 Close (Dir);
kono
parents:
diff changeset
752 end if;
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 end Process_Directory;
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 -- Start of processing for Process
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 begin
kono
parents:
diff changeset
759 Processed_Directories.Set_Last (0);
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 -- Process each directory
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 for Index in Directories'Range loop
kono
parents:
diff changeset
764 Process_Directory (Directories (Index).all);
kono
parents:
diff changeset
765 end loop;
kono
parents:
diff changeset
766 end Process;
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 --------------------
kono
parents:
diff changeset
769 -- Output_Version --
kono
parents:
diff changeset
770 --------------------
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 procedure Output_Version is
kono
parents:
diff changeset
773 begin
kono
parents:
diff changeset
774 if not Version_Output then
kono
parents:
diff changeset
775 Version_Output := True;
kono
parents:
diff changeset
776 Output.Write_Eol;
kono
parents:
diff changeset
777 Display_Version ("GNATNAME", "2001");
kono
parents:
diff changeset
778 end if;
kono
parents:
diff changeset
779 end Output_Version;
kono
parents:
diff changeset
780
kono
parents:
diff changeset
781 ---------------
kono
parents:
diff changeset
782 -- Scan_Args --
kono
parents:
diff changeset
783 ---------------
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 procedure Scan_Args is
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789 Project_File_Name_Expected : Boolean;
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 Pragmas_File_Expected : Boolean;
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 Directory_Expected : Boolean;
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 Dir_File_Name_Expected : Boolean;
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 Foreign_Pattern_Expected : Boolean;
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 Excluded_Pattern_Expected : Boolean;
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 procedure Check_Regular_Expression (S : String);
kono
parents:
diff changeset
802 -- Compile string S into a Regexp, fail if any error
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 -----------------------------
kono
parents:
diff changeset
805 -- Check_Regular_Expression--
kono
parents:
diff changeset
806 -----------------------------
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 procedure Check_Regular_Expression (S : String) is
kono
parents:
diff changeset
809 Dummy : Regexp;
kono
parents:
diff changeset
810 pragma Warnings (Off, Dummy);
kono
parents:
diff changeset
811 begin
kono
parents:
diff changeset
812 Dummy := Compile (S, Glob => True);
kono
parents:
diff changeset
813 exception
kono
parents:
diff changeset
814 when Error_In_Regexp =>
kono
parents:
diff changeset
815 Fail ("invalid regular expression """ & S & """");
kono
parents:
diff changeset
816 end Check_Regular_Expression;
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 -- Start of processing for Scan_Args
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 begin
kono
parents:
diff changeset
821 -- First check for --version or --help
kono
parents:
diff changeset
822
kono
parents:
diff changeset
823 Check_Version_And_Help ("GNATNAME", "2001");
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 -- Now scan the other switches
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 Project_File_Name_Expected := False;
kono
parents:
diff changeset
828 Pragmas_File_Expected := False;
kono
parents:
diff changeset
829 Directory_Expected := False;
kono
parents:
diff changeset
830 Dir_File_Name_Expected := False;
kono
parents:
diff changeset
831 Foreign_Pattern_Expected := False;
kono
parents:
diff changeset
832 Excluded_Pattern_Expected := False;
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 for Next_Arg in 1 .. Argument_Count loop
kono
parents:
diff changeset
835 declare
kono
parents:
diff changeset
836 Next_Argv : constant String := Argument (Next_Arg);
kono
parents:
diff changeset
837 Arg : String (1 .. Next_Argv'Length) := Next_Argv;
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 begin
kono
parents:
diff changeset
840 if Arg'Length > 0 then
kono
parents:
diff changeset
841
kono
parents:
diff changeset
842 -- -P xxx
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 if Project_File_Name_Expected then
kono
parents:
diff changeset
845 if Arg (1) = '-' then
kono
parents:
diff changeset
846 Fail ("project file name missing");
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 else
kono
parents:
diff changeset
849 File_Set := True;
kono
parents:
diff changeset
850 File_Path := new String'(Arg);
kono
parents:
diff changeset
851 Project_File_Name_Expected := False;
kono
parents:
diff changeset
852 end if;
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 -- -c file
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 elsif Pragmas_File_Expected then
kono
parents:
diff changeset
857 File_Set := True;
kono
parents:
diff changeset
858 File_Path := new String'(Arg);
kono
parents:
diff changeset
859 Pragmas_File_Expected := False;
kono
parents:
diff changeset
860
kono
parents:
diff changeset
861 -- -d xxx
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 elsif Directory_Expected then
kono
parents:
diff changeset
864 Add_Source_Directory (Arg);
kono
parents:
diff changeset
865 Directory_Expected := False;
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 -- -D xxx
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 elsif Dir_File_Name_Expected then
kono
parents:
diff changeset
870 Get_Directories (Arg);
kono
parents:
diff changeset
871 Dir_File_Name_Expected := False;
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 -- -f xxx
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 elsif Foreign_Pattern_Expected then
kono
parents:
diff changeset
876 Patterns.Append
kono
parents:
diff changeset
877 (Arguments.Table (Arguments.Last).Foreign_Patterns,
kono
parents:
diff changeset
878 new String'(Arg));
kono
parents:
diff changeset
879 Check_Regular_Expression (Arg);
kono
parents:
diff changeset
880 Foreign_Pattern_Expected := False;
kono
parents:
diff changeset
881
kono
parents:
diff changeset
882 -- -x xxx
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 elsif Excluded_Pattern_Expected then
kono
parents:
diff changeset
885 Patterns.Append
kono
parents:
diff changeset
886 (Arguments.Table (Arguments.Last).Excluded_Patterns,
kono
parents:
diff changeset
887 new String'(Arg));
kono
parents:
diff changeset
888 Check_Regular_Expression (Arg);
kono
parents:
diff changeset
889 Excluded_Pattern_Expected := False;
kono
parents:
diff changeset
890
kono
parents:
diff changeset
891 -- There must be at least one Ada pattern or one foreign
kono
parents:
diff changeset
892 -- pattern for the previous section.
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 -- --and
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 elsif Arg = "--and" then
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 if Patterns.Last
kono
parents:
diff changeset
899 (Arguments.Table (Arguments.Last).Name_Patterns) = 0
kono
parents:
diff changeset
900 and then
kono
parents:
diff changeset
901 Patterns.Last
kono
parents:
diff changeset
902 (Arguments.Table (Arguments.Last).Foreign_Patterns) = 0
kono
parents:
diff changeset
903 then
kono
parents:
diff changeset
904 Try_Help;
kono
parents:
diff changeset
905 return;
kono
parents:
diff changeset
906 end if;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 -- If no directory were specified for the previous section,
kono
parents:
diff changeset
909 -- then the directory is the project directory.
kono
parents:
diff changeset
910
kono
parents:
diff changeset
911 if Patterns.Last
kono
parents:
diff changeset
912 (Arguments.Table (Arguments.Last).Directories) = 0
kono
parents:
diff changeset
913 then
kono
parents:
diff changeset
914 Patterns.Append
kono
parents:
diff changeset
915 (Arguments.Table (Arguments.Last).Directories,
kono
parents:
diff changeset
916 new String'("."));
kono
parents:
diff changeset
917 end if;
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 -- Add and initialize another component to Arguments table
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 declare
kono
parents:
diff changeset
922 New_Arguments : Argument_Data;
kono
parents:
diff changeset
923 pragma Warnings (Off, New_Arguments);
kono
parents:
diff changeset
924 -- Declaring this defaulted initialized object ensures
kono
parents:
diff changeset
925 -- that the new allocated component of table Arguments
kono
parents:
diff changeset
926 -- is correctly initialized.
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 -- This is VERY ugly, Table should never be used with
kono
parents:
diff changeset
929 -- data requiring default initialization. We should
kono
parents:
diff changeset
930 -- find a way to avoid violating this rule ???
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 begin
kono
parents:
diff changeset
933 Arguments.Append (New_Arguments);
kono
parents:
diff changeset
934 end;
kono
parents:
diff changeset
935
kono
parents:
diff changeset
936 Patterns.Init
kono
parents:
diff changeset
937 (Arguments.Table (Arguments.Last).Directories);
kono
parents:
diff changeset
938 Patterns.Set_Last
kono
parents:
diff changeset
939 (Arguments.Table (Arguments.Last).Directories, 0);
kono
parents:
diff changeset
940 Patterns.Init
kono
parents:
diff changeset
941 (Arguments.Table (Arguments.Last).Name_Patterns);
kono
parents:
diff changeset
942 Patterns.Set_Last
kono
parents:
diff changeset
943 (Arguments.Table (Arguments.Last).Name_Patterns, 0);
kono
parents:
diff changeset
944 Patterns.Init
kono
parents:
diff changeset
945 (Arguments.Table (Arguments.Last).Excluded_Patterns);
kono
parents:
diff changeset
946 Patterns.Set_Last
kono
parents:
diff changeset
947 (Arguments.Table (Arguments.Last).Excluded_Patterns, 0);
kono
parents:
diff changeset
948 Patterns.Init
kono
parents:
diff changeset
949 (Arguments.Table (Arguments.Last).Foreign_Patterns);
kono
parents:
diff changeset
950 Patterns.Set_Last
kono
parents:
diff changeset
951 (Arguments.Table (Arguments.Last).Foreign_Patterns, 0);
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 -- Subdirectory switch
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 elsif Arg'Length > Subdirs_Switch'Length
kono
parents:
diff changeset
956 and then Arg (1 .. Subdirs_Switch'Length) = Subdirs_Switch
kono
parents:
diff changeset
957 then
kono
parents:
diff changeset
958 null;
kono
parents:
diff changeset
959 -- Subdirs are only used in gprname
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 -- --no-backup
kono
parents:
diff changeset
962
kono
parents:
diff changeset
963 elsif Arg = "--no-backup" then
kono
parents:
diff changeset
964 Opt.No_Backup := True;
kono
parents:
diff changeset
965
kono
parents:
diff changeset
966 -- -c
kono
parents:
diff changeset
967
kono
parents:
diff changeset
968 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-c" then
kono
parents:
diff changeset
969 if File_Set then
kono
parents:
diff changeset
970 Fail ("only one -P or -c switch may be specified");
kono
parents:
diff changeset
971 end if;
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 if Arg'Length = 2 then
kono
parents:
diff changeset
974 Pragmas_File_Expected := True;
kono
parents:
diff changeset
975
kono
parents:
diff changeset
976 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
977 Fail ("configuration pragmas file name missing");
kono
parents:
diff changeset
978 end if;
kono
parents:
diff changeset
979
kono
parents:
diff changeset
980 else
kono
parents:
diff changeset
981 File_Set := True;
kono
parents:
diff changeset
982 File_Path := new String'(Arg (3 .. Arg'Last));
kono
parents:
diff changeset
983 end if;
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 -- -d
kono
parents:
diff changeset
986
kono
parents:
diff changeset
987 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-d" then
kono
parents:
diff changeset
988 if Arg'Length = 2 then
kono
parents:
diff changeset
989 Directory_Expected := True;
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
992 Fail ("directory name missing");
kono
parents:
diff changeset
993 end if;
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 else
kono
parents:
diff changeset
996 Add_Source_Directory (Arg (3 .. Arg'Last));
kono
parents:
diff changeset
997 end if;
kono
parents:
diff changeset
998
kono
parents:
diff changeset
999 -- -D
kono
parents:
diff changeset
1000
kono
parents:
diff changeset
1001 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-D" then
kono
parents:
diff changeset
1002 if Arg'Length = 2 then
kono
parents:
diff changeset
1003 Dir_File_Name_Expected := True;
kono
parents:
diff changeset
1004
kono
parents:
diff changeset
1005 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
1006 Fail ("directory list file name missing");
kono
parents:
diff changeset
1007 end if;
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 else
kono
parents:
diff changeset
1010 Get_Directories (Arg (3 .. Arg'Last));
kono
parents:
diff changeset
1011 end if;
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 -- -eL
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 elsif Arg = "-eL" then
kono
parents:
diff changeset
1016 Opt.Follow_Links_For_Files := True;
kono
parents:
diff changeset
1017 Opt.Follow_Links_For_Dirs := True;
kono
parents:
diff changeset
1018
kono
parents:
diff changeset
1019 -- -f
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-f" then
kono
parents:
diff changeset
1022 if Arg'Length = 2 then
kono
parents:
diff changeset
1023 Foreign_Pattern_Expected := True;
kono
parents:
diff changeset
1024
kono
parents:
diff changeset
1025 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
1026 Fail ("foreign pattern missing");
kono
parents:
diff changeset
1027 end if;
kono
parents:
diff changeset
1028
kono
parents:
diff changeset
1029 else
kono
parents:
diff changeset
1030 Patterns.Append
kono
parents:
diff changeset
1031 (Arguments.Table (Arguments.Last).Foreign_Patterns,
kono
parents:
diff changeset
1032 new String'(Arg (3 .. Arg'Last)));
kono
parents:
diff changeset
1033 Check_Regular_Expression (Arg (3 .. Arg'Last));
kono
parents:
diff changeset
1034 end if;
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 -- -gnatep or -gnateD
kono
parents:
diff changeset
1037
kono
parents:
diff changeset
1038 elsif Arg'Length > 7 and then
kono
parents:
diff changeset
1039 (Arg (1 .. 7) = "-gnatep" or else Arg (1 .. 7) = "-gnateD")
kono
parents:
diff changeset
1040 then
kono
parents:
diff changeset
1041 Preprocessor_Switches.Append (new String'(Arg));
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 -- -h
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 elsif Arg = "-h" then
kono
parents:
diff changeset
1046 Usage_Needed := True;
kono
parents:
diff changeset
1047
kono
parents:
diff changeset
1048 -- -P
kono
parents:
diff changeset
1049
kono
parents:
diff changeset
1050 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-P" then
kono
parents:
diff changeset
1051 if File_Set then
kono
parents:
diff changeset
1052 Fail ("only one -c or -P switch may be specified");
kono
parents:
diff changeset
1053 end if;
kono
parents:
diff changeset
1054
kono
parents:
diff changeset
1055 if Arg'Length = 2 then
kono
parents:
diff changeset
1056 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
1057 Fail ("project file name missing");
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 else
kono
parents:
diff changeset
1060 Project_File_Name_Expected := True;
kono
parents:
diff changeset
1061 end if;
kono
parents:
diff changeset
1062
kono
parents:
diff changeset
1063 else
kono
parents:
diff changeset
1064 File_Set := True;
kono
parents:
diff changeset
1065 File_Path := new String'(Arg (3 .. Arg'Last));
kono
parents:
diff changeset
1066 end if;
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 Create_Project := True;
kono
parents:
diff changeset
1069
kono
parents:
diff changeset
1070 -- -v
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 elsif Arg = "-v" then
kono
parents:
diff changeset
1073 if Opt.Verbose_Mode then
kono
parents:
diff changeset
1074 Very_Verbose := True;
kono
parents:
diff changeset
1075 else
kono
parents:
diff changeset
1076 Opt.Verbose_Mode := True;
kono
parents:
diff changeset
1077 end if;
kono
parents:
diff changeset
1078
kono
parents:
diff changeset
1079 -- -x
kono
parents:
diff changeset
1080
kono
parents:
diff changeset
1081 elsif Arg'Length >= 2 and then Arg (1 .. 2) = "-x" then
kono
parents:
diff changeset
1082 if Arg'Length = 2 then
kono
parents:
diff changeset
1083 Excluded_Pattern_Expected := True;
kono
parents:
diff changeset
1084
kono
parents:
diff changeset
1085 if Next_Arg = Argument_Count then
kono
parents:
diff changeset
1086 Fail ("excluded pattern missing");
kono
parents:
diff changeset
1087 end if;
kono
parents:
diff changeset
1088
kono
parents:
diff changeset
1089 else
kono
parents:
diff changeset
1090 Patterns.Append
kono
parents:
diff changeset
1091 (Arguments.Table (Arguments.Last).Excluded_Patterns,
kono
parents:
diff changeset
1092 new String'(Arg (3 .. Arg'Last)));
kono
parents:
diff changeset
1093 Check_Regular_Expression (Arg (3 .. Arg'Last));
kono
parents:
diff changeset
1094 end if;
kono
parents:
diff changeset
1095
kono
parents:
diff changeset
1096 -- Junk switch starting with minus
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 elsif Arg (1) = '-' then
kono
parents:
diff changeset
1099 Fail ("wrong switch: " & Arg);
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 -- Not a recognized switch, assume file name
kono
parents:
diff changeset
1102
kono
parents:
diff changeset
1103 else
kono
parents:
diff changeset
1104 Canonical_Case_File_Name (Arg);
kono
parents:
diff changeset
1105 Patterns.Append
kono
parents:
diff changeset
1106 (Arguments.Table (Arguments.Last).Name_Patterns,
kono
parents:
diff changeset
1107 new String'(Arg));
kono
parents:
diff changeset
1108 Check_Regular_Expression (Arg);
kono
parents:
diff changeset
1109 end if;
kono
parents:
diff changeset
1110 end if;
kono
parents:
diff changeset
1111 end;
kono
parents:
diff changeset
1112 end loop;
kono
parents:
diff changeset
1113 end Scan_Args;
kono
parents:
diff changeset
1114
kono
parents:
diff changeset
1115 -----------
kono
parents:
diff changeset
1116 -- Usage --
kono
parents:
diff changeset
1117 -----------
kono
parents:
diff changeset
1118
kono
parents:
diff changeset
1119 procedure Usage is
kono
parents:
diff changeset
1120 begin
kono
parents:
diff changeset
1121 if not Usage_Output then
kono
parents:
diff changeset
1122 Usage_Needed := False;
kono
parents:
diff changeset
1123 Usage_Output := True;
kono
parents:
diff changeset
1124 Output.Write_Str ("Usage: ");
kono
parents:
diff changeset
1125 Osint.Write_Program_Name;
kono
parents:
diff changeset
1126 Output.Write_Line (" [switches] naming-pattern [naming-patterns]");
kono
parents:
diff changeset
1127 Output.Write_Line
kono
parents:
diff changeset
1128 (" {--and [switches] naming-pattern [naming-patterns]}");
kono
parents:
diff changeset
1129 Output.Write_Eol;
kono
parents:
diff changeset
1130 Output.Write_Line ("switches:");
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 Display_Usage_Version_And_Help;
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 Output.Write_Line
kono
parents:
diff changeset
1135 (" --subdirs=dir real obj/lib/exec dirs are subdirs");
kono
parents:
diff changeset
1136 Output.Write_Line
kono
parents:
diff changeset
1137 (" --no-backup do not create backup of project file");
kono
parents:
diff changeset
1138 Output.Write_Eol;
kono
parents:
diff changeset
1139
kono
parents:
diff changeset
1140 Output.Write_Line (" --and use different patterns");
kono
parents:
diff changeset
1141 Output.Write_Eol;
kono
parents:
diff changeset
1142
kono
parents:
diff changeset
1143 Output.Write_Line
kono
parents:
diff changeset
1144 (" -cfile create configuration pragmas file");
kono
parents:
diff changeset
1145 Output.Write_Line (" -ddir use dir as one of the source " &
kono
parents:
diff changeset
1146 "directories");
kono
parents:
diff changeset
1147 Output.Write_Line (" -Dfile get source directories from file");
kono
parents:
diff changeset
1148 Output.Write_Line
kono
parents:
diff changeset
1149 (" -eL follow symbolic links when processing " &
kono
parents:
diff changeset
1150 "project files");
kono
parents:
diff changeset
1151 Output.Write_Line (" -fpat foreign pattern");
kono
parents:
diff changeset
1152 Output.Write_Line
kono
parents:
diff changeset
1153 (" -gnateDsym=v preprocess with symbol definition");
kono
parents:
diff changeset
1154 Output.Write_Line (" -gnatep=data preprocess files with data file");
kono
parents:
diff changeset
1155 Output.Write_Line (" -h output this help message");
kono
parents:
diff changeset
1156 Output.Write_Line
kono
parents:
diff changeset
1157 (" -Pproj update or create project file proj");
kono
parents:
diff changeset
1158 Output.Write_Line (" -v verbose output");
kono
parents:
diff changeset
1159 Output.Write_Line (" -v -v very verbose output");
kono
parents:
diff changeset
1160 Output.Write_Line (" -xpat exclude pattern pat");
kono
parents:
diff changeset
1161 end if;
kono
parents:
diff changeset
1162 end Usage;
kono
parents:
diff changeset
1163
kono
parents:
diff changeset
1164 ---------------
kono
parents:
diff changeset
1165 -- Write_Eol --
kono
parents:
diff changeset
1166 ---------------
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 procedure Write_Eol is
kono
parents:
diff changeset
1169 begin
kono
parents:
diff changeset
1170 Write_A_String ((1 => ASCII.LF));
kono
parents:
diff changeset
1171 end Write_Eol;
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 --------------------
kono
parents:
diff changeset
1174 -- Write_A_String --
kono
parents:
diff changeset
1175 --------------------
kono
parents:
diff changeset
1176
kono
parents:
diff changeset
1177 procedure Write_A_String (S : String) is
kono
parents:
diff changeset
1178 Str : String (1 .. S'Length);
kono
parents:
diff changeset
1179
kono
parents:
diff changeset
1180 begin
kono
parents:
diff changeset
1181 if S'Length > 0 then
kono
parents:
diff changeset
1182 Str := S;
kono
parents:
diff changeset
1183
kono
parents:
diff changeset
1184 if Write (Output_FD, Str (1)'Address, Str'Length) /= Str'Length then
kono
parents:
diff changeset
1185 Fail_Program ("disk full");
kono
parents:
diff changeset
1186 end if;
kono
parents:
diff changeset
1187 end if;
kono
parents:
diff changeset
1188 end Write_A_String;
kono
parents:
diff changeset
1189
kono
parents:
diff changeset
1190 -- Start of processing for Gnatname
kono
parents:
diff changeset
1191
kono
parents:
diff changeset
1192 begin
kono
parents:
diff changeset
1193 -- Add the directory where gnatname is invoked in front of the
kono
parents:
diff changeset
1194 -- path, if gnatname is invoked with directory information.
kono
parents:
diff changeset
1195
kono
parents:
diff changeset
1196 declare
kono
parents:
diff changeset
1197 Command : constant String := Command_Name;
kono
parents:
diff changeset
1198
kono
parents:
diff changeset
1199 begin
kono
parents:
diff changeset
1200 for Index in reverse Command'Range loop
kono
parents:
diff changeset
1201 if Command (Index) = Directory_Separator then
kono
parents:
diff changeset
1202 declare
kono
parents:
diff changeset
1203 Absolute_Dir : constant String :=
kono
parents:
diff changeset
1204 Normalize_Pathname
kono
parents:
diff changeset
1205 (Command (Command'First .. Index));
kono
parents:
diff changeset
1206
kono
parents:
diff changeset
1207 PATH : constant String :=
kono
parents:
diff changeset
1208 Absolute_Dir &
kono
parents:
diff changeset
1209 Path_Separator &
kono
parents:
diff changeset
1210 Getenv ("PATH").all;
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 begin
kono
parents:
diff changeset
1213 Setenv ("PATH", PATH);
kono
parents:
diff changeset
1214 end;
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216 exit;
kono
parents:
diff changeset
1217 end if;
kono
parents:
diff changeset
1218 end loop;
kono
parents:
diff changeset
1219 end;
kono
parents:
diff changeset
1220
kono
parents:
diff changeset
1221 -- Initialize tables
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223 Arguments.Set_Last (0);
kono
parents:
diff changeset
1224 declare
kono
parents:
diff changeset
1225 New_Arguments : Argument_Data;
kono
parents:
diff changeset
1226 pragma Warnings (Off, New_Arguments);
kono
parents:
diff changeset
1227 -- Declaring this defaulted initialized object ensures that the new
kono
parents:
diff changeset
1228 -- allocated component of table Arguments is correctly initialized.
kono
parents:
diff changeset
1229 begin
kono
parents:
diff changeset
1230 Arguments.Append (New_Arguments);
kono
parents:
diff changeset
1231 end;
kono
parents:
diff changeset
1232
kono
parents:
diff changeset
1233 Patterns.Init (Arguments.Table (1).Directories);
kono
parents:
diff changeset
1234 Patterns.Set_Last (Arguments.Table (1).Directories, 0);
kono
parents:
diff changeset
1235 Patterns.Init (Arguments.Table (1).Name_Patterns);
kono
parents:
diff changeset
1236 Patterns.Set_Last (Arguments.Table (1).Name_Patterns, 0);
kono
parents:
diff changeset
1237 Patterns.Init (Arguments.Table (1).Excluded_Patterns);
kono
parents:
diff changeset
1238 Patterns.Set_Last (Arguments.Table (1).Excluded_Patterns, 0);
kono
parents:
diff changeset
1239 Patterns.Init (Arguments.Table (1).Foreign_Patterns);
kono
parents:
diff changeset
1240 Patterns.Set_Last (Arguments.Table (1).Foreign_Patterns, 0);
kono
parents:
diff changeset
1241
kono
parents:
diff changeset
1242 Preprocessor_Switches.Set_Last (0);
kono
parents:
diff changeset
1243
kono
parents:
diff changeset
1244 -- Get the arguments
kono
parents:
diff changeset
1245
kono
parents:
diff changeset
1246 Scan_Args;
kono
parents:
diff changeset
1247
kono
parents:
diff changeset
1248 if Create_Project then
kono
parents:
diff changeset
1249 declare
kono
parents:
diff changeset
1250 Gprname_Path : constant String_Access :=
kono
parents:
diff changeset
1251 Locate_Exec_On_Path ("gprname");
kono
parents:
diff changeset
1252 Arg_Len : Natural := Argument_Count;
kono
parents:
diff changeset
1253 Pos : Natural := 0;
kono
parents:
diff changeset
1254 Target : String_Access := null;
kono
parents:
diff changeset
1255 Success : Boolean := False;
kono
parents:
diff changeset
1256 begin
kono
parents:
diff changeset
1257 if Gprname_Path = null then
kono
parents:
diff changeset
1258 Fail_Program
kono
parents:
diff changeset
1259 ("project files are no longer supported by gnatname;" &
kono
parents:
diff changeset
1260 " use gprname instead");
kono
parents:
diff changeset
1261 end if;
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 Find_Program_Name;
kono
parents:
diff changeset
1264
kono
parents:
diff changeset
1265 if Name_Len > 9
kono
parents:
diff changeset
1266 and then Name_Buffer (Name_Len - 7 .. Name_Len) = "gnatname"
kono
parents:
diff changeset
1267 then
kono
parents:
diff changeset
1268 Target := new String'(Name_Buffer (1 .. Name_Len - 9));
kono
parents:
diff changeset
1269 Arg_Len := Arg_Len + 1;
kono
parents:
diff changeset
1270 end if;
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 declare
kono
parents:
diff changeset
1273 Args : Argument_List (1 .. Arg_Len);
kono
parents:
diff changeset
1274 begin
kono
parents:
diff changeset
1275 if Target /= null then
kono
parents:
diff changeset
1276 Args (1) := new String'("--target=" & Target.all);
kono
parents:
diff changeset
1277 Pos := 1;
kono
parents:
diff changeset
1278 end if;
kono
parents:
diff changeset
1279
kono
parents:
diff changeset
1280 for J in 1 .. Argument_Count loop
kono
parents:
diff changeset
1281 Pos := Pos + 1;
kono
parents:
diff changeset
1282 Args (Pos) := new String'(Argument (J));
kono
parents:
diff changeset
1283 end loop;
kono
parents:
diff changeset
1284
kono
parents:
diff changeset
1285 Spawn (Gprname_Path.all, Args, Success);
kono
parents:
diff changeset
1286
kono
parents:
diff changeset
1287 if Success then
kono
parents:
diff changeset
1288 Exit_Program (E_Success);
kono
parents:
diff changeset
1289 else
kono
parents:
diff changeset
1290 Exit_Program (E_Errors);
kono
parents:
diff changeset
1291 end if;
kono
parents:
diff changeset
1292 end;
kono
parents:
diff changeset
1293 end;
kono
parents:
diff changeset
1294 end if;
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 if Opt.Verbose_Mode then
kono
parents:
diff changeset
1297 Output_Version;
kono
parents:
diff changeset
1298 end if;
kono
parents:
diff changeset
1299
kono
parents:
diff changeset
1300 if Usage_Needed then
kono
parents:
diff changeset
1301 Usage;
kono
parents:
diff changeset
1302 end if;
kono
parents:
diff changeset
1303
kono
parents:
diff changeset
1304 -- If no Ada or foreign pattern was specified, print the usage and return
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 if Patterns.Last (Arguments.Table (Arguments.Last).Name_Patterns) = 0
kono
parents:
diff changeset
1307 and then
kono
parents:
diff changeset
1308 Patterns.Last (Arguments.Table (Arguments.Last).Foreign_Patterns) = 0
kono
parents:
diff changeset
1309 then
kono
parents:
diff changeset
1310 if Argument_Count = 0 then
kono
parents:
diff changeset
1311 Usage;
kono
parents:
diff changeset
1312 elsif not Usage_Output then
kono
parents:
diff changeset
1313 Try_Help;
kono
parents:
diff changeset
1314 end if;
kono
parents:
diff changeset
1315
kono
parents:
diff changeset
1316 return;
kono
parents:
diff changeset
1317 end if;
kono
parents:
diff changeset
1318
kono
parents:
diff changeset
1319 -- If no source directory was specified, use the current directory as the
kono
parents:
diff changeset
1320 -- unique directory. Note that if a file was specified with directory
kono
parents:
diff changeset
1321 -- information, the current directory is the directory of the specified
kono
parents:
diff changeset
1322 -- file.
kono
parents:
diff changeset
1323
kono
parents:
diff changeset
1324 if Patterns.Last (Arguments.Table (Arguments.Last).Directories) = 0 then
kono
parents:
diff changeset
1325 Patterns.Append
kono
parents:
diff changeset
1326 (Arguments.Table (Arguments.Last).Directories, new String'("."));
kono
parents:
diff changeset
1327 end if;
kono
parents:
diff changeset
1328
kono
parents:
diff changeset
1329 -- Initialize
kono
parents:
diff changeset
1330
kono
parents:
diff changeset
1331 declare
kono
parents:
diff changeset
1332 Prep_Switches : Argument_List
kono
parents:
diff changeset
1333 (1 .. Integer (Preprocessor_Switches.Last));
kono
parents:
diff changeset
1334
kono
parents:
diff changeset
1335 begin
kono
parents:
diff changeset
1336 for Index in Prep_Switches'Range loop
kono
parents:
diff changeset
1337 Prep_Switches (Index) := Preprocessor_Switches.Table (Index);
kono
parents:
diff changeset
1338 end loop;
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 Initialize
kono
parents:
diff changeset
1341 (File_Path => File_Path.all,
kono
parents:
diff changeset
1342 Preproc_Switches => Prep_Switches);
kono
parents:
diff changeset
1343 end;
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 -- Process each section successively
kono
parents:
diff changeset
1346
kono
parents:
diff changeset
1347 for J in 1 .. Arguments.Last loop
kono
parents:
diff changeset
1348 declare
kono
parents:
diff changeset
1349 Directories : Argument_List
kono
parents:
diff changeset
1350 (1 .. Integer
kono
parents:
diff changeset
1351 (Patterns.Last (Arguments.Table (J).Directories)));
kono
parents:
diff changeset
1352 Name_Patterns : Regexp_List
kono
parents:
diff changeset
1353 (1 .. Integer
kono
parents:
diff changeset
1354 (Patterns.Last (Arguments.Table (J).Name_Patterns)));
kono
parents:
diff changeset
1355 Excl_Patterns : Regexp_List
kono
parents:
diff changeset
1356 (1 .. Integer
kono
parents:
diff changeset
1357 (Patterns.Last (Arguments.Table (J).Excluded_Patterns)));
kono
parents:
diff changeset
1358 Frgn_Patterns : Regexp_List
kono
parents:
diff changeset
1359 (1 .. Integer
kono
parents:
diff changeset
1360 (Patterns.Last (Arguments.Table (J).Foreign_Patterns)));
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 begin
kono
parents:
diff changeset
1363 -- Build the Directories and Patterns arguments
kono
parents:
diff changeset
1364
kono
parents:
diff changeset
1365 for Index in Directories'Range loop
kono
parents:
diff changeset
1366 Directories (Index) :=
kono
parents:
diff changeset
1367 Arguments.Table (J).Directories.Table (Index);
kono
parents:
diff changeset
1368 end loop;
kono
parents:
diff changeset
1369
kono
parents:
diff changeset
1370 for Index in Name_Patterns'Range loop
kono
parents:
diff changeset
1371 Name_Patterns (Index) :=
kono
parents:
diff changeset
1372 Compile
kono
parents:
diff changeset
1373 (Arguments.Table (J).Name_Patterns.Table (Index).all,
kono
parents:
diff changeset
1374 Glob => True);
kono
parents:
diff changeset
1375 end loop;
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377 for Index in Excl_Patterns'Range loop
kono
parents:
diff changeset
1378 Excl_Patterns (Index) :=
kono
parents:
diff changeset
1379 Compile
kono
parents:
diff changeset
1380 (Arguments.Table (J).Excluded_Patterns.Table (Index).all,
kono
parents:
diff changeset
1381 Glob => True);
kono
parents:
diff changeset
1382 end loop;
kono
parents:
diff changeset
1383
kono
parents:
diff changeset
1384 for Index in Frgn_Patterns'Range loop
kono
parents:
diff changeset
1385 Frgn_Patterns (Index) :=
kono
parents:
diff changeset
1386 Compile
kono
parents:
diff changeset
1387 (Arguments.Table (J).Foreign_Patterns.Table (Index).all,
kono
parents:
diff changeset
1388 Glob => True);
kono
parents:
diff changeset
1389 end loop;
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 -- Call Prj.Makr.Process where the real work is done
kono
parents:
diff changeset
1392
kono
parents:
diff changeset
1393 Process
kono
parents:
diff changeset
1394 (Directories => Directories,
kono
parents:
diff changeset
1395 Name_Patterns => Name_Patterns,
kono
parents:
diff changeset
1396 Excluded_Patterns => Excl_Patterns,
kono
parents:
diff changeset
1397 Foreign_Patterns => Frgn_Patterns);
kono
parents:
diff changeset
1398 end;
kono
parents:
diff changeset
1399 end loop;
kono
parents:
diff changeset
1400
kono
parents:
diff changeset
1401 -- Finalize
kono
parents:
diff changeset
1402
kono
parents:
diff changeset
1403 Finalize;
kono
parents:
diff changeset
1404
kono
parents:
diff changeset
1405 if Opt.Verbose_Mode then
kono
parents:
diff changeset
1406 Output.Write_Eol;
kono
parents:
diff changeset
1407 end if;
kono
parents:
diff changeset
1408 end Gnatname;