1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2003 Free Software Foundation, Inc. --
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 2, 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 COPYING. If not, write --
19 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
20 -- MA 02111-1307, USA. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
27 -- The following package declares the data types for GNAT project.
28 -- These data types may be used by GNAT Project-aware tools.
30 -- Children of these package implements various services on these data types.
31 -- See in particular Prj.Pars and Prj.Env.
33 with Casing
; use Casing
;
34 with Scans
; use Scans
;
36 with Types
; use Types
;
38 with GNAT
.OS_Lib
; use GNAT
.OS_Lib
;
43 -- Name_Id for an empty name (no characters).
44 -- Initialized by procedure Initialize.
46 All_Packages
: constant String_List_Access
:= null;
47 -- Default value of parameter Packages of procedures Parse, in Prj.Pars and
48 -- Prj.Part, indicating that all packages should be checked.
50 Virtual_Prefix
: constant String := "v$";
51 -- The prefix for virtual extending projects. Because of the '$', which is
52 -- normally forbidden for project names, there cannot be any name clash.
54 Project_File_Extension
: String := ".gpr";
55 -- The standard project file name extension.
56 -- It is not a constant, because Canonical_Case_File_Name is called
57 -- on this variable in the body of Prj.
59 Default_Ada_Spec_Suffix
: Name_Id
;
60 -- The Name_Id for the standard GNAT suffix for Ada spec source file
61 -- name ".ads". Initialized by Prj.Initialize.
63 Default_Ada_Body_Suffix
: Name_Id
;
64 -- The Name_Id for the standard GNAT suffix for Ada body source file
65 -- name ".adb". Initialized by Prj.Initialize.
68 -- "/", used as the path of locally removed files
70 type Verbosity
is (Default
, Medium
, High
);
71 -- Verbosity when parsing GNAT Project Files
72 -- Default is default (very quiet, if no errors).
73 -- Medium is more verbose.
74 -- High is extremely verbose.
76 type Lib_Kind
is (Static
, Dynamic
, Relocatable
);
78 type Policy
is (Autonomous
, Compliant
, Controlled
);
79 -- See explaination about this type in package Symbol
81 type Symbol_Record
is record
82 Symbol_File
: Name_Id
:= No_Name
;
83 Reference
: Name_Id
:= No_Name
;
84 Symbol_Policy
: Policy
:= Autonomous
;
86 -- Type to keep the symbol data to be used when building a shared library
88 No_Symbols
: Symbol_Record
:=
89 (Symbol_File
=> No_Name
,
91 Symbol_Policy
=> Autonomous
);
93 function Empty_String
return Name_Id
;
95 type Project_Id
is new Nat
;
96 No_Project
: constant Project_Id
:= 0;
97 -- Id of a Project File
99 type String_List_Id
is new Nat
;
100 Nil_String
: constant String_List_Id
:= 0;
101 type String_Element
is record
102 Value
: Name_Id
:= No_Name
;
103 Display_Value
: Name_Id
:= No_Name
;
104 Location
: Source_Ptr
:= No_Location
;
105 Flag
: Boolean := False;
106 Next
: String_List_Id
:= Nil_String
;
108 -- To hold values for string list variables and array elements.
109 -- Component Flag may be used for various purposes. For source
110 -- directories, it indicates if the directory contains Ada source(s).
112 package String_Elements
is new Table
.Table
113 (Table_Component_Type
=> String_Element
,
114 Table_Index_Type
=> String_List_Id
,
115 Table_Low_Bound
=> 1,
116 Table_Initial
=> 200,
117 Table_Increment
=> 100,
118 Table_Name
=> "Prj.String_Elements");
119 -- The table for string elements in string lists
121 type Variable_Kind
is (Undefined
, List
, Single
);
122 -- Different kinds of variables
124 Ignored
: constant Variable_Kind
:= Single
;
125 -- Used to indicate that a package declaration must be ignored
126 -- while processing the project tree (unknown package name).
128 type Variable_Value
(Kind
: Variable_Kind
:= Undefined
) is record
129 Project
: Project_Id
:= No_Project
;
130 Location
: Source_Ptr
:= No_Location
;
131 Default
: Boolean := False;
136 Values
: String_List_Id
:= Nil_String
;
138 Value
: Name_Id
:= No_Name
;
141 -- Values for variables and array elements.
142 -- Default is True if the current value is the default one for the variable
144 Nil_Variable_Value
: constant Variable_Value
:=
145 (Project
=> No_Project
,
147 Location
=> No_Location
,
149 -- Value of a non existing variable or array element
151 type Variable_Id
is new Nat
;
152 No_Variable
: constant Variable_Id
:= 0;
153 type Variable
is record
154 Next
: Variable_Id
:= No_Variable
;
156 Value
: Variable_Value
;
158 -- To hold the list of variables in a project file and in packages
160 package Variable_Elements
is new Table
.Table
161 (Table_Component_Type
=> Variable
,
162 Table_Index_Type
=> Variable_Id
,
163 Table_Low_Bound
=> 1,
164 Table_Initial
=> 200,
165 Table_Increment
=> 100,
166 Table_Name
=> "Prj.Variable_Elements");
167 -- The table of variable in list of variables
169 type Array_Element_Id
is new Nat
;
170 No_Array_Element
: constant Array_Element_Id
:= 0;
171 type Array_Element
is record
173 Index_Case_Sensitive
: Boolean := True;
174 Value
: Variable_Value
;
175 Next
: Array_Element_Id
:= No_Array_Element
;
177 -- Each Array_Element represents an array element and is linked (Next)
178 -- to the next array element, if any, in the array.
180 package Array_Elements
is new Table
.Table
181 (Table_Component_Type
=> Array_Element
,
182 Table_Index_Type
=> Array_Element_Id
,
183 Table_Low_Bound
=> 1,
184 Table_Initial
=> 200,
185 Table_Increment
=> 100,
186 Table_Name
=> "Prj.Array_Elements");
187 -- The table that contains all array elements
189 type Array_Id
is new Nat
;
190 No_Array
: constant Array_Id
:= 0;
191 type Array_Data
is record
192 Name
: Name_Id
:= No_Name
;
193 Value
: Array_Element_Id
:= No_Array_Element
;
194 Next
: Array_Id
:= No_Array
;
196 -- Each Array_Data value represents an array.
197 -- Value is the id of the first element.
198 -- Next is the id of the next array in the project file or package.
200 package Arrays
is new Table
.Table
201 (Table_Component_Type
=> Array_Data
,
202 Table_Index_Type
=> Array_Id
,
203 Table_Low_Bound
=> 1,
204 Table_Initial
=> 200,
205 Table_Increment
=> 100,
206 Table_Name
=> "Prj.Arrays");
207 -- The table that contains all arrays
209 type Package_Id
is new Nat
;
210 No_Package
: constant Package_Id
:= 0;
211 type Declarations
is record
212 Variables
: Variable_Id
:= No_Variable
;
213 Attributes
: Variable_Id
:= No_Variable
;
214 Arrays
: Array_Id
:= No_Array
;
215 Packages
: Package_Id
:= No_Package
;
218 No_Declarations
: constant Declarations
:=
219 (Variables
=> No_Variable
,
220 Attributes
=> No_Variable
,
222 Packages
=> No_Package
);
223 -- Declarations. Used in project structures and packages (what for???)
225 type Package_Element
is record
226 Name
: Name_Id
:= No_Name
;
227 Decl
: Declarations
:= No_Declarations
;
228 Parent
: Package_Id
:= No_Package
;
229 Next
: Package_Id
:= No_Package
;
231 -- A package. Includes declarations that may include other packages.
233 package Packages
is new Table
.Table
234 (Table_Component_Type
=> Package_Element
,
235 Table_Index_Type
=> Package_Id
,
236 Table_Low_Bound
=> 1,
237 Table_Initial
=> 100,
238 Table_Increment
=> 100,
239 Table_Name
=> "Prj.Packages");
240 -- The table that contains all packages.
242 function Image
(Casing
: Casing_Type
) return String;
243 -- Similar to 'Image (but avoid use of this attribute in compiler)
245 function Value
(Image
: String) return Casing_Type
;
246 -- Similar to 'Value (but avoid use of this attribute in compiler)
247 -- Raises Constraint_Error if not a Casing_Type image.
249 -- The following record contains data for a naming scheme
251 type Naming_Data
is record
252 Current_Language
: Name_Id
:= No_Name
;
253 -- The programming language being currently considered
255 Dot_Replacement
: Name_Id
:= No_Name
;
256 -- The string to replace '.' in the source file name (for Ada).
258 Dot_Repl_Loc
: Source_Ptr
:= No_Location
;
259 -- The position in the project file source where
260 -- Dot_Replacement is defined.
262 Casing
: Casing_Type
:= All_Lower_Case
;
263 -- The casing of the source file name (for Ada).
265 Spec_Suffix
: Array_Element_Id
:= No_Array_Element
;
266 -- The string to append to the unit name for the
267 -- source file name of a spec.
268 -- Indexed by the programming language.
270 Current_Spec_Suffix
: Name_Id
:= No_Name
;
271 -- The "spec" suffix of the current programming language
273 Spec_Suffix_Loc
: Source_Ptr
:= No_Location
;
274 -- The position in the project file source where
275 -- Current_Spec_Suffix is defined.
277 Body_Suffix
: Array_Element_Id
:= No_Array_Element
;
278 -- The string to append to the unit name for the
279 -- source file name of a body.
280 -- Indexed by the programming language.
282 Current_Body_Suffix
: Name_Id
:= No_Name
;
283 -- The "body" suffix of the current programming language
285 Body_Suffix_Loc
: Source_Ptr
:= No_Location
;
286 -- The position in the project file source where
287 -- Current_Body_Suffix is defined.
289 Separate_Suffix
: Name_Id
:= No_Name
;
290 -- The string to append to the unit name for the
291 -- source file name of an Ada subunit.
293 Sep_Suffix_Loc
: Source_Ptr
:= No_Location
;
294 -- The position in the project file source where
295 -- Separate_Suffix is defined.
297 Specs
: Array_Element_Id
:= No_Array_Element
;
298 -- An associative array mapping individual specs
299 -- to source file names. Specific to Ada.
301 Bodies
: Array_Element_Id
:= No_Array_Element
;
302 -- An associative array mapping individual bodies
303 -- to source file names. Specific to Ada.
305 Specification_Exceptions
: Array_Element_Id
:= No_Array_Element
;
306 -- An associative array listing spec file names that don't have the
307 -- spec suffix. Not used by Ada. Indexed by the programming language
310 Implementation_Exceptions
: Array_Element_Id
:= No_Array_Element
;
311 -- An associative array listing body file names that don't have the
312 -- body suffix. Not used by Ada. Indexed by the programming language
317 function Standard_Naming_Data
return Naming_Data
;
318 pragma Inline
(Standard_Naming_Data
);
319 -- The standard GNAT naming scheme.
321 function Same_Naming_Scheme
322 (Left
, Right
: Naming_Data
)
324 -- Returns True if Left and Right are the same naming scheme
325 -- not considering Specs and Bodies.
327 type Project_List
is new Nat
;
328 Empty_Project_List
: constant Project_List
:= 0;
329 -- A list of project files.
331 type Project_Element
is record
332 Project
: Project_Id
:= No_Project
;
333 Next
: Project_List
:= Empty_Project_List
;
335 -- Element in a list of project file.
336 -- Next is the id of the next project file in the list.
338 package Project_Lists
is new Table
.Table
339 (Table_Component_Type
=> Project_Element
,
340 Table_Index_Type
=> Project_List
,
341 Table_Low_Bound
=> 1,
342 Table_Initial
=> 100,
343 Table_Increment
=> 100,
344 Table_Name
=> "Prj.Project_Lists");
345 -- The table that contains the lists of project files.
347 -- The following record describes a project file representation
349 type Project_Data
is record
350 First_Referred_By
: Project_Id
:= No_Project
;
351 -- The project, if any, that was the first to be known
352 -- as importing or extending this project.
353 -- Set by Prj.Proc.Process.
355 Name
: Name_Id
:= No_Name
;
356 -- The name of the project.
357 -- Set by Prj.Proc.Process.
359 Path_Name
: Name_Id
:= No_Name
;
360 -- The path name of the project file.
361 -- Set by Prj.Proc.Process.
363 Virtual
: Boolean := False;
364 -- True for virtual extending projects
366 Display_Path_Name
: Name_Id
:= No_Name
;
368 Location
: Source_Ptr
:= No_Location
;
369 -- The location in the project file source of the
370 -- reserved word project.
371 -- Set by Prj.Proc.Process.
373 Mains
: String_List_Id
:= Nil_String
;
374 -- The list of mains as specified by attribute Main.
375 -- Set by Prj.Nmsc.Ada_Check.
377 Directory
: Name_Id
:= No_Name
;
378 -- The directory where the project file resides.
379 -- Set by Prj.Proc.Process.
381 Display_Directory
: Name_Id
:= No_Name
;
383 Dir_Path
: String_Access
;
384 -- Same as Directory, but as an access to String.
385 -- Set by Make.Compile_Sources.Collect_Arguments_And_Compile.
387 Library
: Boolean := False;
388 -- True if this is a library project.
389 -- Set by Prj.Nmsc.Language_Independent_Check.
391 Library_Dir
: Name_Id
:= No_Name
;
392 -- If a library project, directory where resides the library
393 -- Set by Prj.Nmsc.Language_Independent_Check.
395 Display_Library_Dir
: Name_Id
:= No_Name
;
397 Library_Src_Dir
: Name_Id
:= No_Name
;
398 -- If a library project, directory where the sources and the ALI files
399 -- of the library are copied. By default, if attribute Library_Src_Dir
400 -- is not specified, sources are not copied anywhere and ALI files are
401 -- copied in the Library Directory.
402 -- Set by Prj.Nmsc.Language_Independent_Check.
404 Display_Library_Src_Dir
: Name_Id
:= No_Name
;
406 Library_Name
: Name_Id
:= No_Name
;
407 -- If a library project, name of the library
408 -- Set by Prj.Nmsc.Language_Independent_Check.
410 Library_Kind
: Lib_Kind
:= Static
;
411 -- If a library project, kind of library
412 -- Set by Prj.Nmsc.Language_Independent_Check.
414 Lib_Internal_Name
: Name_Id
:= No_Name
;
415 -- If a library project, internal name store inside the library
416 -- Set by Prj.Nmsc.Language_Independent_Check.
418 Lib_Elaboration
: Boolean := False;
419 -- If a library project, indicate if <lib>init and <lib>final
420 -- procedures need to be defined.
421 -- Set by Prj.Nmsc.Language_Independent_Check.
423 Standalone_Library
: Boolean := False;
424 -- Indicate that this is a Standalone Library Project File.
425 -- Set by Prj.Nmsc.Ada_Check.
427 Lib_Interface_ALIs
: String_List_Id
:= Nil_String
;
428 -- For Standalone Library Project Files, indicate the list
429 -- of Interface ALI files.
430 -- Set by Prj.Nmsc.Ada_Check.
432 Lib_Auto_Init
: Boolean := False;
433 -- For non static Standalone Library Project Files, indicate if
434 -- the library initialisation should be automatic.
436 Symbol_Data
: Symbol_Record
:= No_Symbols
;
437 -- Symbol file name, reference symbol file name, symbol policy
439 Sources_Present
: Boolean := True;
440 -- A flag that indicates if there are sources in this project file.
441 -- There are no sources if 1) Source_Dirs is specified as an
442 -- empty list, 2) Source_Files is specified as an empty list, or
443 -- 3) the current language is not in the list of the specified
446 Sources
: String_List_Id
:= Nil_String
;
447 -- The list of all the source file names.
448 -- Set by Prj.Nmsc.Check_Naming_Scheme.
450 Source_Dirs
: String_List_Id
:= Nil_String
;
451 -- The list of all the source directories.
452 -- Set by Prj.Nmsc.Check_Naming_Scheme.
454 Known_Order_Of_Source_Dirs
: Boolean := True;
455 -- False, if there is any /** in the Source_Dirs, because in this case
456 -- the ordering of the source subdirs depend on the OS. If True,
457 -- duplicate file names in the same project file are allowed.
459 Object_Directory
: Name_Id
:= No_Name
;
460 -- The object directory of this project file.
461 -- Set by Prj.Nmsc.Check_Naming_Scheme.
463 Display_Object_Dir
: Name_Id
:= No_Name
;
465 Exec_Directory
: Name_Id
:= No_Name
;
466 -- The exec directory of this project file.
467 -- Default is equal to Object_Directory.
468 -- Set by Prj.Nmsc.Check_Naming_Scheme.
470 Display_Exec_Dir
: Name_Id
:= No_Name
;
472 Extends
: Project_Id
:= No_Project
;
473 -- The reference of the project file, if any, that this
474 -- project file extends.
475 -- Set by Prj.Proc.Process.
477 Extended_By
: Project_Id
:= No_Project
;
478 -- The reference of the project file, if any, that
479 -- extends this project file.
480 -- Set by Prj.Proc.Process.
482 Naming
: Naming_Data
:= Standard_Naming_Data
;
483 -- The naming scheme of this project file.
484 -- Set by Prj.Nmsc.Check_Naming_Scheme.
486 Decl
: Declarations
:= No_Declarations
;
487 -- The declarations (variables, attributes and packages)
488 -- of this project file.
489 -- Set by Prj.Proc.Process.
491 Imported_Projects
: Project_List
:= Empty_Project_List
;
492 -- The list of all directly imported projects, if any.
493 -- Set by Prj.Proc.Process.
495 Ada_Include_Path
: String_Access
:= null;
496 -- The cached value of ADA_INCLUDE_PATH for this project file.
497 -- Do not use this field directly outside of the compiler, use
498 -- Prj.Env.Ada_Include_Path instead.
499 -- Set by Prj.Env.Ada_Include_Path.
501 Ada_Objects_Path
: String_Access
:= null;
502 -- The cached value of ADA_OBJECTS_PATH for this project file.
503 -- Do not use this field directly outside of the compiler, use
504 -- Prj.Env.Ada_Objects_Path instead.
505 -- Set by Prj.Env.Ada_Objects_Path
507 Include_Path_File
: Name_Id
:= No_Name
;
508 -- The cached value of the source path temp file for this project file.
509 -- Set by gnatmake (Prj.Env.Set_Ada_Paths).
511 Objects_Path_File_With_Libs
: Name_Id
:= No_Name
;
512 -- The cached value of the object path temp file (including library
513 -- dirs) for this project file.
514 -- Set by gnatmake (Prj.Env.Set_Ada_Paths).
516 Objects_Path_File_Without_Libs
: Name_Id
:= No_Name
;
517 -- The cached value of the object path temp file (excluding library
518 -- dirs) for this project file.
519 -- Set by gnatmake (Prj.Env.Set_Ada_Paths).
521 Config_File_Name
: Name_Id
:= No_Name
;
522 -- The name of the configuration pragmas file, if any.
523 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
525 Config_File_Temp
: Boolean := False;
526 -- An indication that the configuration pragmas file is
527 -- a temporary file that must be deleted at the end.
528 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
530 Config_Checked
: Boolean := False;
531 -- A flag to avoid checking repetitively the configuration pragmas file.
532 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
534 Language_Independent_Checked
: Boolean := False;
535 -- A flag that indicates that the project file has been checked
536 -- for language independent features: Object_Directory,
537 -- Source_Directories, Library, non empty Naming Suffixs.
539 Checked
: Boolean := False;
540 -- A flag to avoid checking repetitively the naming scheme of
541 -- this project file.
542 -- Set by Prj.Nmsc.Check_Naming_Scheme.
544 Seen
: Boolean := False;
545 Flag1
: Boolean := False;
546 Flag2
: Boolean := False;
547 -- Various flags that are used in an ad hoc manner
548 -- That's really not a good enough comment ??? we need to know what
549 -- these flags are used for, and give them proper names. If Flag1
550 -- and Flag2 have multiple uses, then either we use multiple fields
551 -- or a renaming scheme.
553 Depth
: Natural := 0;
554 -- The maximum depth of a project in the project graph.
555 -- Depth of main project is 0.
557 Unkept_Comments
: Boolean := False;
558 -- True if there are comments in the project sources that cannot
559 -- be kept in the project tree.
563 function Empty_Project
return Project_Data
;
564 -- Return the representation of an empty project.
566 package Projects
is new Table
.Table
(
567 Table_Component_Type
=> Project_Data
,
568 Table_Index_Type
=> Project_Id
,
569 Table_Low_Bound
=> 1,
570 Table_Initial
=> 100,
571 Table_Increment
=> 100,
572 Table_Name
=> "Prj.Projects");
573 -- The set of all project files.
575 type Put_Line_Access
is access procedure
577 Project
: Project_Id
);
578 -- Use to customize error reporting in Prj.Proc and Prj.Nmsc.
580 procedure Expect
(The_Token
: Token_Type
; Token_Image
: String);
581 -- Check that the current token is The_Token. If it is not, then
582 -- output an error message.
584 procedure Initialize
;
585 -- This procedure must be called before using any services from the Prj
586 -- hierarchy. Namet.Initialize must be called before Prj.Initialize.
589 -- This procedure resets all the tables that are used when processing a
590 -- project file tree. Initialize must be called before the call to Reset.
592 procedure Register_Default_Naming_Scheme
594 Default_Spec_Suffix
: Name_Id
;
595 Default_Body_Suffix
: Name_Id
);
596 -- Register the default suffixs for a given language. These extensions
597 -- will be ignored if the user has specified a new naming scheme in a
600 -- Otherwise, this information will be automatically added to Naming_Data
601 -- when a project is processed, in the lists Spec_Suffix and Body_Suffix.
604 type State
is limited private;
605 with procedure Action
606 (Project
: Project_Id
;
607 With_State
: in out State
);
608 procedure For_Every_Project_Imported
610 With_State
: in out State
);
611 -- Call Action for each project imported directly or indirectly by project
612 -- By. Action is called according to the order of importation: if A
613 -- imports B, directly or indirectly, Action will be called for A before
614 -- it is called for B. With_State may be used by Action to choose a
615 -- behavior or to report some global result.
619 Initial_Buffer_Size
: constant := 100;
621 Buffer
: String_Access
:= new String (1 .. Initial_Buffer_Size
);
622 -- An extensible character buffer to store names. Used in Prj.Part and
625 Buffer_Last
: Natural := 0;
626 -- The index of the last character in the Buffer
628 Current_Packages_To_Check
: String_List_Access
:= All_Packages
;
629 -- Global variable, set by Prj.Part.Parse, used by Prj.Dect.
631 procedure Add_To_Buffer
(S
: String);
632 -- Append a String to the Buffer