1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2004 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). Initialized by the call
44 -- to 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. It is not a constant, because
56 -- Canonical_Case_File_Name is called on this variable in the body of Prj.
58 Default_Ada_Spec_Suffix
: Name_Id
;
59 -- The Name_Id for the standard GNAT suffix for Ada spec source file
60 -- name ".ads". Initialized by Prj.Initialize.
62 Default_Ada_Body_Suffix
: Name_Id
;
63 -- The Name_Id for the standard GNAT suffix for Ada body source file
64 -- name ".adb". Initialized by Prj.Initialize.
67 -- "/", used as the path of locally removed files
69 type Languages_Processed
is (Ada_Language
, Other_Languages
, All_Languages
);
70 -- To specify how to process project files
72 type Programming_Language
is
73 (Lang_Ada
, Lang_C
, Lang_C_Plus_Plus
);
74 -- The set of languages supported
76 subtype Other_Programming_Language
is
77 Programming_Language
range Lang_C
.. Programming_Language
'Last;
78 -- The set of non-Ada languages supported
80 type Languages_In_Project
is array (Programming_Language
) of Boolean;
81 -- Set of supported languages used in a project
83 No_Languages
: constant Languages_In_Project
:= (others => False);
84 -- No supported languages are used
86 type Impl_Suffix_Array
is array (Programming_Language
) of Name_Id
;
87 -- Suffixes for the non spec sources of the different supported languages
90 No_Impl_Suffixes
: constant Impl_Suffix_Array
:= (others => No_Name
);
91 -- A default value for the non spec source suffixes
93 Lang_Ada_Name
: aliased String := "ada";
94 Lang_C_Name
: aliased String := "c";
95 Lang_C_Plus_Plus_Name
: aliased String := "c++";
96 Lang_Names
: constant array (Programming_Language
) of String_Access
:=
97 (Lang_Ada
=> Lang_Ada_Name
'Access,
98 Lang_C => Lang_C_Name 'Access,
99 Lang_C_Plus_Plus
=> Lang_C_Plus_Plus_Name
'Access);
100 -- Names of the supported programming languages, to be used after switch
101 -- -x when using a GCC compiler.
103 Lang_Name_Ids
: array (Programming_Language
) of Name_Id
;
104 -- Same as Lang_Names, but using Name_Id, instead of String_Access.
105 -- Initialized by Prj.Initialize.
107 Lang_Ada_Display_Name
: aliased String := "Ada";
108 Lang_C_Display_Name
: aliased String := "C";
109 Lang_C_Plus_Plus_Display_Name
: aliased String := "C++";
111 constant array (Programming_Language
) of String_Access
:=
112 (Lang_Ada
=> Lang_Ada_Display_Name
'Access,
113 Lang_C => Lang_C_Display_Name 'Access,
114 Lang_C_Plus_Plus
=> Lang_C_Plus_Plus_Display_Name
'Access);
115 -- Names of the supported programming languages, to be used for display
118 Ada_Impl_Suffix
: aliased String := ".adb";
119 C_Impl_Suffix
: aliased String := ".c";
120 C_Plus_Plus_Impl_Suffix
: aliased String := ".cc";
121 Lang_Suffixes
: constant array (Programming_Language
) of String_Access
:=
122 (Lang_Ada
=> Ada_Impl_Suffix
'Access,
123 Lang_C => C_Impl_Suffix 'Access,
124 Lang_C_Plus_Plus
=> C_Plus_Plus_Impl_Suffix
'Access);
125 -- Default extension of the sources of the different languages.
127 Lang_Suffix_Ids
: array (Programming_Language
) of Name_Id
;
128 -- Same as Lang_Suffixes, but using Name_Id, instead of String_Access.
129 -- Initialized by Prj.Initialize.
131 Gnatmake_String
: aliased String := "gnatmake";
132 Gcc_String
: aliased String := "gcc";
133 G_Plus_Plus_String
: aliased String := "g++";
134 Default_Compiler_Names
:
135 constant array (Programming_Language
) of String_Access
:=
136 (Lang_Ada
=> Gnatmake_String
'Access,
137 Lang_C => Gcc_String 'Access,
138 Lang_C_Plus_Plus
=> G_Plus_Plus_String
'Access);
139 -- Default names of the compilers for the supported languages.
140 -- Used when no IDE'Compiler_Command is specified for a language.
141 -- For Ada, specify the gnatmake executable.
143 Ada_Args_Strings
: aliased String := "";
144 C_Args_String
: aliased String := "c";
145 C_Plus_Plus_Args_String
: aliased String := "xx";
146 Lang_Args
: constant array (Programming_Language
) of String_Access
:=
147 (Lang_Ada
=> Ada_Args_Strings
'Access,
148 Lang_C => C_Args_String 'Access,
149 Lang_C_Plus_Plus
=> C_Plus_Plus_Args_String
'Access);
150 -- For each supported language, the string between "-c" and "args" to
151 -- be used in the gprmake switch for the start of the compiling switch
152 -- section for each supported language. For example, "-ccargs" indicates
153 -- the start of the C compiler switch section.
155 type Other_Source_Id
is new Nat
;
156 No_Other_Source
: constant Other_Source_Id
:= 0;
157 type Other_Source
is record
158 Language
: Programming_Language
; -- language of the source
159 File_Name
: Name_Id
; -- source file simple name
160 Path_Name
: Name_Id
; -- source full path name
161 Source_TS
: Time_Stamp_Type
; -- source file time stamp
162 Object_Name
: Name_Id
; -- object file simple name
163 Object_Path
: Name_Id
; -- object full path name
164 Object_TS
: Time_Stamp_Type
; -- object file time stamp
165 Dep_Name
: Name_Id
; -- dependency file simple name
166 Dep_Path
: Name_Id
; -- dependency full path name
167 Dep_TS
: Time_Stamp_Type
; -- dependency file time stamp
168 Naming_Exception
: Boolean := False; -- True if a naming exception
169 Next
: Other_Source_Id
:= No_Other_Source
;
171 -- Data for a source in a language other than Ada
173 package Other_Sources
is new Table
.Table
174 (Table_Component_Type
=> Other_Source
,
175 Table_Index_Type
=> Other_Source_Id
,
176 Table_Low_Bound
=> 1,
177 Table_Initial
=> 200,
178 Table_Increment
=> 100,
179 Table_Name
=> "Prj.Other_Sources");
180 -- The table for sources of languages other than Ada
182 type Verbosity
is (Default
, Medium
, High
);
183 -- Verbosity when parsing GNAT Project Files
184 -- Default is default (very quiet, if no errors).
185 -- Medium is more verbose.
186 -- High is extremely verbose.
188 type Lib_Kind
is (Static
, Dynamic
, Relocatable
);
189 type Policy
is (Autonomous
, Compliant
, Controlled
, Restricted
);
190 -- Type to specify the symbol policy, when symbol control is supported.
191 -- See full explanation about this type in package Symbols.
192 -- Autonomous: Create a symbol file without considering any reference
193 -- Compliant: Try to be as compatible as possible with an existing ref
194 -- Controlled: Fail if symbols are not the same as those in the reference
195 -- Restricted: Restrict the symbols to those in the symbol file
197 type Symbol_Record
is record
198 Symbol_File
: Name_Id
:= No_Name
;
199 Reference
: Name_Id
:= No_Name
;
200 Symbol_Policy
: Policy
:= Autonomous
;
202 -- Type to keep the symbol data to be used when building a shared library
204 No_Symbols
: Symbol_Record
:=
205 (Symbol_File
=> No_Name
,
206 Reference
=> No_Name
,
207 Symbol_Policy
=> Autonomous
);
208 -- The default value of the symbol data
210 function Empty_String
return Name_Id
;
211 -- Return the Name_Id for an empty string ""
213 type Project_Id
is new Nat
;
214 No_Project
: constant Project_Id
:= 0;
215 -- Id of a Project File
217 type String_List_Id
is new Nat
;
218 Nil_String
: constant String_List_Id
:= 0;
219 type String_Element
is record
220 Value
: Name_Id
:= No_Name
;
222 Display_Value
: Name_Id
:= No_Name
;
223 Location
: Source_Ptr
:= No_Location
;
224 Flag
: Boolean := False;
225 Next
: String_List_Id
:= Nil_String
;
227 -- To hold values for string list variables and array elements.
228 -- Component Flag may be used for various purposes. For source
229 -- directories, it indicates if the directory contains Ada source(s).
231 package String_Elements
is new Table
.Table
232 (Table_Component_Type
=> String_Element
,
233 Table_Index_Type
=> String_List_Id
,
234 Table_Low_Bound
=> 1,
235 Table_Initial
=> 200,
236 Table_Increment
=> 100,
237 Table_Name
=> "Prj.String_Elements");
238 -- The table for string elements in string lists
240 type Variable_Kind
is (Undefined
, List
, Single
);
241 -- Different kinds of variables
243 subtype Defined_Variable_Kind
is Variable_Kind
range List
.. Single
;
244 -- The defined kinds of variables
246 Ignored
: constant Variable_Kind
:= Single
;
247 -- Used to indicate that a package declaration must be ignored
248 -- while processing the project tree (unknown package name).
250 type Variable_Value
(Kind
: Variable_Kind
:= Undefined
) is record
251 Project
: Project_Id
:= No_Project
;
252 Location
: Source_Ptr
:= No_Location
;
253 Default
: Boolean := False;
258 Values
: String_List_Id
:= Nil_String
;
260 Value
: Name_Id
:= No_Name
;
264 -- Values for variables and array elements. Default is True if the
265 -- current value is the default one for the variable
267 Nil_Variable_Value
: constant Variable_Value
:=
268 (Project
=> No_Project
,
270 Location
=> No_Location
,
272 -- Value of a non existing variable or array element
274 type Variable_Id
is new Nat
;
275 No_Variable
: constant Variable_Id
:= 0;
276 type Variable
is record
277 Next
: Variable_Id
:= No_Variable
;
279 Value
: Variable_Value
;
281 -- To hold the list of variables in a project file and in packages
283 package Variable_Elements
is new Table
.Table
284 (Table_Component_Type
=> Variable
,
285 Table_Index_Type
=> Variable_Id
,
286 Table_Low_Bound
=> 1,
287 Table_Initial
=> 200,
288 Table_Increment
=> 100,
289 Table_Name
=> "Prj.Variable_Elements");
290 -- The table of variable in list of variables
292 type Array_Element_Id
is new Nat
;
293 No_Array_Element
: constant Array_Element_Id
:= 0;
294 type Array_Element
is record
296 Src_Index
: Int
:= 0;
297 Index_Case_Sensitive
: Boolean := True;
298 Value
: Variable_Value
;
299 Next
: Array_Element_Id
:= No_Array_Element
;
301 -- Each Array_Element represents an array element and is linked (Next)
302 -- to the next array element, if any, in the array.
304 package Array_Elements
is new Table
.Table
305 (Table_Component_Type
=> Array_Element
,
306 Table_Index_Type
=> Array_Element_Id
,
307 Table_Low_Bound
=> 1,
308 Table_Initial
=> 200,
309 Table_Increment
=> 100,
310 Table_Name
=> "Prj.Array_Elements");
311 -- The table that contains all array elements
313 type Array_Id
is new Nat
;
314 No_Array
: constant Array_Id
:= 0;
315 type Array_Data
is record
316 Name
: Name_Id
:= No_Name
;
317 Value
: Array_Element_Id
:= No_Array_Element
;
318 Next
: Array_Id
:= No_Array
;
320 -- Each Array_Data value represents an array.
321 -- Value is the id of the first element.
322 -- Next is the id of the next array in the project file or package.
324 package Arrays
is new Table
.Table
325 (Table_Component_Type
=> Array_Data
,
326 Table_Index_Type
=> Array_Id
,
327 Table_Low_Bound
=> 1,
328 Table_Initial
=> 200,
329 Table_Increment
=> 100,
330 Table_Name
=> "Prj.Arrays");
331 -- The table that contains all arrays
333 type Package_Id
is new Nat
;
334 No_Package
: constant Package_Id
:= 0;
335 type Declarations
is record
336 Variables
: Variable_Id
:= No_Variable
;
337 Attributes
: Variable_Id
:= No_Variable
;
338 Arrays
: Array_Id
:= No_Array
;
339 Packages
: Package_Id
:= No_Package
;
341 -- Contains the declarations (variables, single and array attributes,
342 -- packages) for a project or a package in a project.
344 No_Declarations
: constant Declarations
:=
345 (Variables
=> No_Variable
,
346 Attributes
=> No_Variable
,
348 Packages
=> No_Package
);
349 -- Default value of Declarations: indicates that there is no declarations.
351 type Package_Element
is record
352 Name
: Name_Id
:= No_Name
;
353 Decl
: Declarations
:= No_Declarations
;
354 Parent
: Package_Id
:= No_Package
;
355 Next
: Package_Id
:= No_Package
;
357 -- A package. Includes declarations that may include other packages.
359 package Packages
is new Table
.Table
360 (Table_Component_Type
=> Package_Element
,
361 Table_Index_Type
=> Package_Id
,
362 Table_Low_Bound
=> 1,
363 Table_Initial
=> 100,
364 Table_Increment
=> 100,
365 Table_Name
=> "Prj.Packages");
366 -- The table that contains all packages.
368 function Image
(Casing
: Casing_Type
) return String;
369 -- Similar to 'Image (but avoid use of this attribute in compiler)
371 function Value
(Image
: String) return Casing_Type
;
372 -- Similar to 'Value (but avoid use of this attribute in compiler)
373 -- Raises Constraint_Error if not a Casing_Type image.
375 -- The following record contains data for a naming scheme
377 type Naming_Data
is record
378 Current_Language
: Name_Id
:= No_Name
;
379 -- The programming language being currently considered
381 Dot_Replacement
: Name_Id
:= No_Name
;
382 -- The string to replace '.' in the source file name (for Ada).
384 Dot_Repl_Loc
: Source_Ptr
:= No_Location
;
385 -- The position in the project file source where
386 -- Dot_Replacement is defined.
388 Casing
: Casing_Type
:= All_Lower_Case
;
389 -- The casing of the source file name (for Ada).
391 Spec_Suffix
: Array_Element_Id
:= No_Array_Element
;
392 -- The string to append to the unit name for the
393 -- source file name of a spec.
394 -- Indexed by the programming language.
396 Current_Spec_Suffix
: Name_Id
:= No_Name
;
397 -- The "spec" suffix of the current programming language
399 Spec_Suffix_Loc
: Source_Ptr
:= No_Location
;
400 -- The position in the project file source where
401 -- Current_Spec_Suffix is defined.
403 Body_Suffix
: Array_Element_Id
:= No_Array_Element
;
404 -- The string to append to the unit name for the
405 -- source file name of a body.
406 -- Indexed by the programming language.
408 Current_Body_Suffix
: Name_Id
:= No_Name
;
409 -- The "body" suffix of the current programming language
411 Body_Suffix_Loc
: Source_Ptr
:= No_Location
;
412 -- The position in the project file source where
413 -- Current_Body_Suffix is defined.
415 Separate_Suffix
: Name_Id
:= No_Name
;
416 -- String to append to unit name for source file name of an Ada subunit.
418 Sep_Suffix_Loc
: Source_Ptr
:= No_Location
;
419 -- Position in the project file source where Separate_Suffix is defined.
421 Specs
: Array_Element_Id
:= No_Array_Element
;
422 -- An associative array mapping individual specs to source file names.
423 -- This is specific to Ada.
425 Bodies
: Array_Element_Id
:= No_Array_Element
;
426 -- An associative array mapping individual bodies to source file names.
427 -- This is specific to Ada.
429 Specification_Exceptions
: Array_Element_Id
:= No_Array_Element
;
430 -- An associative array listing spec file names that do not have the
431 -- spec suffix. Not used by Ada. Indexed by programming language name.
433 Implementation_Exceptions
: Array_Element_Id
:= No_Array_Element
;
434 -- An associative array listing body file names that do not have the
435 -- body suffix. Not used by Ada. Indexed by programming language name.
439 function Standard_Naming_Data
return Naming_Data
;
440 pragma Inline
(Standard_Naming_Data
);
441 -- The standard GNAT naming scheme
443 function Same_Naming_Scheme
444 (Left
, Right
: Naming_Data
)
446 -- Returns True if Left and Right are the same naming scheme
447 -- not considering Specs and Bodies.
449 type Project_List
is new Nat
;
450 Empty_Project_List
: constant Project_List
:= 0;
451 -- A list of project files
453 type Project_Element
is record
454 Project
: Project_Id
:= No_Project
;
455 Next
: Project_List
:= Empty_Project_List
;
457 -- Element in a list of project files. Next is the id of the next
458 -- project file in the list.
460 package Project_Lists
is new Table
.Table
461 (Table_Component_Type
=> Project_Element
,
462 Table_Index_Type
=> Project_List
,
463 Table_Low_Bound
=> 1,
464 Table_Initial
=> 100,
465 Table_Increment
=> 100,
466 Table_Name
=> "Prj.Project_Lists");
467 -- The table that contains the lists of project files
469 -- The following record describes a project file representation
471 type Project_Data
is record
472 Languages
: Languages_In_Project
:= No_Languages
;
473 -- Indicate the different languages of the source of this project
475 Impl_Suffixes
: Impl_Suffix_Array
:= No_Impl_Suffixes
;
476 -- The source suffixes of the different languages other than Ada
478 First_Referred_By
: Project_Id
:= No_Project
;
479 -- The project, if any, that was the first to be known
480 -- as importing or extending this project.
481 -- Set by Prj.Proc.Process.
483 Name
: Name_Id
:= No_Name
;
484 -- The name of the project. Set by Prj.Proc.Process.
486 Path_Name
: Name_Id
:= No_Name
;
487 -- The path name of the project file. Set by Prj.Proc.Process.
489 Display_Path_Name
: Name_Id
:= No_Name
;
490 -- The path name used for display purposes. May be different from
491 -- Path_Name for platforms where the file names are case-insensitive.
493 Virtual
: Boolean := False;
494 -- True for virtual extending projects
496 Location
: Source_Ptr
:= No_Location
;
497 -- The location in the project file source of the reserved word
498 -- project. Set by Prj.Proc.Process.
500 Mains
: String_List_Id
:= Nil_String
;
501 -- List of mains specified by attribute Main. Set by Prj.Nmsc.Ada_Check.
503 Directory
: Name_Id
:= No_Name
;
504 -- Directory where the project file resides. Set by Prj.Proc.Process.
506 Display_Directory
: Name_Id
:= No_Name
;
508 Dir_Path
: String_Access
;
509 -- Same as Directory, but as an access to String.
510 -- Set by Make.Compile_Sources.Collect_Arguments_And_Compile.
512 Library
: Boolean := False;
513 -- True if this is a library project.
514 -- Set by Prj.Nmsc.Language_Independent_Check.
516 Library_Dir
: Name_Id
:= No_Name
;
517 -- If a library project, directory where resides the library
518 -- Set by Prj.Nmsc.Language_Independent_Check.
520 Display_Library_Dir
: Name_Id
:= No_Name
;
521 -- The name of the library directory, for display purposes.
522 -- May be different from Library_Dir for platforms where the file names
523 -- are case-insensitive.
525 Library_Src_Dir
: Name_Id
:= No_Name
;
526 -- If a library project, directory where the sources and the ALI files
527 -- of the library are copied. By default, if attribute Library_Src_Dir
528 -- is not specified, sources are not copied anywhere and ALI files are
529 -- copied in the Library Directory.
530 -- Set by Prj.Nmsc.Language_Independent_Check.
532 Display_Library_Src_Dir
: Name_Id
:= No_Name
;
533 -- The name of the library source directory, for display purposes.
534 -- May be different from Library_Src_Dir for platforms where the file
535 -- names are case-insensitive.
537 Library_Name
: Name_Id
:= No_Name
;
538 -- If a library project, name of the library
539 -- Set by Prj.Nmsc.Language_Independent_Check.
541 Library_Kind
: Lib_Kind
:= Static
;
542 -- If a library project, kind of library
543 -- Set by Prj.Nmsc.Language_Independent_Check.
545 Lib_Internal_Name
: Name_Id
:= No_Name
;
546 -- If a library project, internal name store inside the library
547 -- Set by Prj.Nmsc.Language_Independent_Check.
549 Standalone_Library
: Boolean := False;
550 -- Indicate that this is a Standalone Library Project File.
551 -- Set by Prj.Nmsc.Ada_Check.
553 Lib_Interface_ALIs
: String_List_Id
:= Nil_String
;
554 -- For Standalone Library Project Files, indicate the list
555 -- of Interface ALI files. Set by Prj.Nmsc.Ada_Check.
557 Lib_Auto_Init
: Boolean := False;
558 -- For non static Standalone Library Project Files, indicate if
559 -- the library initialisation should be automatic.
561 Symbol_Data
: Symbol_Record
:= No_Symbols
;
562 -- Symbol file name, reference symbol file name, symbol policy
564 Ada_Sources_Present
: Boolean := True;
565 -- A flag that indicates if there are Ada sources in this project file.
566 -- There are no sources if any of the following is true:
567 -- 1) Source_Dirs is specified as an empty list
568 -- 2) Source_Files is specified as an empty list
569 -- 3) Ada is not in the list of the specified Languages
571 Other_Sources_Present
: Boolean := True;
572 -- A flag that indicates that there are non-Ada sources in this project
574 Sources
: String_List_Id
:= Nil_String
;
575 -- The list of all the source file names. Set by
576 -- Prj.Nmsc.Check_Ada_Naming_Scheme.
578 First_Other_Source
: Other_Source_Id
:= No_Other_Source
;
579 Last_Other_Source
: Other_Source_Id
:= No_Other_Source
;
580 -- Head and tail of the list of sources of languages other than Ada
582 Imported_Directories_Switches
: Argument_List_Access
:= null;
583 -- List of the -I switches to be used when compiling sources of
584 -- languages other than Ada.
586 Include_Path
: String_Access
:= null;
587 -- Value to be used as CPATH, when using a GCC, instead of a list of
590 Include_Data_Set
: Boolean := False;
591 -- Set True when Imported_Directories_Switches or Include_Path are set
593 Source_Dirs
: String_List_Id
:= Nil_String
;
594 -- The list of all the source directories.
595 -- Set by Prj.Nmsc.Language_Independent_Check.
597 Known_Order_Of_Source_Dirs
: Boolean := True;
598 -- False, if there is any /** in the Source_Dirs, because in this case
599 -- the ordering of the source subdirs depend on the OS. If True,
600 -- duplicate file names in the same project file are allowed.
602 Object_Directory
: Name_Id
:= No_Name
;
603 -- The object directory of this project file.
604 -- Set by Prj.Nmsc.Language_Independent_Check.
606 Display_Object_Dir
: Name_Id
:= No_Name
;
607 -- The name of the object directory, for display purposes.
608 -- May be different from Object_Directory for platforms where the file
609 -- names are case-insensitive.
611 Exec_Directory
: Name_Id
:= No_Name
;
612 -- The exec directory of this project file. Default is equal to
613 -- Object_Directory. Set by Prj.Nmsc.Language_Independent_Check.
615 Display_Exec_Dir
: Name_Id
:= No_Name
;
616 -- The name of the exec directory, for display purposes.
617 -- May be different from Exec_Directory for platforms where the file
618 -- names are case-insensitive.
620 Extends
: Project_Id
:= No_Project
;
621 -- The reference of the project file, if any, that this
622 -- project file extends. Set by Prj.Proc.Process.
624 Extended_By
: Project_Id
:= No_Project
;
625 -- The reference of the project file, if any, that
626 -- extends this project file. Set by Prj.Proc.Process.
628 Naming
: Naming_Data
:= Standard_Naming_Data
;
629 -- The naming scheme of this project file.
630 -- Set by Prj.Nmsc.Check_Naming_Scheme.
632 Decl
: Declarations
:= No_Declarations
;
633 -- The declarations (variables, attributes and packages) of this
634 -- project file. Set by Prj.Proc.Process.
636 Imported_Projects
: Project_List
:= Empty_Project_List
;
637 -- The list of all directly imported projects, if any.
638 -- Set by Prj.Proc.Process.
640 Ada_Include_Path
: String_Access
:= null;
641 -- The cached value of ADA_INCLUDE_PATH for this project file.
642 -- Do not use this field directly outside of the compiler, use
643 -- Prj.Env.Ada_Include_Path instead. Set by Prj.Env.Ada_Include_Path.
645 Ada_Objects_Path
: String_Access
:= null;
646 -- The cached value of ADA_OBJECTS_PATH for this project file.
647 -- Do not use this field directly outside of the compiler, use
648 -- Prj.Env.Ada_Objects_Path instead. Set by Prj.Env.Ada_Objects_Path
650 Include_Path_File
: Name_Id
:= No_Name
;
651 -- The cached value of the source path temp file for this project file.
652 -- Set by gnatmake (Prj.Env.Set_Ada_Paths).
654 Objects_Path_File_With_Libs
: Name_Id
:= No_Name
;
655 -- The cached value of the object path temp file (including library
656 -- dirs) for this project file. Set by gnatmake (Prj.Env.Set_Ada_Paths).
658 Objects_Path_File_Without_Libs
: Name_Id
:= No_Name
;
659 -- The cached value of the object path temp file (excluding library
660 -- dirs) for this project file. Set by gnatmake (Prj.Env.Set_Ada_Paths).
662 Config_File_Name
: Name_Id
:= No_Name
;
663 -- The name of the configuration pragmas file, if any.
664 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
666 Config_File_Temp
: Boolean := False;
667 -- An indication that the configuration pragmas file is
668 -- a temporary file that must be deleted at the end.
669 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
671 Config_Checked
: Boolean := False;
672 -- A flag to avoid checking repetitively the configuration pragmas file.
673 -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File).
675 Language_Independent_Checked
: Boolean := False;
676 -- A flag that indicates that the project file has been checked
677 -- for language independent features: Object_Directory,
678 -- Source_Directories, Library, non empty Naming Suffixes.
680 Checked
: Boolean := False;
681 -- A flag to avoid checking repetitively the naming scheme of
682 -- this project file. Set by Prj.Nmsc.Check_Ada_Naming_Scheme.
684 Seen
: Boolean := False;
685 -- A flag to mark a project as "visited" to avoid processing the same
686 -- project several time.
688 Need_To_Build_Lib
: Boolean := False;
689 -- Indicates that the library of a Library Project needs to be built or
692 Depth
: Natural := 0;
693 -- The maximum depth of a project in the project graph.
694 -- Depth of main project is 0.
696 Unkept_Comments
: Boolean := False;
697 -- True if there are comments in the project sources that cannot
698 -- be kept in the project tree.
702 Project_Error
: exception;
703 -- Raised by some subprograms in Prj.Attr.
705 function Empty_Project
return Project_Data
;
706 -- Return the representation of an empty project
708 package Projects
is new Table
.Table
(
709 Table_Component_Type
=> Project_Data
,
710 Table_Index_Type
=> Project_Id
,
711 Table_Low_Bound
=> 1,
712 Table_Initial
=> 100,
713 Table_Increment
=> 100,
714 Table_Name
=> "Prj.Projects");
715 -- The set of all project files
717 type Put_Line_Access
is access procedure
719 Project
: Project_Id
);
720 -- Use to customize error reporting in Prj.Proc and Prj.Nmsc
722 procedure Expect
(The_Token
: Token_Type
; Token_Image
: String);
723 -- Check that the current token is The_Token. If it is not, then
724 -- output an error message.
726 procedure Initialize
;
727 -- This procedure must be called before using any services from the Prj
728 -- hierarchy. Namet.Initialize must be called before Prj.Initialize.
731 -- This procedure resets all the tables that are used when processing a
732 -- project file tree. Initialize must be called before the call to Reset.
734 procedure Register_Default_Naming_Scheme
736 Default_Spec_Suffix
: Name_Id
;
737 Default_Body_Suffix
: Name_Id
);
738 -- Register the default suffixes for a given language. These extensions
739 -- will be ignored if the user has specified a new naming scheme in a
742 -- Otherwise, this information will be automatically added to Naming_Data
743 -- when a project is processed, in the lists Spec_Suffix and Body_Suffix.
746 type State
is limited private;
747 with procedure Action
748 (Project
: Project_Id
;
749 With_State
: in out State
);
750 procedure For_Every_Project_Imported
752 With_State
: in out State
);
753 -- Call Action for each project imported directly or indirectly by project
754 -- By. Action is called according to the order of importation: if A
755 -- imports B, directly or indirectly, Action will be called for A before
756 -- it is called for B. With_State may be used by Action to choose a
757 -- behavior or to report some global result.
761 Initial_Buffer_Size
: constant := 100;
762 -- Initial size for extensible buffer used below
764 Buffer
: String_Access
:= new String (1 .. Initial_Buffer_Size
);
765 -- An extensible character buffer to store names. Used in Prj.Part and
768 Buffer_Last
: Natural := 0;
769 -- The index of the last character in the Buffer
771 Current_Packages_To_Check
: String_List_Access
:= All_Packages
;
772 -- Global variable, set by Prj.Part.Parse, used by Prj.Dect.
774 procedure Add_To_Buffer
(S
: String);
775 -- Append a String to the Buffer