OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [prj.ads] - Blame information for rev 724

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                         GNAT COMPILER COMPONENTS                         --
4
--                                                                          --
5
--                                  P R J                                   --
6
--                                                                          --
7
--                                 S p e c                                  --
8
--                                                                          --
9
--          Copyright (C) 2001-2012, Free Software Foundation, Inc.         --
10
--                                                                          --
11
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12
-- terms of the  GNU General Public License as published  by the Free Soft- --
13
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17
-- for  more details.  You should have  received  a copy of the GNU General --
18
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19
-- http://www.gnu.org/licenses for a complete copy of the license.          --
20
--                                                                          --
21
-- GNAT was originally developed  by the GNAT team at  New York University. --
22
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23
--                                                                          --
24
------------------------------------------------------------------------------
25
 
26
--  The following package declares the data types for GNAT project.
27
--  These data types may be used by GNAT Project-aware tools.
28
 
29
--  Children of these package implements various services on these data types.
30
--  See in particular Prj.Pars and Prj.Env.
31
 
32
with Casing; use Casing;
33
with Namet;  use Namet;
34
with Osint;
35
with Scans;  use Scans;
36
with Types;  use Types;
37
 
38
with GNAT.Dynamic_HTables; use GNAT.Dynamic_HTables;
39
with GNAT.Dynamic_Tables;
40
with GNAT.OS_Lib;          use GNAT.OS_Lib;
41
 
42
package Prj is
43
 
44
   procedure Add_Restricted_Language (Name : String);
45
   --  Call by gprbuild for each language specify by switch
46
   --  --restricted-to-languages=.
47
 
48
   function Is_Allowed_Language (Name : Name_Id) return Boolean;
49
   --  Returns True if --restricted-to-languages= is not used or if Name
50
   --  is one of the restricted languages.
51
 
52
   All_Other_Names : constant Name_Id := Names_High_Bound;
53
   --  Name used to replace others as an index of an associative array
54
   --  attribute in situations where this is allowed.
55
 
56
   Subdirs : String_Ptr := null;
57
   --  The value after the equal sign in switch --subdirs=...
58
   --  Contains the relative subdirectory.
59
 
60
   type Library_Support is (None, Static_Only, Full);
61
   --  Support for Library Project File.
62
   --  - None: Library Project Files are not supported at all
63
   --  - Static_Only: Library Project Files are only supported for static
64
   --    libraries.
65
   --  - Full: Library Project Files are supported for static and dynamic
66
   --    (shared) libraries.
67
 
68
   type Yes_No_Unknown is (Yes, No, Unknown);
69
   --  Tri-state to decide if -lgnarl is needed when linking
70
 
71
   type Project_Qualifier is
72
     (Unspecified,
73
      Standard,
74
      Library,
75
      Configuration,
76
      Dry,
77
      Aggregate,
78
      Aggregate_Library);
79
   --  Qualifiers that can prefix the reserved word "project" in a project
80
   --  file:
81
   --    Standard:             standard project ...
82
   --    Library:              library project is ...
83
   --    Dry:                  abstract project is
84
   --    Aggregate:            aggregate project is
85
   --    Aggregate_Library:    aggregate library project is ...
86
   --    Configuration:        configuration project is ...
87
 
88
   subtype Aggregate_Project is
89
     Project_Qualifier range Aggregate .. Aggregate_Library;
90
 
91
   All_Packages : constant String_List_Access;
92
   --  Default value of parameter Packages of procedures Parse, in Prj.Pars and
93
   --  Prj.Part, indicating that all packages should be checked.
94
 
95
   type Project_Tree_Data;
96
   type Project_Tree_Ref is access all Project_Tree_Data;
97
   --  Reference to a project tree. Several project trees may exist in memory
98
   --  at the same time.
99
 
100
   No_Project_Tree : constant Project_Tree_Ref;
101
 
102
   procedure Free (Tree : in out Project_Tree_Ref);
103
   --  Free memory associated with the tree
104
 
105
   Config_Project_File_Extension : String := ".cgpr";
106
   Project_File_Extension : String := ".gpr";
107
   --  The standard config and user project file name extensions. They are not
108
   --  constants, because Canonical_Case_File_Name is called on these variables
109
   --  in the body of Prj.
110
 
111
   function Empty_File   return File_Name_Type;
112
   function Empty_String return Name_Id;
113
   --  Return the id for an empty string ""
114
 
115
   type Path_Information is record
116
      Name         : Path_Name_Type := No_Path;
117
      Display_Name : Path_Name_Type := No_Path;
118
   end record;
119
   --  Directory names always end with a directory separator
120
 
121
   No_Path_Information : constant Path_Information := (No_Path, No_Path);
122
 
123
   type Project_Data;
124
   type Project_Id is access all Project_Data;
125
   No_Project : constant Project_Id := null;
126
   --  Id of a Project File
127
 
128
   type String_List_Id is new Nat;
129
   Nil_String : constant String_List_Id := 0;
130
   type String_Element is record
131
      Value         : Name_Id        := No_Name;
132
      Index         : Int            := 0;
133
      Display_Value : Name_Id        := No_Name;
134
      Location      : Source_Ptr     := No_Location;
135
      Flag          : Boolean        := False;
136
      Next          : String_List_Id := Nil_String;
137
   end record;
138
   --  To hold values for string list variables and array elements.
139
   --  Component Flag may be used for various purposes. For source
140
   --  directories, it indicates if the directory contains Ada source(s).
141
 
142
   package String_Element_Table is new GNAT.Dynamic_Tables
143
     (Table_Component_Type => String_Element,
144
      Table_Index_Type     => String_List_Id,
145
      Table_Low_Bound      => 1,
146
      Table_Initial        => 200,
147
      Table_Increment      => 100);
148
   --  The table for string elements in string lists
149
 
150
   type Variable_Kind is (Undefined, List, Single);
151
   --  Different kinds of variables
152
 
153
   subtype Defined_Variable_Kind is Variable_Kind range List .. Single;
154
   --  The defined kinds of variables
155
 
156
   Ignored : constant Variable_Kind;
157
   --  Used to indicate that a package declaration must be ignored
158
   --  while processing the project tree (unknown package name).
159
 
160
   type Variable_Value (Kind : Variable_Kind := Undefined) is record
161
      Project  : Project_Id := No_Project;
162
      Location : Source_Ptr := No_Location;
163
      Default  : Boolean    := False;
164
      case Kind is
165
         when Undefined =>
166
            null;
167
         when List =>
168
            Values : String_List_Id := Nil_String;
169
         when Single =>
170
            Value : Name_Id := No_Name;
171
            Index : Int     := 0;
172
      end case;
173
   end record;
174
   --  Values for variables and array elements. Default is True if the
175
   --  current value is the default one for the variable.
176
 
177
   Nil_Variable_Value : constant Variable_Value;
178
   --  Value of a non existing variable or array element
179
 
180
   type Variable_Id is new Nat;
181
   No_Variable : constant Variable_Id := 0;
182
   type Variable is record
183
      Next  : Variable_Id := No_Variable;
184
      Name  : Name_Id;
185
      Value : Variable_Value;
186
   end record;
187
   --  To hold the list of variables in a project file and in packages
188
 
189
   package Variable_Element_Table is new GNAT.Dynamic_Tables
190
     (Table_Component_Type => Variable,
191
      Table_Index_Type     => Variable_Id,
192
      Table_Low_Bound      => 1,
193
      Table_Initial        => 200,
194
      Table_Increment      => 100);
195
   --  The table of variable in list of variables
196
 
197
   type Array_Element_Id is new Nat;
198
   No_Array_Element : constant Array_Element_Id := 0;
199
   type Array_Element is record
200
      Index                : Name_Id;
201
      Restricted           : Boolean          := False;
202
      Src_Index            : Int              := 0;
203
      Index_Case_Sensitive : Boolean          := True;
204
      Value                : Variable_Value;
205
      Next                 : Array_Element_Id := No_Array_Element;
206
   end record;
207
   --  Each Array_Element represents an array element and is linked (Next)
208
   --  to the next array element, if any, in the array.
209
 
210
   package Array_Element_Table is new GNAT.Dynamic_Tables
211
     (Table_Component_Type => Array_Element,
212
      Table_Index_Type     => Array_Element_Id,
213
      Table_Low_Bound      => 1,
214
      Table_Initial        => 200,
215
      Table_Increment      => 100);
216
   --  The table that contains all array elements
217
 
218
   type Array_Id is new Nat;
219
   No_Array : constant Array_Id := 0;
220
   type Array_Data is record
221
      Name     : Name_Id          := No_Name;
222
      Location : Source_Ptr       := No_Location;
223
      Value    : Array_Element_Id := No_Array_Element;
224
      Next     : Array_Id         := No_Array;
225
   end record;
226
   --  Each Array_Data value represents an array.
227
   --  Value is the id of the first element.
228
   --  Next is the id of the next array in the project file or package.
229
 
230
   package Array_Table is new GNAT.Dynamic_Tables
231
     (Table_Component_Type => Array_Data,
232
      Table_Index_Type     => Array_Id,
233
      Table_Low_Bound      => 1,
234
      Table_Initial        => 200,
235
      Table_Increment      => 100);
236
   --  The table that contains all arrays
237
 
238
   type Package_Id is new Nat;
239
   No_Package : constant Package_Id := 0;
240
   type Declarations is record
241
      Variables  : Variable_Id := No_Variable;
242
      Attributes : Variable_Id := No_Variable;
243
      Arrays     : Array_Id    := No_Array;
244
      Packages   : Package_Id  := No_Package;
245
   end record;
246
   --  Contains the declarations (variables, single and array attributes,
247
   --  packages) for a project or a package in a project.
248
 
249
   No_Declarations : constant Declarations :=
250
                       (Variables  => No_Variable,
251
                        Attributes => No_Variable,
252
                        Arrays     => No_Array,
253
                        Packages   => No_Package);
254
   --  Default value of Declarations: indicates that there is no declarations
255
 
256
   type Package_Element is record
257
      Name   : Name_Id      := No_Name;
258
      Decl   : Declarations := No_Declarations;
259
      Parent : Package_Id   := No_Package;
260
      Next   : Package_Id   := No_Package;
261
   end record;
262
   --  A package (includes declarations that may include other packages)
263
 
264
   package Package_Table is new GNAT.Dynamic_Tables
