annotate gcc/ada/clean.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
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 -- C L E A N --
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) 2003-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 ALI; use ALI;
kono
parents:
diff changeset
27 with Make_Util; use Make_Util;
kono
parents:
diff changeset
28 with Namet; use Namet;
kono
parents:
diff changeset
29 with Opt; use Opt;
kono
parents:
diff changeset
30 with Osint; use Osint;
kono
parents:
diff changeset
31 with Osint.M; use Osint.M;
kono
parents:
diff changeset
32 with Switch; use Switch;
kono
parents:
diff changeset
33 with Table;
kono
parents:
diff changeset
34 with Targparm;
kono
parents:
diff changeset
35 with Types; use Types;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 with GNAT.Command_Line; use GNAT.Command_Line;
kono
parents:
diff changeset
40 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
41 with GNAT.IO; use GNAT.IO;
kono
parents:
diff changeset
42 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 package body Clean is
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 -- Suffixes of various files
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 Assembly_Suffix : constant String := ".s";
kono
parents:
diff changeset
49 Tree_Suffix : constant String := ".adt";
kono
parents:
diff changeset
50 Object_Suffix : constant String := Get_Target_Object_Suffix.all;
kono
parents:
diff changeset
51 Debug_Suffix : constant String := ".dg";
kono
parents:
diff changeset
52 Repinfo_Suffix : constant String := ".rep";
kono
parents:
diff changeset
53 -- Suffix of representation info files
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 B_Start : constant String := "b~";
kono
parents:
diff changeset
56 -- Prefix of binder generated file, and number of actual characters used
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Object_Directory_Path : String_Access := null;
kono
parents:
diff changeset
59 -- The path name of the object directory, set with switch -D
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 Force_Deletions : Boolean := False;
kono
parents:
diff changeset
62 -- Set to True by switch -f. When True, attempts to delete non writable
kono
parents:
diff changeset
63 -- files will be done.
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 Do_Nothing : Boolean := False;
kono
parents:
diff changeset
66 -- Set to True when switch -n is specified. When True, no file is deleted.
kono
parents:
diff changeset
67 -- gnatclean only lists the files that would have been deleted if the
kono
parents:
diff changeset
68 -- switch -n had not been specified.
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 File_Deleted : Boolean := False;
kono
parents:
diff changeset
71 -- Set to True if at least one file has been deleted
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 Copyright_Displayed : Boolean := False;
kono
parents:
diff changeset
74 Usage_Displayed : Boolean := False;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 Project_File_Name : String_Access := null;
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 package Sources is new Table.Table
kono
parents:
diff changeset
79 (Table_Component_Type => File_Name_Type,
kono
parents:
diff changeset
80 Table_Index_Type => Natural,
kono
parents:
diff changeset
81 Table_Low_Bound => 0,
kono
parents:
diff changeset
82 Table_Initial => 10,
kono
parents:
diff changeset
83 Table_Increment => 100,
kono
parents:
diff changeset
84 Table_Name => "Clean.Processed_Projects");
kono
parents:
diff changeset
85 -- Table to store all the source files of a library unit: spec, body and
kono
parents:
diff changeset
86 -- subunits, to detect .dg files and delete them.
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 -----------------------------
kono
parents:
diff changeset
89 -- Other local subprograms --
kono
parents:
diff changeset
90 -----------------------------
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 function Assembly_File_Name (Source : File_Name_Type) return String;
kono
parents:
diff changeset
93 -- Returns the assembly file name corresponding to Source
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 procedure Clean_Executables;
kono
parents:
diff changeset
96 -- Do the cleaning work when no project file is specified
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 function Debug_File_Name (Source : File_Name_Type) return String;
kono
parents:
diff changeset
99 -- Name of the expanded source file corresponding to Source
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 procedure Delete (In_Directory : String; File : String);
kono
parents:
diff changeset
102 -- Delete one file, or list the file name if switch -n is specified
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 procedure Delete_Binder_Generated_Files
kono
parents:
diff changeset
105 (Dir : String;
kono
parents:
diff changeset
106 Source : File_Name_Type);
kono
parents:
diff changeset
107 -- Delete the binder generated file in directory Dir for Source, if they
kono
parents:
diff changeset
108 -- exist: for Unix these are b~<source>.ads, b~<source>.adb,
kono
parents:
diff changeset
109 -- b~<source>.ali and b~<source>.o.
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 procedure Display_Copyright;
kono
parents:
diff changeset
112 -- Display the Copyright notice. If called several times, display the
kono
parents:
diff changeset
113 -- Copyright notice only the first time.
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 procedure Initialize;
kono
parents:
diff changeset
116 -- Call the necessary package initializations
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 function Object_File_Name (Source : File_Name_Type) return String;
kono
parents:
diff changeset
119 -- Returns the object file name corresponding to Source
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 procedure Parse_Cmd_Line;
kono
parents:
diff changeset
122 -- Parse the command line
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 function Repinfo_File_Name (Source : File_Name_Type) return String;
kono
parents:
diff changeset
125 -- Returns the repinfo file name corresponding to Source
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 function Tree_File_Name (Source : File_Name_Type) return String;
kono
parents:
diff changeset
128 -- Returns the tree file name corresponding to Source
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 procedure Usage;
kono
parents:
diff changeset
131 -- Display the usage. If called several times, the usage is displayed only
kono
parents:
diff changeset
132 -- the first time.
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 ------------------------
kono
parents:
diff changeset
135 -- Assembly_File_Name --
kono
parents:
diff changeset
136 ------------------------
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 function Assembly_File_Name (Source : File_Name_Type) return String is
kono
parents:
diff changeset
139 Src : constant String := Get_Name_String (Source);
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 begin
kono
parents:
diff changeset
142 -- If the source name has an extension, then replace it with
kono
parents:
diff changeset
143 -- the assembly suffix.
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 for Index in reverse Src'First + 1 .. Src'Last loop
kono
parents:
diff changeset
146 if Src (Index) = '.' then
kono
parents:
diff changeset
147 return Src (Src'First .. Index - 1) & Assembly_Suffix;
kono
parents:
diff changeset
148 end if;
kono
parents:
diff changeset
149 end loop;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 -- If there is no dot, or if it is the first character, just add the
kono
parents:
diff changeset
152 -- assembly suffix.
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 return Src & Assembly_Suffix;
kono
parents:
diff changeset
155 end Assembly_File_Name;
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 -----------------------
kono
parents:
diff changeset
158 -- Clean_Executables --
kono
parents:
diff changeset
159 -----------------------
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 procedure Clean_Executables is
kono
parents:
diff changeset
162 Main_Source_File : File_Name_Type;
kono
parents:
diff changeset
163 -- Current main source
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 Main_Lib_File : File_Name_Type;
kono
parents:
diff changeset
166 -- ALI file of the current main
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 Lib_File : File_Name_Type;
kono
parents:
diff changeset
169 -- Current ALI file
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 Full_Lib_File : File_Name_Type;
kono
parents:
diff changeset
172 -- Full name of the current ALI file
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 Text : Text_Buffer_Ptr;
kono
parents:
diff changeset
175 The_ALI : ALI_Id;
kono
parents:
diff changeset
176 Found : Boolean;
kono
parents:
diff changeset
177 Source : Queue.Source_Info;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 begin
kono
parents:
diff changeset
180 Queue.Initialize;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 -- It does not really matter if there is or not an object file
kono
parents:
diff changeset
183 -- corresponding to an ALI file: if there is one, it will be deleted.
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 Opt.Check_Object_Consistency := False;
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 -- Proceed each executable one by one. Each source is marked as it is
kono
parents:
diff changeset
188 -- processed, so common sources between executables will not be
kono
parents:
diff changeset
189 -- processed several times.
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 for N_File in 1 .. Osint.Number_Of_Files loop
kono
parents:
diff changeset
192 Main_Source_File := Next_Main_Source;
kono
parents:
diff changeset
193 Main_Lib_File :=
kono
parents:
diff changeset
194 Osint.Lib_File_Name (Main_Source_File, Current_File_Index);
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 if Main_Lib_File /= No_File then
kono
parents:
diff changeset
197 Queue.Insert
kono
parents:
diff changeset
198 ((File => Main_Lib_File,
kono
parents:
diff changeset
199 Unit => No_Unit_Name,
kono
parents:
diff changeset
200 Index => 0));
kono
parents:
diff changeset
201 end if;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 while not Queue.Is_Empty loop
kono
parents:
diff changeset
204 Sources.Set_Last (0);
kono
parents:
diff changeset
205 Queue.Extract (Found, Source);
kono
parents:
diff changeset
206 pragma Assert (Found);
kono
parents:
diff changeset
207 pragma Assert (Source.File /= No_File);
kono
parents:
diff changeset
208 Lib_File := Source.File;
kono
parents:
diff changeset
209 Full_Lib_File := Osint.Full_Lib_File_Name (Lib_File);
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 -- If we have existing ALI file that is not read-only, process it
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 if Full_Lib_File /= No_File
kono
parents:
diff changeset
214 and then not Is_Readonly_Library (Full_Lib_File)
kono
parents:
diff changeset
215 then
kono
parents:
diff changeset
216 Text := Read_Library_Info (Lib_File);
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 if Text /= null then
kono
parents:
diff changeset
219 The_ALI :=
kono
parents:
diff changeset
220 Scan_ALI (Lib_File, Text, Ignore_ED => False, Err => True);
kono
parents:
diff changeset
221 Free (Text);
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 -- If no error was produced while loading this ALI file,
kono
parents:
diff changeset
224 -- insert into the queue all the unmarked withed sources.
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 if The_ALI /= No_ALI_Id then
kono
parents:
diff changeset
227 for J in ALIs.Table (The_ALI).First_Unit ..
kono
parents:
diff changeset
228 ALIs.Table (The_ALI).Last_Unit
kono
parents:
diff changeset
229 loop
kono
parents:
diff changeset
230 Sources.Increment_Last;
kono
parents:
diff changeset
231 Sources.Table (Sources.Last) :=
kono
parents:
diff changeset
232 ALI.Units.Table (J).Sfile;
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 for K in ALI.Units.Table (J).First_With ..
kono
parents:
diff changeset
235 ALI.Units.Table (J).Last_With
kono
parents:
diff changeset
236 loop
kono
parents:
diff changeset
237 if Withs.Table (K).Afile /= No_File then
kono
parents:
diff changeset
238 Queue.Insert
kono
parents:
diff changeset
239 ((File => Withs.Table (K).Afile,
kono
parents:
diff changeset
240 Unit => No_Unit_Name,
kono
parents:
diff changeset
241 Index => 0));
kono
parents:
diff changeset
242 end if;
kono
parents:
diff changeset
243 end loop;
kono
parents:
diff changeset
244 end loop;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 -- Look for subunits and put them in the Sources table
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 for J in ALIs.Table (The_ALI).First_Sdep ..
kono
parents:
diff changeset
249 ALIs.Table (The_ALI).Last_Sdep
kono
parents:
diff changeset
250 loop
kono
parents:
diff changeset
251 if Sdep.Table (J).Subunit_Name /= No_Name then
kono
parents:
diff changeset
252 Sources.Increment_Last;
kono
parents:
diff changeset
253 Sources.Table (Sources.Last) :=
kono
parents:
diff changeset
254 Sdep.Table (J).Sfile;
kono
parents:
diff changeset
255 end if;
kono
parents:
diff changeset
256 end loop;
kono
parents:
diff changeset
257 end if;
kono
parents:
diff changeset
258 end if;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 -- Now delete all existing files corresponding to this ALI file
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 declare
kono
parents:
diff changeset
263 Obj_Dir : constant String :=
kono
parents:
diff changeset
264 Dir_Name (Get_Name_String (Full_Lib_File));
kono
parents:
diff changeset
265 Obj : constant String := Object_File_Name (Lib_File);
kono
parents:
diff changeset
266 Adt : constant String := Tree_File_Name (Lib_File);
kono
parents:
diff changeset
267 Asm : constant String := Assembly_File_Name (Lib_File);
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 begin
kono
parents:
diff changeset
270 Delete (Obj_Dir, Get_Name_String (Lib_File));
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if Is_Regular_File (Obj_Dir & Dir_Separator & Obj) then
kono
parents:
diff changeset
273 Delete (Obj_Dir, Obj);
kono
parents:
diff changeset
274 end if;
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 if Is_Regular_File (Obj_Dir & Dir_Separator & Adt) then
kono
parents:
diff changeset
277 Delete (Obj_Dir, Adt);
kono
parents:
diff changeset
278 end if;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 if Is_Regular_File (Obj_Dir & Dir_Separator & Asm) then
kono
parents:
diff changeset
281 Delete (Obj_Dir, Asm);
kono
parents:
diff changeset
282 end if;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 -- Delete expanded source files (.dg) and/or repinfo files
kono
parents:
diff changeset
285 -- (.rep) if any
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 for J in 1 .. Sources.Last loop
kono
parents:
diff changeset
288 declare
kono
parents:
diff changeset
289 Deb : constant String :=
kono
parents:
diff changeset
290 Debug_File_Name (Sources.Table (J));
kono
parents:
diff changeset
291 Rep : constant String :=
kono
parents:
diff changeset
292 Repinfo_File_Name (Sources.Table (J));
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 begin
kono
parents:
diff changeset
295 if Is_Regular_File (Obj_Dir & Dir_Separator & Deb) then
kono
parents:
diff changeset
296 Delete (Obj_Dir, Deb);
kono
parents:
diff changeset
297 end if;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 if Is_Regular_File (Obj_Dir & Dir_Separator & Rep) then
kono
parents:
diff changeset
300 Delete (Obj_Dir, Rep);
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302 end;
kono
parents:
diff changeset
303 end loop;
kono
parents:
diff changeset
304 end;
kono
parents:
diff changeset
305 end if;
kono
parents:
diff changeset
306 end loop;
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 -- Delete the executable, if it exists, and the binder generated
kono
parents:
diff changeset
309 -- files, if any.
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 if not Compile_Only then
kono
parents:
diff changeset
312 declare
kono
parents:
diff changeset
313 Source : constant File_Name_Type :=
kono
parents:
diff changeset
314 Strip_Suffix (Main_Lib_File);
kono
parents:
diff changeset
315 Executable : constant String :=
kono
parents:
diff changeset
316 Get_Name_String (Executable_Name (Source));
kono
parents:
diff changeset
317 begin
kono
parents:
diff changeset
318 if Is_Regular_File (Executable) then
kono
parents:
diff changeset
319 Delete ("", Executable);
kono
parents:
diff changeset
320 end if;
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 Delete_Binder_Generated_Files (Get_Current_Dir, Source);
kono
parents:
diff changeset
323 end;
kono
parents:
diff changeset
324 end if;
kono
parents:
diff changeset
325 end loop;
kono
parents:
diff changeset
326 end Clean_Executables;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 ---------------------
kono
parents:
diff changeset
329 -- Debug_File_Name --
kono
parents:
diff changeset
330 ---------------------
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 function Debug_File_Name (Source : File_Name_Type) return String is
kono
parents:
diff changeset
333 begin
kono
parents:
diff changeset
334 return Get_Name_String (Source) & Debug_Suffix;
kono
parents:
diff changeset
335 end Debug_File_Name;
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 ------------
kono
parents:
diff changeset
338 -- Delete --
kono
parents:
diff changeset
339 ------------
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 procedure Delete (In_Directory : String; File : String) is
kono
parents:
diff changeset
342 Full_Name : String (1 .. In_Directory'Length + File'Length + 1);
kono
parents:
diff changeset
343 Last : Natural := 0;
kono
parents:
diff changeset
344 Success : Boolean;
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 begin
kono
parents:
diff changeset
347 -- Indicate that at least one file is deleted or is to be deleted
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 File_Deleted := True;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 -- Build the path name of the file to delete
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 Last := In_Directory'Length;
kono
parents:
diff changeset
354 Full_Name (1 .. Last) := In_Directory;
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 if Last > 0 and then Full_Name (Last) /= Directory_Separator then
kono
parents:
diff changeset
357 Last := Last + 1;
kono
parents:
diff changeset
358 Full_Name (Last) := Directory_Separator;
kono
parents:
diff changeset
359 end if;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 Full_Name (Last + 1 .. Last + File'Length) := File;
kono
parents:
diff changeset
362 Last := Last + File'Length;
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 -- If switch -n was used, simply output the path name
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 if Do_Nothing then
kono
parents:
diff changeset
367 Put_Line (Full_Name (1 .. Last));
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 -- Otherwise, delete the file if it is writable
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 else
kono
parents:
diff changeset
372 if Force_Deletions
kono
parents:
diff changeset
373 or else Is_Writable_File (Full_Name (1 .. Last))
kono
parents:
diff changeset
374 or else Is_Symbolic_Link (Full_Name (1 .. Last))
kono
parents:
diff changeset
375 then
kono
parents:
diff changeset
376 Delete_File (Full_Name (1 .. Last), Success);
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 -- Here if no deletion required
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 else
kono
parents:
diff changeset
381 Success := False;
kono
parents:
diff changeset
382 end if;
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 if Verbose_Mode or else not Quiet_Output then
kono
parents:
diff changeset
385 if not Success then
kono
parents:
diff changeset
386 Put ("Warning: """);
kono
parents:
diff changeset
387 Put (Full_Name (1 .. Last));
kono
parents:
diff changeset
388 Put_Line (""" could not be deleted");
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 else
kono
parents:
diff changeset
391 Put ("""");
kono
parents:
diff changeset
392 Put (Full_Name (1 .. Last));
kono
parents:
diff changeset
393 Put_Line (""" has been deleted");
kono
parents:
diff changeset
394 end if;
kono
parents:
diff changeset
395 end if;
kono
parents:
diff changeset
396 end if;
kono
parents:
diff changeset
397 end Delete;
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 -----------------------------------
kono
parents:
diff changeset
400 -- Delete_Binder_Generated_Files --
kono
parents:
diff changeset
401 -----------------------------------
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 procedure Delete_Binder_Generated_Files
kono
parents:
diff changeset
404 (Dir : String;
kono
parents:
diff changeset
405 Source : File_Name_Type)
kono
parents:
diff changeset
406 is
kono
parents:
diff changeset
407 Source_Name : constant String := Get_Name_String (Source);
kono
parents:
diff changeset
408 Current : constant String := Get_Current_Dir;
kono
parents:
diff changeset
409 Last : constant Positive := B_Start'Length + Source_Name'Length;
kono
parents:
diff changeset
410 File_Name : String (1 .. Last + 4);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 begin
kono
parents:
diff changeset
413 Change_Dir (Dir);
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 -- Build the file name (before the extension)
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 File_Name (1 .. B_Start'Length) := B_Start;
kono
parents:
diff changeset
418 File_Name (B_Start'Length + 1 .. Last) := Source_Name;
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 -- Spec
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 File_Name (Last + 1 .. Last + 4) := ".ads";
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 if Is_Regular_File (File_Name (1 .. Last + 4)) then
kono
parents:
diff changeset
425 Delete (Dir, File_Name (1 .. Last + 4));
kono
parents:
diff changeset
426 end if;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 -- Body
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 File_Name (Last + 1 .. Last + 4) := ".adb";
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 if Is_Regular_File (File_Name (1 .. Last + 4)) then
kono
parents:
diff changeset
433 Delete (Dir, File_Name (1 .. Last + 4));
kono
parents:
diff changeset
434 end if;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 -- ALI file
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 File_Name (Last + 1 .. Last + 4) := ".ali";
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 if Is_Regular_File (File_Name (1 .. Last + 4)) then
kono
parents:
diff changeset
441 Delete (Dir, File_Name (1 .. Last + 4));
kono
parents:
diff changeset
442 end if;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 -- Object file
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 File_Name (Last + 1 .. Last + Object_Suffix'Length) := Object_Suffix;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 if Is_Regular_File (File_Name (1 .. Last + Object_Suffix'Length)) then
kono
parents:
diff changeset
449 Delete (Dir, File_Name (1 .. Last + Object_Suffix'Length));
kono
parents:
diff changeset
450 end if;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 -- Change back to previous directory
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 Change_Dir (Current);
kono
parents:
diff changeset
455 end Delete_Binder_Generated_Files;
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 -----------------------
kono
parents:
diff changeset
458 -- Display_Copyright --
kono
parents:
diff changeset
459 -----------------------
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 procedure Display_Copyright is
kono
parents:
diff changeset
462 begin
kono
parents:
diff changeset
463 if not Copyright_Displayed then
kono
parents:
diff changeset
464 Copyright_Displayed := True;
kono
parents:
diff changeset
465 Display_Version ("GNATCLEAN", "2003");
kono
parents:
diff changeset
466 end if;
kono
parents:
diff changeset
467 end Display_Copyright;
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 ---------------
kono
parents:
diff changeset
470 -- Gnatclean --
kono
parents:
diff changeset
471 ---------------
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 procedure Gnatclean is
kono
parents:
diff changeset
474 begin
kono
parents:
diff changeset
475 -- Do the necessary initializations
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 Clean.Initialize;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 -- Parse the command line, getting the switches and the executable names
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 Parse_Cmd_Line;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 if Verbose_Mode then
kono
parents:
diff changeset
484 Display_Copyright;
kono
parents:
diff changeset
485 end if;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 Osint.Add_Default_Search_Dirs;
kono
parents:
diff changeset
488 Targparm.Get_Target_Parameters;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 if Osint.Number_Of_Files = 0 then
kono
parents:
diff changeset
491 if Argument_Count = 0 then
kono
parents:
diff changeset
492 Usage;
kono
parents:
diff changeset
493 else
kono
parents:
diff changeset
494 Try_Help;
kono
parents:
diff changeset
495 end if;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 return;
kono
parents:
diff changeset
498 end if;
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 if Verbose_Mode then
kono
parents:
diff changeset
501 New_Line;
kono
parents:
diff changeset
502 end if;
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504 if Project_File_Name /= null then
kono
parents:
diff changeset
505 declare
kono
parents:
diff changeset
506 Gprclean_Path : constant String_Access :=
kono
parents:
diff changeset
507 Locate_Exec_On_Path ("gprclean");
kono
parents:
diff changeset
508 Arg_Len : Natural := Argument_Count;
kono
parents:
diff changeset
509 Pos : Natural := 0;
kono
parents:
diff changeset
510 Target : String_Access := null;
kono
parents:
diff changeset
511 Success : Boolean := False;
kono
parents:
diff changeset
512 begin
kono
parents:
diff changeset
513 if Gprclean_Path = null then
kono
parents:
diff changeset
514 Fail_Program
kono
parents:
diff changeset
515 ("project files are no longer supported by gnatclean;" &
kono
parents:
diff changeset
516 " use gprclean instead");
kono
parents:
diff changeset
517 end if;
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 Find_Program_Name;
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 if Name_Len > 10
kono
parents:
diff changeset
522 and then Name_Buffer (Name_Len - 8 .. Name_Len) = "gnatclean"
kono
parents:
diff changeset
523 then
kono
parents:
diff changeset
524 Target := new String'(Name_Buffer (1 .. Name_Len - 9));
kono
parents:
diff changeset
525 Arg_Len := Arg_Len + 1;
kono
parents:
diff changeset
526 end if;
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 declare
kono
parents:
diff changeset
529 Args : Argument_List (1 .. Arg_Len);
kono
parents:
diff changeset
530 begin
kono
parents:
diff changeset
531 if Target /= null then
kono
parents:
diff changeset
532 Args (1) := new String'("--target=" & Target.all);
kono
parents:
diff changeset
533 Pos := 1;
kono
parents:
diff changeset
534 end if;
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 for J in 1 .. Argument_Count loop
kono
parents:
diff changeset
537 Pos := Pos + 1;
kono
parents:
diff changeset
538 Args (Pos) := new String'(Argument (J));
kono
parents:
diff changeset
539 end loop;
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 Spawn (Gprclean_Path.all, Args, Success);
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 if Success then
kono
parents:
diff changeset
544 Exit_Program (E_Success);
kono
parents:
diff changeset
545 else
kono
parents:
diff changeset
546 Exit_Program (E_Errors);
kono
parents:
diff changeset
547 end if;
kono
parents:
diff changeset
548 end;
kono
parents:
diff changeset
549 end;
kono
parents:
diff changeset
550 end if;
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 Clean_Executables;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 -- In verbose mode, if Delete has not been called, indicate that no file
kono
parents:
diff changeset
555 -- needs to be deleted.
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 if Verbose_Mode and (not File_Deleted) then
kono
parents:
diff changeset
558 New_Line;
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 if Do_Nothing then
kono
parents:
diff changeset
561 Put_Line ("No file needs to be deleted");
kono
parents:
diff changeset
562 else
kono
parents:
diff changeset
563 Put_Line ("No file has been deleted");
kono
parents:
diff changeset
564 end if;
kono
parents:
diff changeset
565 end if;
kono
parents:
diff changeset
566 end Gnatclean;
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 ----------------
kono
parents:
diff changeset
569 -- Initialize --
kono
parents:
diff changeset
570 ----------------
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 procedure Initialize is
kono
parents:
diff changeset
573 begin
kono
parents:
diff changeset
574 -- Reset global variables
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 Free (Object_Directory_Path);
kono
parents:
diff changeset
577 Do_Nothing := False;
kono
parents:
diff changeset
578 File_Deleted := False;
kono
parents:
diff changeset
579 Copyright_Displayed := False;
kono
parents:
diff changeset
580 Usage_Displayed := False;
kono
parents:
diff changeset
581 end Initialize;
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 ----------------------
kono
parents:
diff changeset
584 -- Object_File_Name --
kono
parents:
diff changeset
585 ----------------------
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 function Object_File_Name (Source : File_Name_Type) return String is
kono
parents:
diff changeset
588 Src : constant String := Get_Name_String (Source);
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 begin
kono
parents:
diff changeset
591 -- If the source name has an extension, then replace it with
kono
parents:
diff changeset
592 -- the Object suffix.
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 for Index in reverse Src'First + 1 .. Src'Last loop
kono
parents:
diff changeset
595 if Src (Index) = '.' then
kono
parents:
diff changeset
596 return Src (Src'First .. Index - 1) & Object_Suffix;
kono
parents:
diff changeset
597 end if;
kono
parents:
diff changeset
598 end loop;
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 -- If there is no dot, or if it is the first character, just add the
kono
parents:
diff changeset
601 -- ALI suffix.
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 return Src & Object_Suffix;
kono
parents:
diff changeset
604 end Object_File_Name;
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 --------------------
kono
parents:
diff changeset
607 -- Parse_Cmd_Line --
kono
parents:
diff changeset
608 --------------------
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 procedure Parse_Cmd_Line is
kono
parents:
diff changeset
611 Last : constant Natural := Argument_Count;
kono
parents:
diff changeset
612 Index : Positive;
kono
parents:
diff changeset
613 Source_Index : Int := 0;
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 begin
kono
parents:
diff changeset
618 -- First, check for --version and --help
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 Check_Version_And_Help ("GNATCLEAN", "2003");
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 -- First, check for switch -P and, if found and gprclean is available,
kono
parents:
diff changeset
623 -- silently invoke gprclean, with switch --target if not on a native
kono
parents:
diff changeset
624 -- platform.
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 declare
kono
parents:
diff changeset
627 Arg_Len : Positive := Argument_Count;
kono
parents:
diff changeset
628 Call_Gprclean : Boolean := False;
kono
parents:
diff changeset
629 Gprclean : String_Access := null;
kono
parents:
diff changeset
630 Pos : Natural := 0;
kono
parents:
diff changeset
631 Success : Boolean;
kono
parents:
diff changeset
632 Target : String_Access := null;
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 begin
kono
parents:
diff changeset
635 Find_Program_Name;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 if Name_Len >= 9
kono
parents:
diff changeset
638 and then Name_Buffer (Name_Len - 8 .. Name_Len) = "gnatclean"
kono
parents:
diff changeset
639 then
kono
parents:
diff changeset
640 if Name_Len > 9 then
kono
parents:
diff changeset
641 Target := new String'(Name_Buffer (1 .. Name_Len - 10));
kono
parents:
diff changeset
642 Arg_Len := Arg_Len + 1;
kono
parents:
diff changeset
643 end if;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 for J in 1 .. Argument_Count loop
kono
parents:
diff changeset
646 declare
kono
parents:
diff changeset
647 Arg : constant String := Argument (J);
kono
parents:
diff changeset
648 begin
kono
parents:
diff changeset
649 if Arg'Length >= 2
kono
parents:
diff changeset
650 and then Arg (Arg'First .. Arg'First + 1) = "-P"
kono
parents:
diff changeset
651 then
kono
parents:
diff changeset
652 Call_Gprclean := True;
kono
parents:
diff changeset
653 exit;
kono
parents:
diff changeset
654 end if;
kono
parents:
diff changeset
655 end;
kono
parents:
diff changeset
656 end loop;
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 if Call_Gprclean then
kono
parents:
diff changeset
659 Gprclean := Locate_Exec_On_Path (Exec_Name => "gprclean");
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 if Gprclean /= null then
kono
parents:
diff changeset
662 declare
kono
parents:
diff changeset
663 Args : Argument_List (1 .. Arg_Len);
kono
parents:
diff changeset
664 begin
kono
parents:
diff changeset
665 if Target /= null then
kono
parents:
diff changeset
666 Args (1) := new String'("--target=" & Target.all);
kono
parents:
diff changeset
667 Pos := 1;
kono
parents:
diff changeset
668 end if;
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 for J in 1 .. Argument_Count loop
kono
parents:
diff changeset
671 Pos := Pos + 1;
kono
parents:
diff changeset
672 Args (Pos) := new String'(Argument (J));
kono
parents:
diff changeset
673 end loop;
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 Spawn (Gprclean.all, Args, Success);
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 Free (Gprclean);
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 if Success then
kono
parents:
diff changeset
680 Exit_Program (E_Success);
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 else
kono
parents:
diff changeset
683 Exit_Program (E_Fatal);
kono
parents:
diff changeset
684 end if;
kono
parents:
diff changeset
685 end;
kono
parents:
diff changeset
686 end if;
kono
parents:
diff changeset
687 end if;
kono
parents:
diff changeset
688 end if;
kono
parents:
diff changeset
689 end;
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 Index := 1;
kono
parents:
diff changeset
692 while Index <= Last loop
kono
parents:
diff changeset
693 declare
kono
parents:
diff changeset
694 Arg : constant String := Argument (Index);
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 procedure Bad_Argument;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
697 pragma No_Return (Bad_Argument);
111
kono
parents:
diff changeset
698 -- Signal bad argument
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 ------------------
kono
parents:
diff changeset
701 -- Bad_Argument --
kono
parents:
diff changeset
702 ------------------
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 procedure Bad_Argument is
kono
parents:
diff changeset
705 begin
kono
parents:
diff changeset
706 Fail ("invalid argument """ & Arg & """");
kono
parents:
diff changeset
707 end Bad_Argument;
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 begin
kono
parents:
diff changeset
710 if Arg'Length /= 0 then
kono
parents:
diff changeset
711 if Arg (1) = '-' then
kono
parents:
diff changeset
712 if Arg'Length = 1 then
kono
parents:
diff changeset
713 Bad_Argument;
kono
parents:
diff changeset
714 end if;
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 case Arg (2) is
kono
parents:
diff changeset
717 when '-' =>
kono
parents:
diff changeset
718 if Arg'Length > Subdirs_Option'Length
kono
parents:
diff changeset
719 and then
kono
parents:
diff changeset
720 Arg (1 .. Subdirs_Option'Length) = Subdirs_Option
kono
parents:
diff changeset
721 then
kono
parents:
diff changeset
722 null;
kono
parents:
diff changeset
723 -- Subdirs are only used in gprclean
kono
parents:
diff changeset
724
kono
parents:
diff changeset
725 elsif Arg = Make_Util.Unchecked_Shared_Lib_Imports then
kono
parents:
diff changeset
726 Opt.Unchecked_Shared_Lib_Imports := True;
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 else
kono
parents:
diff changeset
729 Bad_Argument;
kono
parents:
diff changeset
730 end if;
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 when 'a' =>
kono
parents:
diff changeset
733 if Arg'Length < 4 then
kono
parents:
diff changeset
734 Bad_Argument;
kono
parents:
diff changeset
735 end if;
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 if Arg (3) = 'O' then
kono
parents:
diff changeset
738 Add_Lib_Search_Dir (Arg (4 .. Arg'Last));
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 elsif Arg (3) = 'P' then
kono
parents:
diff changeset
741 null;
kono
parents:
diff changeset
742 -- This is only for gprclean
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 else
kono
parents:
diff changeset
745 Bad_Argument;
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 when 'c' =>
kono
parents:
diff changeset
749 Compile_Only := True;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 when 'D' =>
kono
parents:
diff changeset
752 if Object_Directory_Path /= null then
kono
parents:
diff changeset
753 Fail ("duplicate -D switch");
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 elsif Project_File_Name /= null then
kono
parents:
diff changeset
756 Fail ("-P and -D cannot be used simultaneously");
kono
parents:
diff changeset
757 end if;
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 if Arg'Length > 2 then
kono
parents:
diff changeset
760 declare
kono
parents:
diff changeset
761 Dir : constant String := Arg (3 .. Arg'Last);
kono
parents:
diff changeset
762 begin
kono
parents:
diff changeset
763 if not Is_Directory (Dir) then
kono
parents:
diff changeset
764 Fail (Dir & " is not a directory");
kono
parents:
diff changeset
765 else
kono
parents:
diff changeset
766 Add_Lib_Search_Dir (Dir);
kono
parents:
diff changeset
767 end if;
kono
parents:
diff changeset
768 end;
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 else
kono
parents:
diff changeset
771 if Index = Last then
kono
parents:
diff changeset
772 Fail ("no directory specified after -D");
kono
parents:
diff changeset
773 end if;
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 Index := Index + 1;
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 declare
kono
parents:
diff changeset
778 Dir : constant String := Argument (Index);
kono
parents:
diff changeset
779 begin
kono
parents:
diff changeset
780 if not Is_Directory (Dir) then
kono
parents:
diff changeset
781 Fail (Dir & " is not a directory");
kono
parents:
diff changeset
782 else
kono
parents:
diff changeset
783 Add_Lib_Search_Dir (Dir);
kono
parents:
diff changeset
784 end if;
kono
parents:
diff changeset
785 end;
kono
parents:
diff changeset
786 end if;
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 when 'e' =>
kono
parents:
diff changeset
789 if Arg = "-eL" then
kono
parents:
diff changeset
790 Follow_Links_For_Files := True;
kono
parents:
diff changeset
791 Follow_Links_For_Dirs := True;
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 else
kono
parents:
diff changeset
794 Bad_Argument;
kono
parents:
diff changeset
795 end if;
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 when 'f' =>
kono
parents:
diff changeset
798 Force_Deletions := True;
kono
parents:
diff changeset
799 Directories_Must_Exist_In_Projects := False;
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 when 'F' =>
kono
parents:
diff changeset
802 Full_Path_Name_For_Brief_Errors := True;
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 when 'h' =>
kono
parents:
diff changeset
805 Usage;
kono
parents:
diff changeset
806
kono
parents:
diff changeset
807 when 'i' =>
kono
parents:
diff changeset
808 if Arg'Length = 2 then
kono
parents:
diff changeset
809 Bad_Argument;
kono
parents:
diff changeset
810 end if;
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 Source_Index := 0;
kono
parents:
diff changeset
813
kono
parents:
diff changeset
814 for J in 3 .. Arg'Last loop
kono
parents:
diff changeset
815 if Arg (J) not in '0' .. '9' then
kono
parents:
diff changeset
816 Bad_Argument;
kono
parents:
diff changeset
817 end if;
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 Source_Index :=
kono
parents:
diff changeset
820 (20 * Source_Index) +
kono
parents:
diff changeset
821 (Character'Pos (Arg (J)) - Character'Pos ('0'));
kono
parents:
diff changeset
822 end loop;
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 when 'I' =>
kono
parents:
diff changeset
825 if Arg = "-I-" then
kono
parents:
diff changeset
826 Opt.Look_In_Primary_Dir := False;
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 else
kono
parents:
diff changeset
829 if Arg'Length = 2 then
kono
parents:
diff changeset
830 Bad_Argument;
kono
parents:
diff changeset
831 end if;
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 Add_Lib_Search_Dir (Arg (3 .. Arg'Last));
kono
parents:
diff changeset
834 end if;
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 when 'n' =>
kono
parents:
diff changeset
837 Do_Nothing := True;
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 when 'P' =>
kono
parents:
diff changeset
840 if Project_File_Name /= null then
kono
parents:
diff changeset
841 Fail ("multiple -P switches");
kono
parents:
diff changeset
842
kono
parents:
diff changeset
843 elsif Object_Directory_Path /= null then
kono
parents:
diff changeset
844 Fail ("-D and -P cannot be used simultaneously");
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 end if;
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 if Arg'Length > 2 then
kono
parents:
diff changeset
849 declare
kono
parents:
diff changeset
850 Prj : constant String := Arg (3 .. Arg'Last);
kono
parents:
diff changeset
851 begin
kono
parents:
diff changeset
852 if Prj'Length > 1
kono
parents:
diff changeset
853 and then Prj (Prj'First) = '='
kono
parents:
diff changeset
854 then
kono
parents:
diff changeset
855 Project_File_Name :=
kono
parents:
diff changeset
856 new String'
kono
parents:
diff changeset
857 (Prj (Prj'First + 1 .. Prj'Last));
kono
parents:
diff changeset
858 else
kono
parents:
diff changeset
859 Project_File_Name := new String'(Prj);
kono
parents:
diff changeset
860 end if;
kono
parents:
diff changeset
861 end;
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 else
kono
parents:
diff changeset
864 if Index = Last then
kono
parents:
diff changeset
865 Fail ("no project specified after -P");
kono
parents:
diff changeset
866 end if;
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 Index := Index + 1;
kono
parents:
diff changeset
869 Project_File_Name := new String'(Argument (Index));
kono
parents:
diff changeset
870 end if;
kono
parents:
diff changeset
871
kono
parents:
diff changeset
872 when 'q' =>
kono
parents:
diff changeset
873 Quiet_Output := True;
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 when 'r' =>
kono
parents:
diff changeset
876 null;
kono
parents:
diff changeset
877 -- This is only for gprclean
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 when 'v' =>
kono
parents:
diff changeset
880 if Arg = "-v" then
kono
parents:
diff changeset
881 Verbose_Mode := True;
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 elsif Arg = "-vP0"
kono
parents:
diff changeset
884 or else Arg = "-vP1"
kono
parents:
diff changeset
885 or else Arg = "-vP2"
kono
parents:
diff changeset
886 then
kono
parents:
diff changeset
887 null;
kono
parents:
diff changeset
888 -- This is only for gprclean
kono
parents:
diff changeset
889
kono
parents:
diff changeset
890 else
kono
parents:
diff changeset
891 Bad_Argument;
kono
parents:
diff changeset
892 end if;
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 when 'X' =>
kono
parents:
diff changeset
895 if Arg'Length = 2 then
kono
parents:
diff changeset
896 Bad_Argument;
kono
parents:
diff changeset
897 end if;
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 when others =>
kono
parents:
diff changeset
900 Bad_Argument;
kono
parents:
diff changeset
901 end case;
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 else
kono
parents:
diff changeset
904 Add_File (Arg, Source_Index);
kono
parents:
diff changeset
905 end if;
kono
parents:
diff changeset
906 end if;
kono
parents:
diff changeset
907 end;
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 Index := Index + 1;
kono
parents:
diff changeset
910 end loop;
kono
parents:
diff changeset
911 end Parse_Cmd_Line;
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 -----------------------
kono
parents:
diff changeset
914 -- Repinfo_File_Name --
kono
parents:
diff changeset
915 -----------------------
kono
parents:
diff changeset
916
kono
parents:
diff changeset
917 function Repinfo_File_Name (Source : File_Name_Type) return String is
kono
parents:
diff changeset
918 begin
kono
parents:
diff changeset
919 return Get_Name_String (Source) & Repinfo_Suffix;
kono
parents:
diff changeset
920 end Repinfo_File_Name;
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 --------------------
kono
parents:
diff changeset
923 -- Tree_File_Name --
kono
parents:
diff changeset
924 --------------------
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 function Tree_File_Name (Source : File_Name_Type) return String is
kono
parents:
diff changeset
927 Src : constant String := Get_Name_String (Source);
kono
parents:
diff changeset
928
kono
parents:
diff changeset
929 begin
kono
parents:
diff changeset
930 -- If source name has an extension, then replace it with the tree suffix
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 for Index in reverse Src'First + 1 .. Src'Last loop
kono
parents:
diff changeset
933 if Src (Index) = '.' then
kono
parents:
diff changeset
934 return Src (Src'First .. Index - 1) & Tree_Suffix;
kono
parents:
diff changeset
935 end if;
kono
parents:
diff changeset
936 end loop;
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 -- If there is no dot, or if it is the first character, just add the
kono
parents:
diff changeset
939 -- tree suffix.
kono
parents:
diff changeset
940
kono
parents:
diff changeset
941 return Src & Tree_Suffix;
kono
parents:
diff changeset
942 end Tree_File_Name;
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 -----------
kono
parents:
diff changeset
945 -- Usage --
kono
parents:
diff changeset
946 -----------
kono
parents:
diff changeset
947
kono
parents:
diff changeset
948 procedure Usage is
kono
parents:
diff changeset
949 begin
kono
parents:
diff changeset
950 if not Usage_Displayed then
kono
parents:
diff changeset
951 Usage_Displayed := True;
kono
parents:
diff changeset
952 Display_Copyright;
kono
parents:
diff changeset
953 Put_Line ("Usage: gnatclean [switches] {[-innn] name}");
kono
parents:
diff changeset
954 New_Line;
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956 Display_Usage_Version_And_Help;
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 Put_Line (" names is one or more file names from which " &
kono
parents:
diff changeset
959 "the .adb or .ads suffix may be omitted");
kono
parents:
diff changeset
960 Put_Line (" names may be omitted if -P<project> is specified");
kono
parents:
diff changeset
961 New_Line;
kono
parents:
diff changeset
962
kono
parents:
diff changeset
963 Put_Line (" --subdirs=dir real obj/lib/exec dirs are subdirs");
kono
parents:
diff changeset
964 Put_Line (" " & Make_Util.Unchecked_Shared_Lib_Imports);
kono
parents:
diff changeset
965 Put_Line (" Allow shared libraries to import static libraries");
kono
parents:
diff changeset
966 New_Line;
kono
parents:
diff changeset
967
kono
parents:
diff changeset
968 Put_Line (" -c Only delete compiler generated files");
kono
parents:
diff changeset
969 Put_Line (" -D dir Specify dir as the object library");
kono
parents:
diff changeset
970 Put_Line (" -eL Follow symbolic links when processing " &
kono
parents:
diff changeset
971 "project files");
kono
parents:
diff changeset
972 Put_Line (" -f Force deletions of unwritable files");
kono
parents:
diff changeset
973 Put_Line (" -F Full project path name " &
kono
parents:
diff changeset
974 "in brief error messages");
kono
parents:
diff changeset
975 Put_Line (" -h Display this message");
kono
parents:
diff changeset
976 Put_Line (" -innn Index of unit in source for following names");
kono
parents:
diff changeset
977 Put_Line (" -n Nothing to do: only list files to delete");
kono
parents:
diff changeset
978 Put_Line (" -Pproj Use GNAT Project File proj");
kono
parents:
diff changeset
979 Put_Line (" -q Be quiet/terse");
kono
parents:
diff changeset
980 Put_Line (" -r Clean all projects recursively");
kono
parents:
diff changeset
981 Put_Line (" -v Verbose mode");
kono
parents:
diff changeset
982 Put_Line (" -vPx Specify verbosity when parsing " &
kono
parents:
diff changeset
983 "GNAT Project Files");
kono
parents:
diff changeset
984 Put_Line (" -Xnm=val Specify an external reference " &
kono
parents:
diff changeset
985 "for GNAT Project Files");
kono
parents:
diff changeset
986 New_Line;
kono
parents:
diff changeset
987
kono
parents:
diff changeset
988 Put_Line (" -aPdir Add directory dir to project search path");
kono
parents:
diff changeset
989 New_Line;
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 Put_Line (" -aOdir Specify ALI/object files search path");
kono
parents:
diff changeset
992 Put_Line (" -Idir Like -aOdir");
kono
parents:
diff changeset
993 Put_Line (" -I- Don't look for source/library files " &
kono
parents:
diff changeset
994 "in the default directory");
kono
parents:
diff changeset
995 New_Line;
kono
parents:
diff changeset
996 end if;
kono
parents:
diff changeset
997 end Usage;
kono
parents:
diff changeset
998
kono
parents:
diff changeset
999 end Clean;