265
     (Table_Component_Type => Package_Element,
266
      Table_Index_Type     => Package_Id,
267
      Table_Low_Bound      => 1,
268
      Table_Initial        => 100,
269
      Table_Increment      => 100);
270
   --  The table that contains all packages
271
 
272
   type Language_Data;
273
   type Language_Ptr is access all Language_Data;
274
   --  Index of language data
275
 
276
   No_Language_Index : constant Language_Ptr := null;
277
   --  Constant indicating that there is no language data
278
 
279
   function Get_Language_From_Name
280
     (Project : Project_Id;
281
      Name    : String) return Language_Ptr;
282
   --  Get a language from a project. This might return null if no such
283
   --  language exists in the project
284
 
285
   Max_Header_Num : constant := 6150;
286
   type Header_Num is range 0 .. Max_Header_Num;
287
   --  Size for hash table below. The upper bound is an arbitrary value, the
288
   --  value here was chosen after testing to determine a good compromise
289
   --  between speed of access and memory usage.
290
 
291
   function Hash (Name : Name_Id)        return Header_Num;
292
   function Hash (Name : File_Name_Type) return Header_Num;
293
   function Hash (Name : Path_Name_Type) return Header_Num;
294
   function Hash (Project : Project_Id)  return Header_Num;
295
   --  Used for computing hash values for names put into hash tables
296
 
297
   type Language_Kind is (File_Based, Unit_Based);
298
   --  Type for the kind of language. All languages are file based, except Ada
299
   --  which is unit based.
300
 
301
   type Dependency_File_Kind is (None, Makefile, ALI_File);
302
   --  Type of dependency to be checked: no dependency file, Makefile fragment
303
   --  or ALI file (for Ada).
304
 
305
   Makefile_Dependency_Suffix : constant String := ".d";
306
   ALI_Dependency_Suffix      : constant String := ".ali";
307
   Switches_Dependency_Suffix : constant String := ".cswi";
308
 
309
   Binder_Exchange_Suffix : constant String := ".bexch";
310
   --  Suffix for binder exchange files
311
 
312
   Library_Exchange_Suffix : constant String := ".lexch";
313
   --  Suffix for library exchange files
314
 
315
   type Name_List_Index is new Nat;
316
   No_Name_List : constant Name_List_Index := 0;
317
 
318
   type Name_Node is record
319
      Name : Name_Id         := No_Name;
320
      Next : Name_List_Index := No_Name_List;
321
   end record;
322
 
323
   package Name_List_Table is new GNAT.Dynamic_Tables
324
     (Table_Component_Type => Name_Node,
325
      Table_Index_Type     => Name_List_Index,
326
      Table_Low_Bound      => 1,
327
      Table_Initial        => 10,
328
      Table_Increment      => 100);
329
   --  The table for lists of names
330
 
331
   function Length
332
     (Table : Name_List_Table.Instance;
333
      List  : Name_List_Index) return Natural;
334
   --  Return the number of elements in specified list
335
 
336
   type Number_List_Index is new Nat;
337
   No_Number_List : constant Number_List_Index := 0;
338
 
339
   type Number_Node is record
340
      Number : Natural           := 0;
341
      Next   : Number_List_Index := No_Number_List;
342
   end record;
343
 
344
   package Number_List_Table is new GNAT.Dynamic_Tables
345
     (Table_Component_Type => Number_Node,
346
      Table_Index_Type     => Number_List_Index,
347
      Table_Low_Bound      => 1,
348
      Table_Initial        => 10,
349
      Table_Increment      => 100);
350
   --  The table for lists of numbers
351
 
352
   package Mapping_Files_Htable is new Simple_HTable
353
     (Header_Num => Header_Num,
354
      Element    => Path_Name_Type,
355
      No_Element => No_Path,
356
      Key        => Path_Name_Type,
357
      Hash       => Hash,
358
      Equal      => "=");
359
   --  A hash table to store the mapping files that are not used
360
 
361
   --  The following record ???
362
 
363
   type Lang_Naming_Data is record
364
      Dot_Replacement : File_Name_Type := No_File;
365
      --  The string to replace '.' in the source file name (for Ada)
366
 
367
      Casing : Casing_Type := All_Lower_Case;
368
      --  The casing of the source file name (for Ada)
369
 
370
      Separate_Suffix : File_Name_Type := No_File;
371
      --  String to append to unit name for source file name of an Ada subunit
372
 
373
      Spec_Suffix : File_Name_Type := No_File;
374
      --  The string to append to the unit name for the
375
      --  source file name of a spec.
376
 
377
      Body_Suffix : File_Name_Type := No_File;
378
      --  The string to append to the unit name for the
379
      --  source file name of a body.
380
   end record;
381
 
382
   No_Lang_Naming_Data : constant Lang_Naming_Data :=
383
                           (Dot_Replacement => No_File,
384
                            Casing          => All_Lower_Case,
385
                            Separate_Suffix => No_File,
386
                            Spec_Suffix     => No_File,
387
                            Body_Suffix     => No_File);
388
 
389
   function Is_Standard_GNAT_Naming (Naming : Lang_Naming_Data) return Boolean;
390
   --  True if the naming scheme is GNAT's default naming scheme. This
391
   --  is to take into account shortened names like "Ada." (a-), "System." (s-)
392
   --  and so on.
393
 
394
   type Source_Data;
395
   type Source_Id is access all Source_Data;
396
 
397
   function Is_Compilable (Source : Source_Id) return Boolean;
398
   pragma Inline (Is_Compilable);
399
   --  Return True if we know how to compile Source (i.e. if a compiler is
400
   --  defined). This doesn't indicate whether the source should be compiled.
401
 
402
   function Object_To_Global_Archive (Source : Source_Id) return Boolean;
403
   pragma Inline (Object_To_Global_Archive);
404
   --  Return True if the object file should be put in the global archive.
405
   --  This is for Ada, when only the closure of a main needs to be
406
   --  (re)compiled.
407
 
408
   function Other_Part (Source : Source_Id) return Source_Id;
409
   pragma Inline (Other_Part);
410
   --  Source ID for the other part, if any: for a spec, indicates its body;
411
   --  for a body, indicates its spec.
412
 
413
   No_Source : constant Source_Id := null;
414
 
415
   type Path_Syntax_Kind is
416
     (Canonical,
417
      --  Unix style
418
      Host);
419
      --  Host specific syntax, for example on VMS (the default)
420
 
421
   --  The following record describes the configuration of a language
422
 
423
   type Language_Config is record
424
      Kind : Language_Kind := File_Based;
425
      --  Kind of language. Most languages are file based. A few, such as Ada,
426
      --  are unit based.
427
 
428
      Naming_Data : Lang_Naming_Data;
429
      --  The naming data for the languages (prefixes, etc.)
430
 
431
      Include_Compatible_Languages : Name_List_Index := No_Name_List;
432
      --  List of languages that are "include compatible" with this language. A
433
      --  language B (for example "C") is "include compatible" with a language
434
      --  A (for example "C++") if it is expected that sources of language A
435
      --  may "include" header files from language B.
436
 
437
      Compiler_Driver : File_Name_Type := No_File;
438
      --  The name of the executable for the compiler of the language
439
 
440
      Compiler_Driver_Path : String_Access := null;
441
      --  The path name of the executable for the compiler of the language
442
 
443
      Compiler_Leading_Required_Switches : Name_List_Index := No_Name_List;
444
      --  The list of initial switches that are required as a minimum to invoke
445
      --  the compiler driver.
446
 
447
      Compiler_Trailing_Required_Switches : Name_List_Index := No_Name_List;
448
      --  The list of final switches that are required as a minimum to invoke
449
      --  the compiler driver.
450
 
451
      Multi_Unit_Switches : Name_List_Index := No_Name_List;
452
      --  The switch(es) to indicate the index of a unit in a multi-source file
453
 
454
      Multi_Unit_Object_Separator : Character := ' ';
455
      --  The string separating the base name of a source from the index of the
456
      --  unit in a multi-source file, in the object file name.
457
 
458
      Path_Syntax : Path_Syntax_Kind := Host;
459
      --  Value may be Canonical (Unix style) or Host (host syntax, for example
460
      --  on VMS for DEC C).
461
 
462
      Source_File_Switches : Name_List_Index := No_Name_List;
463
      --  Optional switches to be put before the source file. The source file
464
      --  path name is appended to the last switch in the list.
465
      --  Example: ("-i", "");
466
 
467
      Object_File_Suffix : Name_Id := No_Name;
468
      --  Optional alternate object file suffix
469
 
470
      Object_File_Switches : Name_List_Index := No_Name_List;
471
      --  Optional object file switches. When this is defined, the switches
472
      --  are used to specify the object file. The object file name is appended
473
      --  to the last switch in the list. Example: ("-o", "").
474
 
475
      Compilation_PIC_Option : Name_List_Index := No_Name_List;
476
      --  The option(s) to compile a source in Position Independent Code for
477
      --  shared libraries. Specified in the configuration. When not specified,
478
      --  there is no need for such switch.
479
 
480
      Object_Generated : Boolean := True;
481
      --  False in no object file is generated
482
 
483
      Objects_Linked : Boolean := True;
484
      --  False if object files are not use to link executables and build
485
      --  libraries.
486
 
487
      Runtime_Library_Dir : Name_Id := No_Name;
488
      --  Path name of the runtime library directory, if any
489
 
490
      Runtime_Source_Dir : Name_Id := No_Name;
491
      --  Path name of the runtime source directory, if any
492
 
493
      Mapping_File_Switches : Name_List_Index := No_Name_List;
494
      --  The option(s) to provide a mapping file to the compiler. Specified in
495
      --  the configuration. When value is No_Name_List, there is no mapping
496
      --  file.
497
 
498
      Mapping_Spec_Suffix : File_Name_Type := No_File;
499
      --  Placeholder representing the spec suffix in a mapping file
500
 
501
      Mapping_Body_Suffix : File_Name_Type := No_File;
502
      --  Placeholder representing the body suffix in a mapping file
503
 
504
      Config_File_Switches : Name_List_Index := No_Name_List;
505
      --  The option(s) to provide a config file to the compiler. Specified in
506
      --  the configuration. If value is No_Name_List there is no config file.
507
 
508
      Dependency_Kind : Dependency_File_Kind := None;
509
      --  The kind of dependency to be checked: none, Makefile fragment or
510
      --  ALI file (for Ada).
511
 
512
      Dependency_Option : Name_List_Index := No_Name_List;
513
      --  The option(s) to be used to create the dependency file. When value is
514
      --  No_Name_List, there is not such option(s).
515
 
516
      Compute_Dependency : Name_List_Index := No_Name_List;
517
      --  Hold the value of attribute Dependency_Driver, if declared for the
518
      --  language.
519
 
520
      Include_Option : Name_List_Index := No_Name_List;
521
      --  Hold the value of attribute Include_Switches, if declared for the
522
      --  language.
523
 
524
      Include_Path : Name_Id := No_Name;
525
      --  Name of environment variable declared by attribute Include_Path for
526
      --  the language.
527
 
528
      Include_Path_File : Name_Id := No_Name;
529
      --  Name of environment variable declared by attribute Include_Path_File
530
      --  for the language.
531
 
532
      Objects_Path : Name_Id := No_Name;
533
      --  Name of environment variable declared by attribute Objects_Path for
534
      --  the language.
535
 
536
      Objects_Path_File : Name_Id := No_Name;
537
      --  Name of environment variable declared by attribute Objects_Path_File
538
      --  for the language.
539
 
540
      Config_Body : Name_Id := No_Name;
541
      --  The template for a pragma Source_File_Name(_Project) for a specific
542
      --  file name of a body.
543
 
544
      Config_Body_Index : Name_Id := No_Name;
545
      --  The template for a pragma Source_File_Name(_Project) for a specific
546
      --  file name of a body in a multi-source file.
547
 
548
      Config_Body_Pattern : Name_Id := No_Name;
549
      --  The template for a pragma Source_File_Name(_Project) for a naming
550
      --  body pattern.
551
 
552
      Config_Spec : Name_Id := No_Name;
553
      --  The template for a pragma Source_File_Name(_Project) for a specific
554
      --  file name of a spec.
555
 
556
      Config_Spec_Index : Name_Id := No_Name;
557
      --  The template for a pragma Source_File_Name(_Project) for a specific
558
      --  file name of a spec in a multi-source file.
559
 
560
      Config_Spec_Pattern : Name_Id := No_Name;
561
      --  The template for a pragma Source_File_Name(_Project) for a naming
562
      --  spec pattern.
563
 
564
      Config_File_Unique : Boolean := False;
565
      --  Indicate if the config file specified to the compiler needs to be
566
      --  unique. If it is unique, then all config files are concatenated into
567
      --  a temp config file.
568
 
569
      Binder_Driver : File_Name_Type := No_File;
570
      --  The name of the binder driver for the language, if any
571
 
572
      Binder_Driver_Path : Path_Name_Type := No_Path;
573
      --  The path name of the binder driver
574
 
575
      Binder_Required_Switches : Name_List_Index := No_Name_List;
576
      --  Hold the value of attribute Binder'Required_Switches for the language
577
 
578
      Binder_Prefix : Name_Id := No_Name;
579
      --  Hold the value of attribute Binder'Prefix for the language
580
 
581
      Toolchain_Version : Name_Id := No_Name;
582
      --  Hold the value of attribute Toolchain_Version for the language
583
 
584
      Toolchain_Description : Name_Id := No_Name;
585
      --  Hold the value of attribute Toolchain_Description for the language
586
 
587
   end record;
588
 
589
   No_Language_Config : constant Language_Config :=
590
                          (Kind                         => File_Based,
591
                           Naming_Data                  => No_Lang_Naming_Data,
592
                           Include_Compatible_Languages => No_Name_List,
593
                           Compiler_Driver              => No_File,
594
                           Compiler_Driver_Path         => null,
595
                           Compiler_Leading_Required_Switches
596
                                                        => No_Name_List,
597
                           Compiler_Trailing_Required_Switches
598
                                                        => No_Name_List,
599
                           Multi_Unit_Switches          => No_Name_List,
600
                           Multi_Unit_Object_Separator  => ' ',
601
                           Path_Syntax                  => Canonical,
602
                           Source_File_Switches         => No_Name_List,
603
                           Object_File_Suffix           => No_Name,
604
                           Object_File_Switches         => No_Name_List,
605
                           Compilation_PIC_Option       => No_Name_List,
606
                           Object_Generated             => True,
607
                           Objects_Linked               => True,
608
                           Runtime_Library_Dir          => No_Name,
609
                           Runtime_Source_Dir           => No_Name,
610
                           Mapping_File_Switches        => No_Name_List,
611
                           Mapping_Spec_Suffix          => No_File,
612
                           Mapping_Body_Suffix          => No_File,
613
                           Config_File_Switches         => No_Name_List,
614
                           Dependency_Kind              => None,
615
                           Dependency_Option            => No_Name_List,
616
                           Compute_Dependency           => No_Name_List,
617
                           Include_Option               => No_Name_List,
618
                           Include_Path                 => No_Name,
619
                           Include_Path_File            => No_Name,
620
                           Objects_Path                 => No_Name,
621
                           Objects_Path_File            => No_Name,
622
                           Config_Body                  => No_Name,
623
                           Config_Body_Index            => No_Name,
624
                           Config_Body_Pattern          => No_Name,
625
                           Config_Spec                  => No_Name,
626
                           Config_Spec_Index            => No_Name,
627
                           Config_Spec_Pattern          => No_Name,
628
                           Config_File_Unique           => False,
629
                           Binder_Driver                => No_File,
630
                           Binder_Driver_Path           => No_Path,
631
                           Binder_Required_Switches     => No_Name_List,
632
                           Binder_Prefix                => No_Name,
633
                           Toolchain_Version            => No_Name,
634
                           Toolchain_Description        => No_Name);
635
 
636
   --  The following record ???
637
 
638
   type Language_Data is record
639
      Name          : Name_Id         := No_Name;
640
      Display_Name  : Name_Id         := No_Name;
641
      Config        : Language_Config := No_Language_Config;
642
      First_Source  : Source_Id       := No_Source;
643
      Mapping_Files : Mapping_Files_Htable.Instance :=
644
                        Mapping_Files_Htable.Nil;
645
      Next          : Language_Ptr  := No_Language_Index;
646
   end record;
647
 
648
   No_Language_Data : constant Language_Data :=
649
                        (Name          => No_Name,
650
                         Display_Name  => No_Name,
651
                         Config        => No_Language_Config,
652
                         First_Source  => No_Source,
653
                         Mapping_Files => Mapping_Files_Htable.Nil,
654
                         Next          => No_Language_Index);
655
 
656
   type Language_List_Element;
657
   type Language_List is access all Language_List_Element;
658
   type Language_List_Element is record
659
      Language : Language_Ptr := No_Language_Index;
660
      Next     : Language_List;
661
   end record;
662
 
663
   type Source_Kind is (Spec, Impl, Sep);
664
   subtype Spec_Or_Body is Source_Kind range Spec .. Impl;
665
 
666
   --  The following declarations declare a structure used to store the Name
667
   --  and File and Path names of a unit, with a reference to its GNAT Project
668
   --  File(s). Some units might have neither Spec nor Impl when they were
669
   --  created for a "separate".
670
 
671
   type File_Names_Data is array (Spec_Or_Body) of Source_Id;
672
 
673
   type Unit_Data is record
674
      Name       : Name_Id := No_Name;
675
      File_Names : File_Names_Data;
676
   end record;
677
 
678
   type Unit_Index is access all Unit_Data;
679
 
680
   No_Unit_Index : constant Unit_Index := null;
681
   --  Used to indicate a null entry for no unit
682
 
683
   type Source_Roots;
684
   type Roots_Access is access Source_Roots;
685
   type Source_Roots is record
686
      Root : Source_Id;
687
      Next : Roots_Access;
688
   end record;
689
   --  A list to store the roots associated with a main unit. These are the
690
   --  files that need to linked along with the main (for instance a C file
691
   --  corresponding to an Ada file). In general, these are dependencies that
692
   --  cannot be computed automatically by the builder.
693
 
694
   type Naming_Exception_Type is (No, Yes, Inherited);
695
 
696
   --  Structure to define source data
697
 
698
   type Source_Data is record
699
      Initialized : Boolean := False;
700
      --  Set to True when Source_Data is completely initialized
701
 
702
      Project : Project_Id := No_Project;
703
      --  Project of the source
704
 
705
      Location : Source_Ptr := No_Location;
706
      --  Location in the project file of the declaration of the source in
707
      --  package Naming.
708
 
709
      Source_Dir_Rank : Natural := 0;
710
      --  The rank of the source directory in list declared with attribute
711
      --  Source_Dirs. Two source files with the same name cannot appears in
712
      --  different directory with the same rank. That can happen when the
713
      --  recursive notation <dir>/** is used in attribute Source_Dirs.
714
 
715
      Language : Language_Ptr := No_Language_Index;
716
      --  Index of the language. This is an index into
717
      --  Project_Tree.Languages_Data.
718
 
719
      In_Interfaces : Boolean := True;
720
      --  False when the source is not included in interfaces, when attribute
721
      --  Interfaces is declared.
722
 
723
      Declared_In_Interfaces : Boolean := False;
724
      --  True when source is declared in attribute Interfaces
725
 
726
      Alternate_Languages : Language_List := null;
727
      --  List of languages a header file may also be, in addition of language
728
      --  Language_Name.
729
 
730
      Kind : Source_Kind := Spec;
731
      --  Kind of the source: spec, body or subunit
732
 
733
      Unit : Unit_Index := No_Unit_Index;
734
      --  Name of the unit, if language is unit based. This is only set for
735
      --  those files that are part of the compilation set (for instance a
736
      --  file in an extended project that is overridden will not have this
737
      --  field set).
738
 
739
      Index : Int := 0;
740
      --  Index of the source in a multi unit source file (the same Source_Data
741
      --  is duplicated several times when there are several units in the same
742
      --  file). Index is 0 if there is either no unit or a single one, and
743
      --  starts at 1 when there are multiple units
744
 
745
      Compilable : Yes_No_Unknown := Unknown;
746
      --  Updated at the first call to Is_Compilable. Yes if source file is
747
      --  compilable.
748
 
749
      In_The_Queue : Boolean := False;
750
      --  True if the source has been put in the queue
751
 
752
      Locally_Removed : Boolean := False;
753
      --  True if the source has been "excluded"
754
 
755
      Replaced_By : Source_Id := No_Source;
756
      --  Missing comment ???
757
 
758
      File : File_Name_Type := No_File;
759
      --  Canonical file name of the source
760
 
761
      Display_File : File_Name_Type := No_File;
762
      --  File name of the source, for display purposes
763
 
764
      Path : Path_Information := No_Path_Information;
765
      --  Path name of the source
766
 
767
      Source_TS : Time_Stamp_Type := Empty_Time_Stamp;
768
      --  Time stamp of the source file
769
 
770
      Object_Project : Project_Id := No_Project;
771
      --  Project where the object file is. This might be different from
772
      --  Project when using extending project files.
773
 
774
      Object : File_Name_Type := No_File;
775
      --  File name of the object file
776
 
777
      Current_Object_Path : Path_Name_Type := No_Path;
778
      --  Object path of an existing object file
779
 
780
      Object_Path : Path_Name_Type := No_Path;
781
      --  Object path of the real object file
782
 
783
      Object_TS : Time_Stamp_Type := Empty_Time_Stamp;
784
      --  Object file time stamp
785
 
786
      Dep_Name : File_Name_Type := No_File;
787
      --  Dependency file simple name
788
 
789
      Current_Dep_Path : Path_Name_Type := No_Path;
790
      --  Path name of an existing dependency file
791
 
792
      Dep_Path : Path_Name_Type := No_Path;
793
      --  Path name of the real dependency file
794
 
795
      Dep_TS : aliased Osint.File_Attributes := Osint.Unknown_Attributes;
796
      --  Dependency file time stamp
797
 
798
      Switches : File_Name_Type := No_File;
799
      --  File name of the switches file. For all languages, this is a file
800
      --  that ends with the .cswi extension.
801
 
802
      Switches_Path : Path_Name_Type := No_Path;
803
      --  Path name of the switches file
804
 
805
      Switches_TS : Time_Stamp_Type := Empty_Time_Stamp;
806
      --  Switches file time stamp
807
 
808
      Naming_Exception : Naming_Exception_Type := No;
809
      --  True if the source has an exceptional name
810
 
811
      Duplicate_Unit : Boolean := False;
812
      --  True when a duplicate unit has been reported for this source
813
 
814
      Next_In_Lang : Source_Id := No_Source;
815
      --  Link to another source of the same language in the same project
816
 
817
      Next_With_File_Name : Source_Id := No_Source;
818
      --  Link to another source with the same base file name
819
 
820
      Roots : Roots_Access := null;
821
      --  The roots for a main unit
822
 
823
   end record;
824
 
825
   No_Source_Data : constant Source_Data :=
826
                      (Initialized            => False,
827
                       Project                => No_Project,
828
                       Location               => No_Location,
829
                       Source_Dir_Rank        => 0,
830
                       Language               => No_Language_Index,
831
                       In_Interfaces          => True,
832
                       Declared_In_Interfaces => False,
833
                       Alternate_Languages    => null,
834
                       Kind                   => Spec,
835
                       Unit                   => No_Unit_Index,
836
                       Index                  => 0,
837
                       Locally_Removed        => False,
838
                       Compilable             => Unknown,
839
                       In_The_Queue           => False,
840
                       Replaced_By            => No_Source,
841
                       File                   => No_File,
842
                       Display_File           => No_File,
843
                       Path                   => No_Path_Information,
844
                       Source_TS              => Empty_Time_Stamp,
845
                       Object_Project         => No_Project,
846
                       Object                 => No_File,
847
                       Current_Object_Path    => No_Path,
848
                       Object_Path            => No_Path,
849
                       Object_TS              => Empty_Time_Stamp,
850
                       Dep_Name               => No_File,
851
                       Current_Dep_Path       => No_Path,
852
                       Dep_Path               => No_Path,
853
                       Dep_TS                 => Osint.Unknown_Attributes,
854
                       Switches               => No_File,
855
                       Switches_Path          => No_Path,
856
                       Switches_TS            => Empty_Time_Stamp,
857
                       Naming_Exception       => No,
858
                       Duplicate_Unit         => False,
859
                       Next_In_Lang           => No_Source,
860
                       Next_With_File_Name    => No_Source,
861
                       Roots                  => null);
862
 
863
   package Source_Files_Htable is new Simple_HTable
864
     (Header_Num => Header_Num,
865
      Element    => Source_Id,
866
      No_Element => No_Source,
867
      Key        => File_Name_Type,
868
      Hash       => Hash,
869
      Equal      => "=");
870
   --  Mapping of source file names to source ids
871
 
872
   package Source_Paths_Htable is new Simple_HTable
873
     (Header_Num => Header_Num,
874
      Element    => Source_Id,
875
      No_Element => No_Source,
876
      Key        => Path_Name_Type,
877
      Hash       => Hash,
878
      Equal      => "=");
879
   --  Mapping of source paths to source ids
880
 
881
   type Lib_Kind is (Static, Dynamic, Relocatable);
882
 
883
   type Policy is (Autonomous, Compliant, Controlled, Restricted, Direct);
884
   --  Type to specify the symbol policy, when symbol control is supported.
885
   --  See full explanation about this type in package Symbols.
886
   --    Autonomous: Create a symbol file without considering any reference
887
   --    Compliant:  Try to be as compatible as possible with an existing ref
888
   --    Controlled: Fail if symbols are not the same as those in the reference
889
   --    Restricted: Restrict the symbols to those in the symbol file
890
   --    Direct:     The symbol file is used as is
891
 
892
   type Symbol_Record is record
893
      Symbol_File   : Path_Name_Type := No_Path;
894
      Reference     : Path_Name_Type := No_Path;
895
      Symbol_Policy : Policy  := Autonomous;
896
   end record;
897
   --  Type to keep the symbol data to be used when building a shared library
898
 
899
   No_Symbols : constant Symbol_Record :=
900
     (Symbol_File   => No_Path,
901
      Reference     => No_Path,
902
      Symbol_Policy => Autonomous);
903
   --  The default value of the symbol data
904
 
905
   function Image (The_Casing : Casing_Type) return String;
906
   --  Similar to 'Image (but avoid use of this attribute in compiler)
907
 
908
   function Value (Image : String) return Casing_Type;
909
   --  Similar to 'Value (but avoid use of this attribute in compiler)
910
   --  Raises Constraint_Error if not a Casing_Type image.
911
 
912
   --  The following record contains data for a naming scheme
913
 
914
   function Get_Object_Directory
915
     (Project             : Project_Id;
916
      Including_Libraries : Boolean;
917
      Only_If_Ada         : Boolean := False) return Path_Name_Type;
918
   --  Return the object directory to use for the project. This depends on
919
   --  whether we have a library project or a standard project. This function
920
   --  might return No_Name when no directory applies.
921
   --  If we have a library project file and Including_Libraries is True then
922
   --  the library dir is returned instead of the object dir.
923
   --  If Only_If_Ada is True, then No_Name will be returned when the project
924
   --  doesn't Ada sources.
925
 
926
   procedure Compute_All_Imported_Projects
927
     (Root_Project : Project_Id;
928
      Tree         : Project_Tree_Ref);
929
   --  For all projects in the tree, compute the list of the projects imported
930
   --  directly or indirectly by project Root_Project. The result is stored in
931
   --  Project.All_Imported_Projects for each project
932
 
933
   function Ultimate_Extending_Project_Of
934
     (Proj : Project_Id) return Project_Id;
935
   --  Returns the ultimate extending project of project Proj. If project Proj
936
   --  is not extended, returns Proj.
937
 
938
   type Project_List_Element;
939
   type Project_List is access all Project_List_Element;
940
   type Project_List_Element is record
941
      Project               : Project_Id   := No_Project;
942
      From_Encapsulated_Lib : Boolean      := False;
943
      Next                  : Project_List := null;
944
   end record;
945
   --  A list of projects
946
 
947
   procedure Free_List
948
     (List         : in out Project_List;
949
      Free_Project : Boolean);
950
   --  Free the list of projects, if Free_Project, each project is also freed
951
 
952
   type Response_File_Format is
953
     (None,
954
      GNU,
955
      Object_List,
956
      Option_List,
957
      GCC,
958
      GCC_GNU,
959
      GCC_Object_List,
960
      GCC_Option_List);
961
   --  The format of the different response files
962
 
963
   type Project_Configuration is record
964
      Target : Name_Id := No_Name;
965
      --  The target of the configuration, when specified
966
 
967
      Run_Path_Option : Name_List_Index := No_Name_List;
968
      --  The option to use when linking to specify the path where to look for
969
      --  libraries.
970
 
971
      Run_Path_Origin : Name_Id := No_Name;
972
      --  Specify the string (such as "$ORIGIN") to indicate paths relative to
973
      --  the directory of the executable in the run path option.
974
 
975
      Library_Install_Name_Option : Name_Id := No_Name;
976
      --  When this is not an empty list, this option, followed by the single
977
      --  name of the shared library file is used when linking a shared
978
      --  library.
979
 
980
      Separate_Run_Path_Options : Boolean := False;
981
      --  True if each directory needs to be specified in a separate run path
982
      --  option.
983
 
984
      Executable_Suffix : Name_Id := No_Name;
985
      --  The suffix of executables, when specified in the configuration or in
986
      --  package Builder of the main project. When this is not specified, the
987
      --  executable suffix is the default for the platform.
988
 
989
      --  Linking
990
 
991
      Linker : Path_Name_Type := No_Path;
992
      --  Path name of the linker driver. Specified in the configuration or in
993
      --  the package Builder of the main project.
994
 
995
      Map_File_Option : Name_Id := No_Name;
996
      --  Option to use when invoking the linker to build a map file
997
 
998
      Trailing_Linker_Required_Switches : Name_List_Index := No_Name_List;
999
      --  The minimum options for the linker driver. Specified in the
1000
      --  configuration.
1001
 
1002
      Linker_Executable_Option : Name_List_Index := No_Name_List;
1003
      --  The option(s) to indicate the name of the executable in the linker
1004
      --  command. Specified in the configuration. When not specified, default
1005
      --  to -o <executable name>.
1006
 
1007
      Linker_Lib_Dir_Option : Name_Id := No_Name;
1008
      --  The option to specify where to find a library for linking. Specified
1009
      --  in the configuration. When not specified, defaults to "-L".
1010
 
1011
      Linker_Lib_Name_Option : Name_Id := No_Name;
1012
      --  The option to specify the name of a library for linking. Specified in
1013
      --  the configuration. When not specified, defaults to "-l".
1014
 
1015
      Max_Command_Line_Length : Natural := 0;
1016
      --  When positive and when Resp_File_Format (see below) is not None,
1017
      --  if the command line for the invocation of the linker would be greater
1018
      --  than this value, a response file is used to invoke the linker.
1019
 
1020
      Resp_File_Format : Response_File_Format := None;
1021
      --  The format of a response file, when linking with a response file is
1022
      --  supported.
1023
 
1024
      Resp_File_Options : Name_List_Index := No_Name_List;
1025
      --  The switches, if any, that precede the path name of the response
1026
      --  file in the invocation of the linker.
1027
 
1028
      --  Libraries
1029
 
1030
      Library_Builder : Path_Name_Type  := No_Path;
1031
      --  The executable to build library (specified in the configuration)
1032
 
1033
      Lib_Support : Library_Support := None;
1034
      --  The level of library support. Specified in the configuration. Support
1035
      --  is none, static libraries only or both static and shared libraries.
1036
 
1037
      Lib_Encapsulated_Supported : Boolean := False;
1038
      --  True when building fully standalone libraries supported on the target
1039
 
1040
      Archive_Builder : Name_List_Index := No_Name_List;
1041
      --  The name of the executable to build archives, with the minimum
1042
      --  switches. Specified in the configuration.
1043
 
1044
      Archive_Builder_Append_Option : Name_List_Index := No_Name_List;
1045
      --  The options to append object files to an archive
1046
 
1047
      Archive_Indexer : Name_List_Index := No_Name_List;
1048
      --  The name of the executable to index archives, with the minimum
1049
      --  switches. Specified in the configuration.
1050
 
1051
      Archive_Suffix : File_Name_Type := No_File;
1052
      --  The suffix of archives. Specified in the configuration. When not
1053
      --  specified, defaults to ".a".
1054
 
1055
      Lib_Partial_Linker : Name_List_Index := No_Name_List;
1056
 
1057
      --  Shared libraries
1058
 
1059
      Shared_Lib_Driver : File_Name_Type := No_File;
1060
      --  The driver to link shared libraries. Set with attribute Library_GCC.
1061
      --  Default to gcc.
1062
 
1063
      Shared_Lib_Prefix : File_Name_Type := No_File;
1064
      --  Part of a shared library file name that precedes the name of the
1065
      --  library. Specified in the configuration. When not specified, defaults
1066
      --  to "lib".
1067
 
1068
      Shared_Lib_Suffix : File_Name_Type := No_File;
1069
      --  Suffix of shared libraries, after the library name in the shared
1070
      --  library name. Specified in the configuration. When not specified,
1071
      --  default to ".so".
1072
 
1073
      Shared_Lib_Min_Options : Name_List_Index := No_Name_List;
1074
      --  The minimum options to use when building a shared library
1075
 
1076
      Lib_Version_Options : Name_List_Index := No_Name_List;
1077
      --  The options to use to specify a library version
1078
 
1079
      Symbolic_Link_Supported : Boolean := False;
1080
      --  True if the platform supports symbolic link files
1081
 
1082
      Lib_Maj_Min_Id_Supported : Boolean := False;
1083
      --  True if platform supports library major and minor options, such as
1084
      --  libname.so -> libname.so.2 -> libname.so.2.4
1085
 
1086
      Auto_Init_Supported : Boolean := False;
1087
      --  True if automatic initialisation is supported for shared stand-alone
1088
      --  libraries.
1089
   end record;
1090
 
1091
   Default_Project_Config : constant Project_Configuration :=
1092
                              (Target                         => No_Name,
1093
                               Run_Path_Option                => No_Name_List,
1094
                               Run_Path_Origin                => No_Name,
1095
                               Library_Install_Name_Option    => No_Name,
1096
                               Separate_Run_Path_Options      => False,
1097
                               Executable_Suffix              => No_Name,
1098
                               Linker                         => No_Path,
1099
                               Map_File_Option                => No_Name,
1100
                               Trailing_Linker_Required_Switches =>
1101
                                 No_Name_List,
1102
                               Linker_Executable_Option       => No_Name_List,
1103
                               Linker_Lib_Dir_Option          => No_Name,
1104
                               Linker_Lib_Name_Option         => No_Name,
1105
                               Library_Builder                => No_Path,
1106
                               Max_Command_Line_Length        => 0,
1107
                               Resp_File_Format               => None,
1108
                               Resp_File_Options              => No_Name_List,
1109
                               Lib_Support                    => None,
1110
                               Lib_Encapsulated_Supported     => False,
1111
                               Archive_Builder                => No_Name_List,
1112
                               Archive_Builder_Append_Option  => No_Name_List,
1113
                               Archive_Indexer                => No_Name_List,
1114
                               Archive_Suffix                 => No_File,
1115
                               Lib_Partial_Linker             => No_Name_List,
1116
                               Shared_Lib_Driver              => No_File,
1117
                               Shared_Lib_Prefix              => No_File,
1118
                               Shared_Lib_Suffix              => No_File,
1119
                               Shared_Lib_Min_Options         => No_Name_List,
1120
                               Lib_Version_Options            => No_Name_List,
1121
                               Symbolic_Link_Supported        => False,
1122
                               Lib_Maj_Min_Id_Supported       => False,
1123
                               Auto_Init_Supported            => False);
1124
 
1125
   -------------------------
1126
   -- Aggregated projects --
1127
   -------------------------
1128
 
1129
   type Aggregated_Project;
1130
   type Aggregated_Project_List is access all Aggregated_Project;
1131
   type Aggregated_Project is record
1132
      Path    : Path_Name_Type;
1133
      Tree    : Project_Tree_Ref;
1134
      Project : Project_Id;
1135
      Next    : Aggregated_Project_List;
1136
   end record;
1137
 
1138
   procedure Free (List : in out Aggregated_Project_List);
1139
   --  Free the memory used for List
1140
 
1141
   procedure Add_Aggregated_Project
1142
     (Project : Project_Id;
1143
      Path    : Path_Name_Type);
1144
   --  Add a new aggregated project in Project.
1145
   --  The aggregated project has not been processed yet. This procedure should
1146
   --  the called while processing the aggregate project, and as a result
1147
   --  Prj.Proc.Process will then automatically process the aggregated projects
1148
 
1149
   ------------------
1150
   -- Project_Data --
1151
   ------------------
1152
 
1153
   --  The following record describes a project file representation
1154
 
1155
   type Standalone is (No, Standard, Encapsulated);
1156
 
1157
   type Project_Data (Qualifier : Project_Qualifier := Unspecified) is record
1158
 
1159
      -------------
1160
      -- General --
1161
      -------------
1162
 
1163
      Name : Name_Id := No_Name;
1164
      --  The name of the project
1165
 
1166
      Display_Name : Name_Id := No_Name;
1167
      --  The name of the project with the spelling of its declaration
1168
 
1169
      Externally_Built : Boolean := False;
1170
      --  True if the project is externally built. In such case, the Project
1171
      --  Manager will not modify anything in this project.
1172
 
1173
      Config : Project_Configuration;
1174
 
1175
      Path : Path_Information := No_Path_Information;
1176
      --  The path name of the project file. This include base name of the
1177
      --  project file.
1178
 
1179
      Virtual : Boolean := False;
1180
      --  True for virtual extending projects
1181
 
1182
      Location : Source_Ptr := No_Location;
1183
      --  The location in the project file source of the project name that
1184
      --  immediately follows the reserved word "project".
1185
 
1186
      ---------------
1187
      -- Languages --
1188
      ---------------
1189
 
1190
      Languages : Language_Ptr := No_Language_Index;
1191
      --  First index of the language data in the project.
1192
      --  This is an index into the project_tree_data.languages_data.
1193
      --  Traversing the list gives access to all the languages supported by
1194
      --  the project.
1195
 
1196
      --------------
1197
      -- Projects --
1198
      --------------
1199
 
1200
      Mains : String_List_Id := Nil_String;
1201
      --  List of mains specified by attribute Main
1202
 
1203
      Extends : Project_Id := No_Project;
1204
      --  The reference of the project file, if any, that this project file
1205
      --  extends.
1206
 
1207
      Extended_By : Project_Id := No_Project;
1208
      --  The reference of the project file, if any, that extends this project
1209
      --  file.
1210
 
1211
      Decl : Declarations := No_Declarations;
1212
      --  The declarations (variables, attributes and packages) of this project
1213
      --  file.
1214
 
1215
      Imported_Projects : Project_List := null;
1216
      --  The list of all directly imported projects, if any
1217
 
1218
      All_Imported_Projects : Project_List := null;
1219
      --  The list of all projects imported directly or indirectly, if any.
1220
      --  This does not include the project itself.
1221
 
1222
      -----------------
1223
      -- Directories --
1224
      -----------------
1225
 
1226
      Directory : Path_Information := No_Path_Information;
1227
      --  Path name of the directory where the project file resides
1228
 
1229
      Object_Directory : Path_Information := No_Path_Information;
1230
      --  The path name of the object directory of this project file
1231
 
1232
      Exec_Directory : Path_Information := No_Path_Information;
1233
      --  The path name of the exec directory of this project file. Default is
1234
      --  equal to Object_Directory.
1235
 
1236
      -------------
1237
      -- Library --
1238
      -------------
1239
 
1240
      Library : Boolean := False;
1241
      --  True if this is a library project
1242
 
1243
      Library_Name : Name_Id := No_Name;
1244
      --  If a library project, name of the library
1245
 
1246
      Library_Kind : Lib_Kind := Static;
1247
      --  If a library project, kind of library
1248
 
1249
      Library_Dir : Path_Information := No_Path_Information;
1250
      --  If a library project, path name of the directory where the library
1251
      --  resides.
1252
 
1253
      Library_TS : Time_Stamp_Type := Empty_Time_Stamp;
1254
      --  The timestamp of a library file in a library project
1255
 
1256
      Library_Src_Dir : Path_Information := No_Path_Information;
1257
      --  If a Stand-Alone Library project, path name of the directory where
1258
      --  the sources of the interfaces of the library are copied. By default,
1259
      --  if attribute Library_Src_Dir is not specified, sources of the
1260
      --  interfaces are not copied anywhere.
1261
 
1262
      Library_ALI_Dir : Path_Information := No_Path_Information;
1263
      --  In a library project, path name of the directory where the ALI files
1264
      --  are copied. If attribute Library_ALI_Dir is not specified, ALI files
1265
      --  are copied in the Library_Dir.
1266
 
1267
      Lib_Internal_Name : Name_Id := No_Name;
1268
      --  If a library project, internal name store inside the library
1269
 
1270
      Standalone_Library : Standalone := No;
1271
      --  Indicate that this is a Standalone Library Project File
1272
 
1273
      Lib_Interface_ALIs : String_List_Id := Nil_String;
1274
      --  For Standalone Library Project Files, indicate the list of Interface
1275
      --  ALI files.
1276
 
1277
      Lib_Auto_Init : Boolean := False;
1278
      --  For non static Stand-Alone Library Project Files, indicate if
1279
      --  the library initialisation should be automatic.
1280
 
1281
      Symbol_Data : Symbol_Record := No_Symbols;
1282
      --  Symbol file name, reference symbol file name, symbol policy
1283
 
1284
      Need_To_Build_Lib : Boolean := False;
1285
      --  Indicates that the library of a Library Project needs to be built or
1286
      --  rebuilt.
1287
 
1288
      -------------
1289
      -- Sources --
1290
      -------------
1291
      --  The sources for all languages including Ada are accessible through
1292
      --  the Source_Iterator type
1293
 
1294
      Interfaces_Defined : Boolean := False;
1295
      --  True if attribute Interfaces is declared for the project or any
1296
      --  project it extends.
1297
 
1298
      Include_Path_File : Path_Name_Type := No_Path;
1299
      --  The path name of the of the source search directory file.
1300
      --  This is only used by gnatmake
1301
 
1302
      Source_Dirs : String_List_Id := Nil_String;
1303
      --  The list of all the source directories
1304
 
1305
      Source_Dir_Ranks : Number_List_Index := No_Number_List;
1306
 
1307
      Ada_Include_Path : String_Access := null;
1308
      --  The cached value of source search path for this project file. Set by
1309
      --  the first call to Prj.Env.Ada_Include_Path for the project. Do not
1310
      --  use this field directly outside of the project manager, use
1311
      --  Prj.Env.Ada_Include_Path instead.
1312
 
1313
      Has_Multi_Unit_Sources : Boolean := False;
1314
      --  Whether there is at least one source file containing multiple units
1315
 
1316
      -------------------
1317
      -- Miscellaneous --
1318
      -------------------
1319
 
1320
      Ada_Objects_Path : String_Access := null;
1321
      --  The cached value of ADA_OBJECTS_PATH for this project file. Do not
1322
      --  use this field directly outside of the compiler, use
1323
      --  Prj.Env.Ada_Objects_Path instead.
1324
 
1325
      Libgnarl_Needed : Yes_No_Unknown := Unknown;
1326
      --  Set to True when libgnarl is needed to link
1327
 
1328
      Objects_Path : String_Access := null;
1329
      --  The cached value of the object dir path, used during the binding
1330
      --  phase of gprbuild.
1331
 
1332
      Objects_Path_File_With_Libs : Path_Name_Type := No_Path;
1333
      --  The cached value of the object path temp file (including library
1334
      --  dirs) for this project file.
1335
 
1336
      Objects_Path_File_Without_Libs : Path_Name_Type := No_Path;
1337
      --  The cached value of the object path temp file (excluding library
1338
      --  dirs) for this project file.
1339
 
1340
      Config_File_Name : Path_Name_Type := No_Path;
1341
      --  The path name of the configuration pragmas file, if any
1342
 
1343
      Config_File_Temp : Boolean := False;
1344
      --  An indication that the configuration pragmas file is a temporary file
1345
      --  that must be deleted at the end.
1346
 
1347
      Config_Checked : Boolean := False;
1348
      --  A flag to avoid checking repetitively the configuration pragmas file
1349
 
1350
      Depth : Natural := 0;
1351
      --  The maximum depth of a project in the project graph. Depth of main
1352
      --  project is 0.
1353
 
1354
      Unkept_Comments : Boolean := False;
1355
      --  True if there are comments in the project sources that cannot be kept
1356
      --  in the project tree.
1357
 
1358
      -----------------------------
1359
      -- Qualifier-Specific data --
1360
      -----------------------------
1361
 
1362
      --  The following fields are only valid for specific types of projects
1363
 
1364
      case Qualifier is
1365
         when Aggregate | Aggregate_Library =>
1366
            Aggregated_Projects : Aggregated_Project_List := null;
1367
            --  List of aggregated projects (which could themselves be
1368
            --  aggregate projects).
1369
 
1370
         when others =>
1371
            null;
1372
      end case;
1373
   end record;
1374
 
1375
   function Empty_Project (Qualifier : Project_Qualifier) return  Project_Data;
1376
   --  Return the representation of an empty project
1377
 
1378
   function Is_Extending
1379
     (Extending : Project_Id;
1380
      Extended  : Project_Id) return Boolean;
1381
   --  Return True if Extending is extending the Extended project
1382
 
1383
   function Is_Ext
1384
     (Extending : Project_Id;
1385
      Extended  : Project_Id) return Boolean renames Is_Extending;
1386
 
1387
   function Has_Ada_Sources (Data : Project_Id) return Boolean;
1388
   --  Return True if the project has Ada sources
1389
 
1390
   Project_Error : exception;
1391
   --  Raised by some subprograms in Prj.Attr
1392
 
1393
   package Units_Htable is new Simple_HTable
1394
     (Header_Num => Header_Num,
1395
      Element    => Unit_Index,
1396
      No_Element => No_Unit_Index,
1397
      Key        => Name_Id,
1398
      Hash       => Hash,
1399
      Equal      => "=");
1400
   --  Mapping of unit names to indexes in the Units table
1401
 
1402
   ---------------------
1403
   -- Source_Iterator --
1404
   ---------------------
1405
 
1406
   type Source_Iterator is private;
1407
 
1408
   function For_Each_Source
1409
     (In_Tree           : Project_Tree_Ref;
1410
      Project           : Project_Id := No_Project;
1411
      Language          : Name_Id    := No_Name;
1412
      Encapsulated_Libs : Boolean    := True) return Source_Iterator;
1413
   --  Returns an iterator for all the sources of a project tree, or a specific
1414
   --  project, or a specific language. Include sources from aggregated libs if
1415
   --  Aggregated_Libs is True.
1416
 
1417
   function Element (Iter : Source_Iterator) return Source_Id;
1418
   --  Return the current source (or No_Source if there are no more sources)
1419
 
1420
   procedure Next (Iter : in out Source_Iterator);
1421
   --  Move on to the next source
1422
 
1423
   function Find_Source
1424
     (In_Tree          : Project_Tree_Ref;
1425
      Project          : Project_Id;
1426
      In_Imported_Only : Boolean := False;
1427
      In_Extended_Only : Boolean := False;
1428
      Base_Name        : File_Name_Type;
1429
      Index            : Int := 0) return Source_Id;
1430
   --  Find the first source file with the given name.
1431
   --  If In_Extended_Only is True, it will search in project and the project
1432
   --     it extends, but not in the imported projects.
1433
   --  Elsif In_Imported_Only is True, it will search in project and the
1434
   --     projects it imports, but not in the others or in aggregated projects.
1435
   --  Else it searches in the whole tree.
1436
   --  If Index is specified, this only search for a source with that index.
1437
 
1438
   -----------------------
1439
   -- Project_Tree_Data --
1440
   -----------------------
1441
 
1442
   package Replaced_Source_HTable is new Simple_HTable
1443
     (Header_Num => Header_Num,
1444
      Element    => File_Name_Type,
1445
      No_Element => No_File,
1446
      Key        => File_Name_Type,
1447
      Hash       => Hash,
1448
      Equal      => "=");
1449
 
1450
   type Private_Project_Tree_Data is private;
1451
   --  Data for a project tree that is used only by the Project Manager
1452
 
1453
   type Shared_Project_Tree_Data is record
1454
      Name_Lists        : Name_List_Table.Instance;
1455
      Number_Lists      : Number_List_Table.Instance;
1456
      String_Elements   : String_Element_Table.Instance;
1457
      Variable_Elements : Variable_Element_Table.Instance;
1458
      Array_Elements    : Array_Element_Table.Instance;
1459
      Arrays            : Array_Table.Instance;
1460
      Packages          : Package_Table.Instance;
1461
      Private_Part      : Private_Project_Tree_Data;
1462
   end record;
1463
   type Shared_Project_Tree_Data_Access is access all Shared_Project_Tree_Data;
1464
   --  The data that is shared among multiple trees, when these trees are
1465
   --  loaded through the same aggregate project.
1466
   --  To avoid ambiguities, limit the number of parameters to the
1467
   --  subprograms (we would have to parse the "root project tree" since this
1468
   --  is where the configuration file was loaded, in addition to the project's
1469
   --  own tree) and make the comparison of projects easier, all trees store
1470
   --  the lists in the same tables.
1471
 
1472
   type Project_Tree_Appdata is tagged null record;
1473
   type Project_Tree_Appdata_Access is access all Project_Tree_Appdata'Class;
1474
   --  Application-specific data that can be associated with a project tree.
1475
   --  We do not make the Project_Tree_Data itself tagged for several reasons:
1476
   --    - it couldn't have a default value for its discriminant
1477
   --    - it would require a "factory" to allocate such data, because trees
1478
   --      are created automatically when parsing aggregate projects.
1479
 
1480
   procedure Free (Tree : in out Project_Tree_Appdata);
1481
   --  Should be overridden if your derive your own data
1482
 
1483
   type Project_Tree_Data (Is_Root_Tree : Boolean := True) is record
1484
      --  The root tree is the one loaded by the user from the command line.
1485
      --  Is_Root_Tree is only false for projects aggregated within a root
1486
      --  aggregate project.
1487
 
1488
      Projects : Project_List;
1489
      --  List of projects in this tree
1490
 
1491
      Replaced_Sources : Replaced_Source_HTable.Instance;
1492
      --  The list of sources that have been replaced by sources with
1493
      --  different file names.
1494
 
1495
      Replaced_Source_Number : Natural := 0;
1496
      --  The number of entries in Replaced_Sources
1497
 
1498
      Units_HT : Units_Htable.Instance;
1499
      --  Unit name to Unit_Index (and from there to Source_Id)
1500
 
1501
      Source_Files_HT : Source_Files_Htable.Instance;
1502
      --  Base source file names to Source_Id list
1503
 
1504
      Source_Paths_HT : Source_Paths_Htable.Instance;
1505
      --  Full path to Source_Id
1506
      --  ??? What is behavior for multi-unit source files, where there are
1507
      --  several source_id per file ?
1508
 
1509
      Source_Info_File_Name : String_Access := null;
1510
      --  The name of the source info file, if specified by the builder
1511
 
1512
      Source_Info_File_Exists : Boolean := False;
1513
      --  True when a source info file has been successfully read
1514
 
1515
      Shared : Shared_Project_Tree_Data_Access;
1516
      --  The shared data for this tree and all aggregated trees
1517
 
1518
      Appdata : Project_Tree_Appdata_Access;
1519
      --  Application-specific data for this tree
1520
 
1521
      case Is_Root_Tree is
1522
         when True =>
1523
            Shared_Data : aliased Shared_Project_Tree_Data;
1524
            --  Do not access directly, only through Shared
1525
 
1526
         when False =>
1527
            null;
1528
      end case;
1529
   end record;
1530
   --  Data for a project tree
1531
 
1532
   function Debug_Name (Tree : Project_Tree_Ref) return Name_Id;
1533
   --  If debug traces are activated, return an identitier for the project
1534
   --  tree. This modifies Name_Buffer.
1535
 
1536
   procedure Expect (The_Token : Token_Type; Token_Image : String);
1537
   --  Check that the current token is The_Token. If it is not, then output
1538
   --  an error message.
1539
 
1540
   procedure Initialize (Tree : Project_Tree_Ref);
1541
   --  This procedure must be called before using any services from the Prj
1542
   --  hierarchy. Namet.Initialize must be called before Prj.Initialize.
1543
 
1544
   procedure Reset (Tree : Project_Tree_Ref);
1545
   --  This procedure resets all the tables that are used when processing a
1546
   --  project file tree. Initialize must be called before the call to Reset.
1547
 
1548
   package Project_Boolean_Htable is new Simple_HTable
1549
     (Header_Num => Header_Num,
1550
      Element    => Boolean,
1551
      No_Element => False,
1552
      Key        => Project_Id,
1553
      Hash       => Hash,
1554
      Equal      => "=");
1555
   --  A table that associates a project to a boolean. This is used to detect
1556
   --  whether a project was already processed for instance.
1557
 
1558
   generic
1559
      with procedure Action (Project : Project_Id; Tree : Project_Tree_Ref);
1560
   procedure For_Project_And_Aggregated
1561
     (Root_Project : Project_Id;
1562
      Root_Tree    : Project_Tree_Ref);
1563
   --  Execute Action for Root_Project and all its aggregated projects
1564
   --  recursively.
1565
 
1566
   generic
1567
      type State is limited private;
1568
      with procedure Action
1569
        (Project    : Project_Id;
1570
         Tree       : Project_Tree_Ref;
1571
         With_State : in out State);
1572
   procedure For_Every_Project_Imported
1573
     (By                 : Project_Id;
1574
      Tree               : Project_Tree_Ref;
1575
      With_State         : in out State;
1576
      Include_Aggregated : Boolean := True;
1577
      Imported_First     : Boolean := False);
1578
   --  Call Action for each project imported directly or indirectly by project
1579
   --  By, as well as extended projects.
1580
   --
1581
   --  The order of processing depends on Imported_First:
1582
   --
1583
   --    If False, Action is called according to the order of importation: if A
1584
   --    imports B, directly or indirectly, Action will be called for A before
1585
   --    it is called for B. If two projects import each other directly or
1586
   --    indirectly (using at least one "limited with"), it is not specified
1587
   --    for which of these two projects Action will be called first.
1588
   --
1589
   --    The order is reversed if Imported_First is True
1590
   --
1591
   --  With_State may be used by Action to choose a behavior or to report some
1592
   --  global result.
1593
   --
1594
   --  If Include_Aggregated is True, then an aggregate project will recurse
1595
   --  into the projects it aggregates. Otherwise, the latter are never
1596
   --  returned.
1597
   --
1598
   --  In_Aggregate_Lib is True if the project is in an aggregate library
1599
   --
1600
   --  The Tree argument passed to the callback is required in the case of
1601
   --  aggregated projects, since they might not be using the same tree as 'By'
1602
 
1603
   type Project_Context is record
1604
      In_Aggregate_Lib : Boolean;
1605
      --  True if the project is part of an aggregate library
1606
 
1607
      From_Encapsulated_Lib : Boolean;
1608
      --  True if the project is imported from an encapsulated library
1609
   end record;
1610
 
1611
   generic
1612
      type State is limited private;
1613
      with procedure Action
1614
        (Project    : Project_Id;
1615
         Tree       : Project_Tree_Ref;
1616
         Context    : Project_Context;
1617
         With_State : in out State);
1618
   procedure For_Every_Project_Imported_Context
1619
     (By                 : Project_Id;
1620
      Tree               : Project_Tree_Ref;
1621
      With_State         : in out State;
1622
      Include_Aggregated : Boolean := True;
1623
      Imported_First     : Boolean := False);
1624
   --  As for For_Every_Project_Imported but with an associated context
1625
 
1626
   generic
1627
      with procedure Action
1628
        (Project : Project_Id;
1629
         Tree    : Project_Tree_Ref;
1630
         Context : Project_Context);
1631
   procedure For_Project_And_Aggregated_Context
1632
     (Root_Project : Project_Id;
1633
      Root_Tree    : Project_Tree_Ref);
1634
   --  As for For_Project_And_Aggregated but with an associated context
1635
 
1636
   function Extend_Name
1637
     (File        : File_Name_Type;
1638
      With_Suffix : String) return File_Name_Type;
1639
   --  Replace the extension of File with With_Suffix
1640
 
1641
   function Object_Name
1642
     (Source_File_Name   : File_Name_Type;
1643
      Object_File_Suffix : Name_Id := No_Name) return File_Name_Type;
1644
   --  Returns the object file name corresponding to a source file name
1645
 
1646
   function Object_Name
1647
     (Source_File_Name   : File_Name_Type;
1648
      Source_Index       : Int;
1649
      Index_Separator    : Character;
1650
      Object_File_Suffix : Name_Id := No_Name) return File_Name_Type;
1651
   --  Returns the object file name corresponding to a unit in a multi-source
1652
   --  file.
1653
 
1654
   function Dependency_Name
1655
     (Source_File_Name : File_Name_Type;
1656
      Dependency       : Dependency_File_Kind) return File_Name_Type;
1657
   --  Returns the dependency file name corresponding to a source file name
1658
 
1659
   function Switches_Name
1660
     (Source_File_Name : File_Name_Type) return File_Name_Type;
1661
   --  Returns the switches file name corresponding to a source file name
1662
 
1663
   procedure Set_Path_File_Var (Name : String; Value : String);
1664
   --  Call Setenv, after calling To_Host_File_Spec
1665
 
1666
   function Current_Source_Path_File_Of
1667
     (Shared : Shared_Project_Tree_Data_Access) return Path_Name_Type;
1668
   --  Get the current include path file name
1669
 
1670
   procedure Set_Current_Source_Path_File_Of
1671
     (Shared : Shared_Project_Tree_Data_Access;
1672
      To     : Path_Name_Type);
1673
   --  Record the current include path file name
1674
 
1675
   function Current_Object_Path_File_Of
1676
     (Shared : Shared_Project_Tree_Data_Access) return Path_Name_Type;
1677
   --  Get the current object path file name
1678
 
1679
   procedure Set_Current_Object_Path_File_Of
1680
     (Shared : Shared_Project_Tree_Data_Access;
1681
      To     : Path_Name_Type);
1682
   --  Record the current object path file name
1683
 
1684
   -----------
1685
   -- Flags --
1686
   -----------
1687
 
1688
   type Processing_Flags is private;
1689
   --  Flags used while parsing and processing a project tree to configure the
1690
   --  behavior of the parser, and indicate how to report error messages. This
1691
   --  structure does not allocate memory and never needs to be freed
1692
 
1693
   type Error_Warning is (Silent, Warning, Error);
1694
   --  Severity of some situations, such as: no Ada sources in a project where
1695
   --  Ada is one of the language.
1696
   --
1697
   --  When the situation occurs, the behaviour depends on the setting:
1698
   --
1699
   --    - Silent:  no action
1700
   --    - Warning: issue a warning, does not cause the tool to fail
1701
   --    - Error:   issue an error, causes the tool to fail
1702
 
1703
   type Error_Handler is access procedure
1704
     (Project    : Project_Id;
1705
      Is_Warning : Boolean);
1706
   --  This warns when an error was found when parsing a project. The error
1707
   --  itself is handled through Prj.Err (and Prj.Err.Finalize should be called
1708
   --  to actually print the error). This ensures that duplicate error messages
1709
   --  are always correctly removed, that errors msgs are sorted, and that all
1710
   --  tools will report the same error to the user.
1711
 
1712
   function Create_Flags
1713
     (Report_Error               : Error_Handler;
1714
      When_No_Sources            : Error_Warning;
1715
      Require_Sources_Other_Lang : Boolean       := True;
1716
      Allow_Duplicate_Basenames  : Boolean       := True;
1717
      Compiler_Driver_Mandatory  : Boolean       := False;
1718
      Error_On_Unknown_Language  : Boolean       := True;
1719
      Require_Obj_Dirs           : Error_Warning := Error;
1720
      Allow_Invalid_External     : Error_Warning := Error;
1721
      Missing_Source_Files       : Error_Warning := Error;
1722
      Ignore_Missing_With        : Boolean       := False)
1723
      return Processing_Flags;
1724
   --  Function used to create Processing_Flags structure
1725
   --
1726
   --  If Allow_Duplicate_Basenames, then files with the same base names are
1727
   --  authorized within a project for source-based languages (never for unit
1728
   --  based languages).
1729
   --
1730
   --  If Compiler_Driver_Mandatory is true, then a Compiler.Driver attribute
1731
   --  for each language must be defined, or we will not look for its source
1732
   --  files.
1733
   --
1734
   --  When_No_Sources indicates what should be done when no sources of a
1735
   --  language are found in a project where this language is declared.
1736
   --  If Require_Sources_Other_Lang is true, then all languages must have at
1737
   --  least one source file, or an error is reported via When_No_Sources. If
1738
   --  it is false, this is only required for Ada (and only if it is a language
1739
   --  of the project). When this parameter is set to False, we do not check
1740
   --  that a proper naming scheme is defined for languages other than Ada.
1741
   --
1742
   --  If Report_Error is null, use the standard error reporting mechanism
1743
   --  (Errout). Otherwise, report errors using Report_Error.
1744
   --
1745
   --  If Error_On_Unknown_Language is true, an error is displayed if some of
1746
   --  the source files listed in the project do not match any naming scheme
1747
   --
1748
   --  If Require_Obj_Dirs is true, then all object directories must exist
1749
   --  (possibly after they have been created automatically if the appropriate
1750
   --  switches were specified), or an error is raised.
1751
   --
1752
   --  If Allow_Invalid_External is Silent, then no error is reported when an
1753
   --  invalid value is used for an external variable (and it doesn't match its
1754
   --  type). Instead, the first possible value is used.
1755
   --
1756
   --  Missing_Source_Files indicates whether it is an error or a warning that
1757
   --  a source file mentioned in the Source_Files attributes is not actually
1758
   --  found in the source directories. This also impacts errors for missing
1759
   --  source directories.
1760
   --
1761
   --  If Ignore_Missing_With is True, then a "with" statement that cannot be
1762
   --  resolved will simply be ignored. However, in such a case, the flag
1763
   --  Incomplete_With in the project tree will be set to True.
1764
   --  This is meant for use by tools so that they can properly set the
1765
   --  project path in such a case:
1766
   --       * no "gnatls" found (so no default project path)
1767
   --       * user project sets Project.IDE'gnatls attribute to a cross gnatls
1768
   --       * user project also includes a "with" that can only be resolved
1769
   --         once we have found the gnatls
1770
 
1771
   Gprbuild_Flags : constant Processing_Flags;
1772
   Gprclean_Flags : constant Processing_Flags;
1773
   Gnatmake_Flags : constant Processing_Flags;
1774
   --  Flags used by the various tools. They all display the error messages
1775
   --  through Prj.Err.
1776
 
1777
   ----------------
1778
   -- Temp Files --
1779
   ----------------
1780
 
1781
   procedure Record_Temp_File
1782
     (Shared : Shared_Project_Tree_Data_Access;
1783
      Path   : Path_Name_Type);
1784
   --  Record the path of a newly created temporary file, so that it can be
1785
   --  deleted later.
1786
 
1787
   procedure Delete_All_Temp_Files
1788
     (Shared : Shared_Project_Tree_Data_Access);
1789
   --  Delete all recorded temporary files.
1790
   --  Does nothing if Debug.Debug_Flag_N is set
1791
 
1792
   procedure Delete_Temp_Config_Files (Project_Tree : Project_Tree_Ref);
1793
   --  Delete all temporary config files. Does nothing if Debug.Debug_Flag_N is
1794
   --  set or if Project_Tree is null. This initially came from gnatmake
1795
   --  ??? Should this be combined with Delete_All_Temp_Files above
1796
 
1797
   procedure Delete_Temporary_File
1798
     (Shared : Shared_Project_Tree_Data_Access := null;
1799
      Path   : Path_Name_Type);
1800
   --  Delete a temporary file from the disk. The file is also removed from the
1801
   --  list of temporary files to delete at the end of the program, in case
1802
   --  another program running on the same machine has recreated it. Does
1803
   --  nothing if Debug.Debug_Flag_N is set
1804
 
1805
   Virtual_Prefix : constant String := "v$";
1806
   --  The prefix for virtual extending projects. Because of the '$', which is
1807
   --  normally forbidden for project names, there cannot be any name clash.
1808
 
1809
   -----------
1810
   -- Debug --
1811
   -----------
1812
 
1813
   type Verbosity is (Default, Medium, High);
1814
   pragma Ordered (Verbosity);
1815
   --  Verbosity when parsing GNAT Project Files
1816
   --    Default is default (very quiet, if no errors).
1817
   --    Medium is more verbose.
1818
   --    High is extremely verbose.
1819
 
1820
   Current_Verbosity : Verbosity := Default;
1821
   --  The current value of the verbosity the project files are parsed with
1822
 
1823
   procedure Debug_Indent;
1824
   --  Inserts a series of blanks depending on the current indentation level
1825
 
1826
   procedure Debug_Output (Str : String);
1827
   procedure Debug_Output (Str : String; Str2 : Name_Id);
1828
   --  If Current_Verbosity is not Default, outputs Str.
1829
   --  This indents Str based on the current indentation level for traces
1830
   --  Debug_Error is intended to be used to report an error in the traces.
1831
 
1832
   procedure Debug_Increase_Indent
1833
     (Str : String := ""; Str2 : Name_Id := No_Name);
1834
   procedure Debug_Decrease_Indent (Str : String := "");
1835
   --  Increase or decrease the indentation level for debug traces. This
1836
   --  indentation level only affects output done through Debug_Output.
1837
 
1838
private
1839
 
1840
   All_Packages : constant String_List_Access := null;
1841
 
1842
   No_Project_Tree : constant Project_Tree_Ref := null;
1843
 
1844
   Ignored : constant Variable_Kind := Single;
1845
 
1846
   Nil_Variable_Value : constant Variable_Value :=
1847
                          (Project  => No_Project,
1848
                           Kind     => Undefined,
1849
                           Location => No_Location,
1850
                           Default  => False);
1851
 
1852
   type Source_Iterator is record
1853
      In_Tree : Project_Tree_Ref;
1854
 
1855
      Project      : Project_List;
1856
      All_Projects : Boolean;
1857
      --  Current project and whether we should move on to the next
1858
 
1859
      Language : Language_Ptr;
1860
      --  Current language processed
1861
 
1862
      Language_Name : Name_Id;
1863
      --  Only sources of this language will be returned (or all if No_Name)
1864
 
1865
      Current : Source_Id;
1866
 
1867
      Encapsulated_Libs : Boolean;
1868
      --  True if we want to include the sources from encapsulated libs
1869
   end record;
1870
 
1871
   procedure Add_To_Buffer
1872
     (S    : String;
1873
      To   : in out String_Access;
1874
      Last : in out Natural);
1875
   --  Append a String to the Buffer
1876
 
1877
   package Temp_Files_Table is new GNAT.Dynamic_Tables
1878
     (Table_Component_Type => Path_Name_Type,
1879
      Table_Index_Type     => Integer,
1880
      Table_Low_Bound      => 1,
1881
      Table_Initial        => 10,
1882
      Table_Increment      => 10);
1883
   --  Table to store the path name of all the created temporary files, so that
1884
   --  they can be deleted at the end, or when the program is interrupted.
1885
 
1886
   type Private_Project_Tree_Data is record
1887
      Temp_Files   : Temp_Files_Table.Instance;
1888
      --  Temporary files created as part of running tools (pragma files,
1889
      --  mapping files,...)
1890
 
1891
      Current_Source_Path_File : Path_Name_Type := No_Path;
1892
      --  Current value of project source path file env var. Used to avoid
1893
      --  setting the env var to the same value. When different from No_Path,
1894
      --  this indicates that logical names (VMS) or environment variables were
1895
      --  created and should be deassigned to avoid polluting the environment
1896
      --  on VMS.
1897
      --  gnatmake only
1898
 
1899
      Current_Object_Path_File : Path_Name_Type := No_Path;
1900
      --  Current value of project object path file env var. Used to avoid
1901
      --  setting the env var to the same value.
1902
      --  gnatmake only
1903
 
1904
   end record;
1905
   --  Type to represent the part of a project tree which is private to the
1906
   --  Project Manager.
1907
 
1908
   type Processing_Flags is record
1909
      Require_Sources_Other_Lang : Boolean;
1910
      Report_Error               : Error_Handler;
1911
      When_No_Sources            : Error_Warning;
1912
      Allow_Duplicate_Basenames  : Boolean;
1913
      Compiler_Driver_Mandatory  : Boolean;
1914
      Error_On_Unknown_Language  : Boolean;
1915
      Require_Obj_Dirs           : Error_Warning;
1916
      Allow_Invalid_External     : Error_Warning;
1917
      Missing_Source_Files       : Error_Warning;
1918
      Ignore_Missing_With        : Boolean;
1919
   end record;
1920
 
1921
   Gprbuild_Flags : constant Processing_Flags :=
1922
                      (Report_Error               => null,
1923
                       When_No_Sources            => Warning,
1924
                       Require_Sources_Other_Lang => True,
1925
                       Allow_Duplicate_Basenames  => False,
1926
                       Compiler_Driver_Mandatory  => True,
1927
                       Error_On_Unknown_Language  => True,
1928
                       Require_Obj_Dirs           => Error,
1929
                       Allow_Invalid_External     => Error,
1930
                       Missing_Source_Files       => Error,
1931
                       Ignore_Missing_With        => False);
1932
 
1933
   Gprclean_Flags : constant Processing_Flags :=
1934
                      (Report_Error               => null,
1935
                       When_No_Sources            => Warning,
1936
                       Require_Sources_Other_Lang => True,
1937
                       Allow_Duplicate_Basenames  => False,
1938
                       Compiler_Driver_Mandatory  => True,
1939
                       Error_On_Unknown_Language  => True,
1940
                       Require_Obj_Dirs           => Warning,
1941
                       Allow_Invalid_External     => Error,
1942
                       Missing_Source_Files       => Error,
1943
                       Ignore_Missing_With        => False);
1944
 
1945
   Gnatmake_Flags : constant Processing_Flags :=
1946
                      (Report_Error               => null,
1947
                       When_No_Sources            => Error,
1948
                       Require_Sources_Other_Lang => False,
1949
                       Allow_Duplicate_Basenames  => False,
1950
                       Compiler_Driver_Mandatory  => False,
1951
                       Error_On_Unknown_Language  => False,
1952
                       Require_Obj_Dirs           => Error,
1953
                       Allow_Invalid_External     => Error,
1954
                       Missing_Source_Files       => Error,
1955
                       Ignore_Missing_With        => False);
1956
 
1957
end Prj;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.