1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2014, 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 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. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
28 with Osint
; use Osint
;
29 with Output
; use Output
;
32 with Prj
.Err
; use Prj
.Err
;
33 with Snames
; use Snames
;
34 with Uintp
; use Uintp
;
36 with Ada
.Characters
.Handling
; use Ada
.Characters
.Handling
;
37 with Ada
.Containers
.Ordered_Sets
;
38 with Ada
.Unchecked_Deallocation
;
40 with GNAT
.Case_Util
; use GNAT
.Case_Util
;
41 with GNAT
.Directory_Operations
; use GNAT
.Directory_Operations
;
47 type Restricted_Lang_Access
is access Restricted_Lang
;
48 type Restricted_Lang
is record
50 Next
: Restricted_Lang_Access
;
53 Restricted_Languages
: Restricted_Lang_Access
:= null;
54 -- When null, all languages are allowed, otherwise only the languages in
55 -- the list are allowed.
57 Object_Suffix
: constant String := Get_Target_Object_Suffix
.all;
58 -- File suffix for object files
60 Initial_Buffer_Size
: constant := 100;
61 -- Initial size for extensible buffer used in Add_To_Buffer
63 The_Empty_String
: Name_Id
:= No_Name
;
65 Debug_Level
: Integer := 0;
66 -- Current indentation level for debug traces
68 type Cst_String_Access
is access constant String;
70 All_Lower_Case_Image
: aliased constant String := "lowercase";
71 All_Upper_Case_Image
: aliased constant String := "UPPERCASE";
72 Mixed_Case_Image
: aliased constant String := "MixedCase";
74 The_Casing_Images
: constant array (Known_Casing
) of Cst_String_Access
:=
75 (All_Lower_Case
=> All_Lower_Case_Image
'Access,
76 All_Upper_Case
=> All_Upper_Case_Image
'Access,
77 Mixed_Case
=> Mixed_Case_Image
'Access);
79 procedure Free
(Project
: in out Project_Id
);
80 -- Free memory allocated for Project
82 procedure Free_List
(Languages
: in out Language_Ptr
);
83 procedure Free_List
(Source
: in out Source_Id
);
84 procedure Free_List
(Languages
: in out Language_List
);
85 -- Free memory allocated for the list of languages or sources
87 procedure Reset_Units_In_Table
(Table
: in out Units_Htable
.Instance
);
88 -- Resets all Units to No_Unit_Index Unit.File_Names (Spec).Unit &
89 -- Unit.File_Names (Impl).Unit in the given table.
91 procedure Free_Units
(Table
: in out Units_Htable
.Instance
);
92 -- Free memory allocated for unit information in the project
94 procedure Language_Changed
(Iter
: in out Source_Iterator
);
95 procedure Project_Changed
(Iter
: in out Source_Iterator
);
96 -- Called when a new project or language was selected for this iterator
98 function Contains_ALI_Files
(Dir
: Path_Name_Type
) return Boolean;
99 -- Return True if there is at least one ALI file in the directory Dir
101 -----------------------------
102 -- Add_Restricted_Language --
103 -----------------------------
105 procedure Add_Restricted_Language
(Name
: String) is
106 N
: String (1 .. Name
'Length) := Name
;
110 Add_Str_To_Name_Buffer
(N
);
111 Restricted_Languages
:=
112 new Restricted_Lang
'(Name => Name_Find, Next => Restricted_Languages);
113 end Add_Restricted_Language;
115 -------------------------------------
116 -- Remove_All_Restricted_Languages --
117 -------------------------------------
119 procedure Remove_All_Restricted_Languages is
121 Restricted_Languages := null;
122 end Remove_All_Restricted_Languages;
128 procedure Add_To_Buffer
130 To : in out String_Access;
131 Last : in out Natural)
135 To := new String (1 .. Initial_Buffer_Size);
139 -- If Buffer is too small, double its size
141 while Last + S'Length > To'Last loop
143 New_Buffer : constant String_Access :=
144 new String (1 .. 2 * Last);
147 New_Buffer (1 .. Last) := To (1 .. Last);
153 To (Last + 1 .. Last + S'Length) := S;
154 Last := Last + S'Length;
157 ---------------------------------
158 -- Current_Object_Path_File_Of --
159 ---------------------------------
161 function Current_Object_Path_File_Of
162 (Shared : Shared_Project_Tree_Data_Access) return Path_Name_Type
165 return Shared.Private_Part.Current_Object_Path_File;
166 end Current_Object_Path_File_Of;
168 ---------------------------------
169 -- Current_Source_Path_File_Of --
170 ---------------------------------
172 function Current_Source_Path_File_Of
173 (Shared : Shared_Project_Tree_Data_Access)
174 return Path_Name_Type is
176 return Shared.Private_Part.Current_Source_Path_File;
177 end Current_Source_Path_File_Of;
179 ---------------------------
180 -- Delete_Temporary_File --
181 ---------------------------
183 procedure Delete_Temporary_File
184 (Shared : Shared_Project_Tree_Data_Access := null;
185 Path : Path_Name_Type)
188 pragma Warnings (Off, Dont_Care);
191 if not Debug.Debug_Flag_N then
192 if Current_Verbosity = High then
193 Write_Line ("Removing temp file: " & Get_Name_String (Path));
196 Delete_File (Get_Name_String (Path), Dont_Care);
198 if Shared /= null then
200 1 .. Temp_Files_Table.Last (Shared.Private_Part.Temp_Files)
202 if Shared.Private_Part.Temp_Files.Table (Index) = Path then
203 Shared.Private_Part.Temp_Files.Table (Index) := No_Path;
208 end Delete_Temporary_File;
210 ------------------------------
211 -- Delete_Temp_Config_Files --
212 ------------------------------
214 procedure Delete_Temp_Config_Files (Project_Tree : Project_Tree_Ref) is
216 pragma Warnings (Off, Success);
221 if not Debug.Debug_Flag_N then
222 if Project_Tree /= null then
223 Proj := Project_Tree.Projects;
224 while Proj /= null loop
225 if Proj.Project.Config_File_Temp then
226 Delete_Temporary_File
227 (Project_Tree.Shared, Proj.Project.Config_File_Name);
229 -- Make sure that we don't have a config file for this
230 -- project, in case there are several mains. In this case,
231 -- we will recreate another config file: we cannot reuse the
232 -- one that we just deleted.
234 Proj.Project.Config_Checked := False;
235 Proj.Project.Config_File_Name := No_Path;
236 Proj.Project.Config_File_Temp := False;
243 end Delete_Temp_Config_Files;
245 ---------------------------
246 -- Delete_All_Temp_Files --
247 ---------------------------
249 procedure Delete_All_Temp_Files
250 (Shared : Shared_Project_Tree_Data_Access)
253 pragma Warnings (Off, Dont_Care);
255 Path : Path_Name_Type;
258 if not Debug.Debug_Flag_N then
260 1 .. Temp_Files_Table.Last (Shared.Private_Part.Temp_Files)
262 Path := Shared.Private_Part.Temp_Files.Table (Index);
264 if Path /= No_Path then
265 if Current_Verbosity = High then
266 Write_Line ("Removing temp file: "
267 & Get_Name_String (Path));
270 Delete_File (Get_Name_String (Path), Dont_Care);
274 Temp_Files_Table.Free (Shared.Private_Part.Temp_Files);
275 Temp_Files_Table.Init (Shared.Private_Part.Temp_Files);
278 -- If any of the environment variables ADA_PRJ_INCLUDE_FILE or
279 -- ADA_PRJ_OBJECTS_FILE has been set, then reset their value to
280 -- the empty string. On VMS, this has the effect of deassigning
281 -- the logical names.
283 if Shared.Private_Part.Current_Source_Path_File /= No_Path then
284 Setenv (Project_Include_Path_File, "");
287 if Shared.Private_Part.Current_Object_Path_File /= No_Path then
288 Setenv (Project_Objects_Path_File, "");
290 end Delete_All_Temp_Files;
292 ---------------------
293 -- Dependency_Name --
294 ---------------------
296 function Dependency_Name
297 (Source_File_Name : File_Name_Type;
298 Dependency : Dependency_File_Kind) return File_Name_Type
306 return Extend_Name (Source_File_Name, Makefile_Dependency_Suffix);
308 when ALI_File | ALI_Closure =>
309 return Extend_Name (Source_File_Name, ALI_Dependency_Suffix);
317 function Empty_File return File_Name_Type is
319 return File_Name_Type (The_Empty_String);
326 function Empty_Project
327 (Qualifier : Project_Qualifier) return Project_Data
330 Prj.Initialize (Tree => No_Project_Tree);
333 Data : Project_Data (Qualifier => Qualifier);
336 -- Only the fields for which no default value could be provided in
337 -- prj.ads are initialized below.
339 Data.Config := Default_Project_Config;
348 function Empty_String return Name_Id is
350 return The_Empty_String;
357 procedure Expect (The_Token : Token_Type; Token_Image : String) is
359 if Token /= The_Token then
361 -- ??? Should pass user flags here instead
363 Error_Msg (Gnatmake_Flags, Token_Image & " expected", Token_Ptr);
372 (File : File_Name_Type;
373 With_Suffix : String) return File_Name_Type
378 Get_Name_String (File);
379 Last := Name_Len + 1;
381 while Name_Len /= 0 and then Name_Buffer (Name_Len) /= '.' loop
382 Name_Len := Name_Len - 1;
385 if Name_Len <= 1 then
389 for J in With_Suffix'Range loop
390 Name_Buffer (Name_Len) := With_Suffix (J);
391 Name_Len := Name_Len + 1;
394 Name_Len := Name_Len - 1;
398 -------------------------
399 -- Is_Allowed_Language --
400 -------------------------
402 function Is_Allowed_Language (Name : Name_Id) return Boolean is
403 R : Restricted_Lang_Access := Restricted_Languages;
404 Lang : constant String := Get_Name_String (Name);
412 if Get_Name_String (R.Name) = Lang then
421 end Is_Allowed_Language;
423 ---------------------
424 -- Project_Changed --
425 ---------------------
427 procedure Project_Changed (Iter : in out Source_Iterator) is
429 if Iter.Project /= null then
430 Iter.Language := Iter.Project.Project.Languages;
431 Language_Changed (Iter);
435 ----------------------
436 -- Language_Changed --
437 ----------------------
439 procedure Language_Changed (Iter : in out Source_Iterator) is
441 Iter.Current := No_Source;
443 if Iter.Language_Name /= No_Name then
444 while Iter.Language /= null
445 and then Iter.Language.Name /= Iter.Language_Name
447 Iter.Language := Iter.Language.Next;
451 -- If there is no matching language in this project, move to next
453 if Iter.Language = No_Language_Index then
454 if Iter.All_Projects then
456 Iter.Project := Iter.Project.Next;
457 exit when Iter.Project = null
458 or else Iter.Encapsulated_Libs
459 or else not Iter.Project.From_Encapsulated_Lib;
462 Project_Changed (Iter);
464 Iter.Project := null;
468 Iter.Current := Iter.Language.First_Source;
470 if Iter.Current = No_Source then
471 Iter.Language := Iter.Language.Next;
472 Language_Changed (Iter);
474 elsif not Iter.Locally_Removed
475 and then Iter.Current.Locally_Removed
480 end Language_Changed;
482 ---------------------
483 -- For_Each_Source --
484 ---------------------
486 function For_Each_Source
487 (In_Tree : Project_Tree_Ref;
488 Project : Project_Id := No_Project;
489 Language : Name_Id := No_Name;
490 Encapsulated_Libs : Boolean := True;
491 Locally_Removed : Boolean := True) return Source_Iterator
493 Iter : Source_Iterator;
495 Iter := Source_Iterator'
497 Project
=> In_Tree
.Projects
,
498 All_Projects
=> Project
= No_Project
,
499 Language_Name
=> Language
,
500 Language
=> No_Language_Index
,
501 Current
=> No_Source
,
502 Encapsulated_Libs
=> Encapsulated_Libs
,
503 Locally_Removed
=> Locally_Removed
);
505 if Project
/= null then
506 while Iter
.Project
/= null
507 and then Iter
.Project
.Project
/= Project
509 Iter
.Project
:= Iter
.Project
.Next
;
513 while not Iter
.Encapsulated_Libs
514 and then Iter
.Project
.From_Encapsulated_Lib
516 Iter
.Project
:= Iter
.Project
.Next
;
520 Project_Changed
(Iter
);
529 function Element
(Iter
: Source_Iterator
) return Source_Id
is
538 procedure Next
(Iter
: in out Source_Iterator
) is
541 Iter
.Current
:= Iter
.Current
.Next_In_Lang
;
543 exit when Iter
.Locally_Removed
544 or else Iter
.Current
= No_Source
545 or else not Iter
.Current
.Locally_Removed
;
548 if Iter
.Current
= No_Source
then
549 Iter
.Language
:= Iter
.Language
.Next
;
550 Language_Changed
(Iter
);
554 --------------------------------
555 -- For_Every_Project_Imported --
556 --------------------------------
558 procedure For_Every_Project_Imported_Context
560 Tree
: Project_Tree_Ref
;
561 With_State
: in out State
;
562 Include_Aggregated
: Boolean := True;
563 Imported_First
: Boolean := False)
565 use Project_Boolean_Htable
;
567 procedure Recursive_Check_Context
568 (Project
: Project_Id
;
569 Tree
: Project_Tree_Ref
;
570 In_Aggregate_Lib
: Boolean;
571 From_Encapsulated_Lib
: Boolean);
572 -- Recursively handle the project tree creating a new context for
573 -- keeping track about already handled projects.
575 -----------------------------
576 -- Recursive_Check_Context --
577 -----------------------------
579 procedure Recursive_Check_Context
580 (Project
: Project_Id
;
581 Tree
: Project_Tree_Ref
;
582 In_Aggregate_Lib
: Boolean;
583 From_Encapsulated_Lib
: Boolean)
585 package Name_Id_Set
is
586 new Ada
.Containers
.Ordered_Sets
(Element_Type
=> Name_Id
);
588 Seen_Name
: Name_Id_Set
.Set
;
589 -- This set is needed to ensure that we do not handle the same
590 -- project twice in the context of aggregate libraries.
592 procedure Recursive_Check
593 (Project
: Project_Id
;
594 Tree
: Project_Tree_Ref
;
595 In_Aggregate_Lib
: Boolean;
596 From_Encapsulated_Lib
: Boolean);
597 -- Check if project has already been seen. If not, mark it as Seen,
598 -- Call Action, and check all its imported and aggregated projects.
600 ---------------------
601 -- Recursive_Check --
602 ---------------------
604 procedure Recursive_Check
605 (Project
: Project_Id
;
606 Tree
: Project_Tree_Ref
;
607 In_Aggregate_Lib
: Boolean;
608 From_Encapsulated_Lib
: Boolean)
611 function Has_Sources
(P
: Project_Id
) return Boolean;
612 -- Returns True if P has sources
614 function Get_From_Tree
(P
: Project_Id
) return Project_Id
;
615 -- Get project P from Tree. If P has no sources get another
616 -- instance of this project with sources. If P has sources,
623 function Has_Sources
(P
: Project_Id
) return Boolean is
628 while Lang
/= No_Language_Index
loop
629 if Lang
.First_Source
/= No_Source
then
643 function Get_From_Tree
(P
: Project_Id
) return Project_Id
is
644 List
: Project_List
:= Tree
.Projects
;
647 if not Has_Sources
(P
) then
648 while List
/= null loop
649 if List
.Project
.Name
= P
.Name
650 and then Has_Sources
(List
.Project
)
666 -- Start of processing for Recursive_Check
669 if not Seen_Name
.Contains
(Project
.Name
) then
671 -- Even if a project is aggregated multiple times in an
672 -- aggregated library, we will only return it once.
674 Seen_Name
.Include
(Project
.Name
);
676 if not Imported_First
then
678 (Get_From_Tree
(Project
),
680 Project_Context
'(In_Aggregate_Lib, From_Encapsulated_Lib),
684 -- Visit all extended projects
686 if Project.Extends /= No_Project then
688 (Project.Extends, Tree,
689 In_Aggregate_Lib, From_Encapsulated_Lib);
692 -- Visit all imported projects
694 List := Project.Imported_Projects;
695 while List /= null loop
699 From_Encapsulated_Lib
700 or else Project.Standalone_Library = Encapsulated);
704 -- Visit all aggregated projects
706 if Include_Aggregated
707 and then Project.Qualifier in Aggregate_Project
710 Agg : Aggregated_Project_List;
713 Agg := Project.Aggregated_Projects;
714 while Agg /= null loop
715 pragma Assert (Agg.Project /= No_Project);
717 -- For aggregated libraries, the tree must be the one
718 -- of the aggregate library.
720 if Project.Qualifier = Aggregate_Library then
724 From_Encapsulated_Lib
726 Project.Standalone_Library = Encapsulated);
729 -- Use a new context as we want to returns the same
730 -- project in different project tree for aggregated
733 Recursive_Check_Context
734 (Agg.Project, Agg.Tree, False, False);
742 if Imported_First then
744 (Get_From_Tree (Project),
746 Project_Context'(In_Aggregate_Lib
, From_Encapsulated_Lib
),
752 -- Start of processing for Recursive_Check_Context
756 (Project
, Tree
, In_Aggregate_Lib
, From_Encapsulated_Lib
);
757 end Recursive_Check_Context
;
759 -- Start of processing for For_Every_Project_Imported
762 Recursive_Check_Context
765 In_Aggregate_Lib
=> False,
766 From_Encapsulated_Lib
=> False);
767 end For_Every_Project_Imported_Context
;
769 procedure For_Every_Project_Imported
771 Tree
: Project_Tree_Ref
;
772 With_State
: in out State
;
773 Include_Aggregated
: Boolean := True;
774 Imported_First
: Boolean := False)
777 (Project
: Project_Id
;
778 Tree
: Project_Tree_Ref
;
779 Context
: Project_Context
;
780 With_State
: in out State
);
781 -- Action wrapper for handling the context
788 (Project
: Project_Id
;
789 Tree
: Project_Tree_Ref
;
790 Context
: Project_Context
;
791 With_State
: in out State
)
793 pragma Unreferenced
(Context
);
795 Action
(Project
, Tree
, With_State
);
798 procedure For_Projects
is
799 new For_Every_Project_Imported_Context
(State
, Internal
);
802 For_Projects
(By
, Tree
, With_State
, Include_Aggregated
, Imported_First
);
803 end For_Every_Project_Imported
;
810 (In_Tree
: Project_Tree_Ref
;
811 Project
: Project_Id
;
812 In_Imported_Only
: Boolean := False;
813 In_Extended_Only
: Boolean := False;
814 Base_Name
: File_Name_Type
;
815 Index
: Int
:= 0) return Source_Id
817 Result
: Source_Id
:= No_Source
;
819 procedure Look_For_Sources
821 Tree
: Project_Tree_Ref
;
822 Src
: in out Source_Id
);
823 -- Look for Base_Name in the sources of Proj
825 ----------------------
826 -- Look_For_Sources --
827 ----------------------
829 procedure Look_For_Sources
831 Tree
: Project_Tree_Ref
;
832 Src
: in out Source_Id
)
834 Iterator
: Source_Iterator
;
837 Iterator
:= For_Each_Source
(In_Tree
=> Tree
, Project
=> Proj
);
838 while Element
(Iterator
) /= No_Source
loop
839 if Element
(Iterator
).File
= Base_Name
840 and then (Index
= 0 or else Element
(Iterator
).Index
= Index
)
842 Src
:= Element
(Iterator
);
844 -- If the source has been excluded, continue looking. We will
845 -- get the excluded source only if there is no other source
846 -- with the same base name that is not locally removed.
848 if not Element
(Iterator
).Locally_Removed
then
855 end Look_For_Sources
;
857 procedure For_Imported_Projects
is new For_Every_Project_Imported
858 (State
=> Source_Id
, Action
=> Look_For_Sources
);
862 -- Start of processing for Find_Source
865 if In_Extended_Only
then
867 while Proj
/= No_Project
loop
868 Look_For_Sources
(Proj
, In_Tree
, Result
);
869 exit when Result
/= No_Source
;
871 Proj
:= Proj
.Extends
;
874 elsif In_Imported_Only
then
875 Look_For_Sources
(Project
, In_Tree
, Result
);
877 if Result
= No_Source
then
878 For_Imported_Projects
881 Include_Aggregated
=> False,
882 With_State
=> Result
);
886 Look_For_Sources
(No_Project
, In_Tree
, Result
);
892 ----------------------
893 -- Find_All_Sources --
894 ----------------------
896 function Find_All_Sources
897 (In_Tree
: Project_Tree_Ref
;
898 Project
: Project_Id
;
899 In_Imported_Only
: Boolean := False;
900 In_Extended_Only
: Boolean := False;
901 Base_Name
: File_Name_Type
;
902 Index
: Int
:= 0) return Source_Ids
904 Result
: Source_Ids
(1 .. 1_000
);
907 type Empty_State
is null record;
908 No_State
: Empty_State
;
909 -- This is needed for the State parameter of procedure Look_For_Sources
910 -- below, because of the instantiation For_Imported_Projects of generic
911 -- procedure For_Every_Project_Imported. As procedure Look_For_Sources
912 -- does not modify parameter State, there is no need to give its type
913 -- more than one value.
915 procedure Look_For_Sources
917 Tree
: Project_Tree_Ref
;
918 State
: in out Empty_State
);
919 -- Look for Base_Name in the sources of Proj
921 ----------------------
922 -- Look_For_Sources --
923 ----------------------
925 procedure Look_For_Sources
927 Tree
: Project_Tree_Ref
;
928 State
: in out Empty_State
)
930 Iterator
: Source_Iterator
;
936 Iterator
:= For_Each_Source
(In_Tree
=> Tree
, Project
=> Proj
);
937 while Element
(Iterator
) /= No_Source
loop
938 if Element
(Iterator
).File
= Base_Name
941 (Element
(Iterator
).Unit
/= No_Unit_Index
943 Element
(Iterator
).Index
= Index
))
945 Src
:= Element
(Iterator
);
947 -- If the source has been excluded, continue looking. We will
948 -- get the excluded source only if there is no other source
949 -- with the same base name that is not locally removed.
951 if not Element
(Iterator
).Locally_Removed
then
953 Result
(Last
) := Src
;
959 end Look_For_Sources
;
961 procedure For_Imported_Projects
is new For_Every_Project_Imported
962 (State
=> Empty_State
, Action
=> Look_For_Sources
);
966 -- Start of processing for Find_All_Sources
969 if In_Extended_Only
then
971 while Proj
/= No_Project
loop
972 Look_For_Sources
(Proj
, In_Tree
, No_State
);
974 Proj
:= Proj
.Extends
;
977 elsif In_Imported_Only
then
978 Look_For_Sources
(Project
, In_Tree
, No_State
);
981 For_Imported_Projects
984 Include_Aggregated
=> False,
985 With_State
=> No_State
);
989 Look_For_Sources
(No_Project
, In_Tree
, No_State
);
992 return Result
(1 .. Last
);
993 end Find_All_Sources
;
999 function Hash
is new GNAT
.HTable
.Hash
(Header_Num
=> Header_Num
);
1000 -- Used in implementation of other functions Hash below
1006 function Hash
(Name
: File_Name_Type
) return Header_Num
is
1008 return Hash
(Get_Name_String
(Name
));
1011 function Hash
(Name
: Name_Id
) return Header_Num
is
1013 return Hash
(Get_Name_String
(Name
));
1016 function Hash
(Name
: Path_Name_Type
) return Header_Num
is
1018 return Hash
(Get_Name_String
(Name
));
1021 function Hash
(Project
: Project_Id
) return Header_Num
is
1023 if Project
= No_Project
then
1024 return Header_Num
'First;
1026 return Hash
(Get_Name_String
(Project
.Name
));
1034 function Image
(The_Casing
: Casing_Type
) return String is
1036 return The_Casing_Images
(The_Casing
).all;
1039 -----------------------------
1040 -- Is_Standard_GNAT_Naming --
1041 -----------------------------
1043 function Is_Standard_GNAT_Naming
1044 (Naming
: Lang_Naming_Data
) return Boolean
1047 return Get_Name_String
(Naming
.Spec_Suffix
) = ".ads"
1048 and then Get_Name_String
(Naming
.Body_Suffix
) = ".adb"
1049 and then Get_Name_String
(Naming
.Dot_Replacement
) = "-";
1050 end Is_Standard_GNAT_Naming
;
1056 procedure Initialize
(Tree
: Project_Tree_Ref
) is
1058 if The_Empty_String
= No_Name
then
1061 The_Empty_String
:= Name_Find
;
1063 Prj
.Attr
.Initialize
;
1065 -- Make sure that new reserved words after Ada 95 may be used as
1068 Opt
.Ada_Version
:= Opt
.Ada_95
;
1069 Opt
.Ada_Version_Pragma
:= Empty
;
1071 Set_Name_Table_Byte
(Name_Project
, Token_Type
'Pos (Tok_Project
));
1072 Set_Name_Table_Byte
(Name_Extends
, Token_Type
'Pos (Tok_Extends
));
1073 Set_Name_Table_Byte
(Name_External
, Token_Type
'Pos (Tok_External
));
1075 (Name_External_As_List
, Token_Type
'Pos (Tok_External_As_List
));
1078 if Tree
/= No_Project_Tree
then
1087 function Is_Extending
1088 (Extending
: Project_Id
;
1089 Extended
: Project_Id
) return Boolean
1095 while Proj
/= No_Project
loop
1096 if Proj
= Extended
then
1100 Proj
:= Proj
.Extends
;
1110 function Object_Name
1111 (Source_File_Name
: File_Name_Type
;
1112 Object_File_Suffix
: Name_Id
:= No_Name
) return File_Name_Type
1115 if Object_File_Suffix
= No_Name
then
1117 (Source_File_Name
, Object_Suffix
);
1120 (Source_File_Name
, Get_Name_String
(Object_File_Suffix
));
1124 function Object_Name
1125 (Source_File_Name
: File_Name_Type
;
1127 Index_Separator
: Character;
1128 Object_File_Suffix
: Name_Id
:= No_Name
) return File_Name_Type
1130 Index_Img
: constant String := Source_Index
'Img;
1134 Get_Name_String
(Source_File_Name
);
1137 while Last
> 1 and then Name_Buffer
(Last
) /= '.' loop
1142 Name_Len
:= Last
- 1;
1145 Add_Char_To_Name_Buffer
(Index_Separator
);
1146 Add_Str_To_Name_Buffer
(Index_Img
(2 .. Index_Img
'Last));
1148 if Object_File_Suffix
= No_Name
then
1149 Add_Str_To_Name_Buffer
(Object_Suffix
);
1151 Add_Str_To_Name_Buffer
(Get_Name_String
(Object_File_Suffix
));
1157 ----------------------
1158 -- Record_Temp_File --
1159 ----------------------
1161 procedure Record_Temp_File
1162 (Shared
: Shared_Project_Tree_Data_Access
;
1163 Path
: Path_Name_Type
)
1166 Temp_Files_Table
.Append
(Shared
.Private_Part
.Temp_Files
, Path
);
1167 end Record_Temp_File
;
1173 procedure Free
(List
: in out Aggregated_Project_List
) is
1174 procedure Unchecked_Free
is new Ada
.Unchecked_Deallocation
1175 (Aggregated_Project
, Aggregated_Project_List
);
1176 Tmp
: Aggregated_Project_List
;
1178 while List
/= null loop
1183 Unchecked_Free
(List
);
1188 ----------------------------
1189 -- Add_Aggregated_Project --
1190 ----------------------------
1192 procedure Add_Aggregated_Project
1193 (Project
: Project_Id
;
1194 Path
: Path_Name_Type
)
1196 Aggregated
: Aggregated_Project_List
;
1199 -- Check if the project is already in the aggregated project list. If it
1200 -- is, do not add it again.
1202 Aggregated
:= Project
.Aggregated_Projects
;
1203 while Aggregated
/= null loop
1204 if Path
= Aggregated
.Path
then
1207 Aggregated
:= Aggregated
.Next
;
1211 Project
.Aggregated_Projects
:= new Aggregated_Project
'
1213 Project => No_Project,
1215 Next => Project.Aggregated_Projects);
1216 end Add_Aggregated_Project;
1222 procedure Free (Project : in out Project_Id) is
1223 procedure Unchecked_Free is new Ada.Unchecked_Deallocation
1224 (Project_Data, Project_Id);
1227 if Project /= null then
1228 Free (Project.Ada_Include_Path);
1229 Free (Project.Objects_Path);
1230 Free (Project.Ada_Objects_Path);
1231 Free (Project.Ada_Objects_Path_No_Libs);
1232 Free_List (Project.Imported_Projects, Free_Project => False);
1233 Free_List (Project.All_Imported_Projects, Free_Project => False);
1234 Free_List (Project.Languages);
1236 case Project.Qualifier is
1237 when Aggregate | Aggregate_Library =>
1238 Free (Project.Aggregated_Projects);
1244 Unchecked_Free (Project);
1252 procedure Free_List (Languages : in out Language_List) is
1253 procedure Unchecked_Free is new Ada.Unchecked_Deallocation
1254 (Language_List_Element, Language_List);
1255 Tmp : Language_List;
1257 while Languages /= null loop
1258 Tmp := Languages.Next;
1259 Unchecked_Free (Languages);
1268 procedure Free_List (Source : in out Source_Id) is
1269 procedure Unchecked_Free is new
1270 Ada.Unchecked_Deallocation (Source_Data, Source_Id);
1275 while Source /= No_Source loop
1276 Tmp := Source.Next_In_Lang;
1277 Free_List (Source.Alternate_Languages);
1279 if Source.Unit /= null
1280 and then Source.Kind in Spec_Or_Body
1282 Source.Unit.File_Names (Source.Kind) := null;
1285 Unchecked_Free (Source);
1295 (List : in out Project_List;
1296 Free_Project : Boolean)
1298 procedure Unchecked_Free is new
1299 Ada.Unchecked_Deallocation (Project_List_Element, Project_List);
1304 while List /= null loop
1307 if Free_Project then
1308 Free (List.Project);
1311 Unchecked_Free (List);
1320 procedure Free_List (Languages : in out Language_Ptr) is
1321 procedure Unchecked_Free is new
1322 Ada.Unchecked_Deallocation (Language_Data, Language_Ptr);
1327 while Languages /= null loop
1328 Tmp := Languages.Next;
1329 Free_List (Languages.First_Source);
1330 Unchecked_Free (Languages);
1335 --------------------------
1336 -- Reset_Units_In_Table --
1337 --------------------------
1339 procedure Reset_Units_In_Table (Table : in out Units_Htable.Instance) is
1343 Unit := Units_Htable.Get_First (Table);
1344 while Unit /= No_Unit_Index loop
1345 if Unit.File_Names (Spec) /= null then
1346 Unit.File_Names (Spec).Unit := No_Unit_Index;
1349 if Unit.File_Names (Impl) /= null then
1350 Unit.File_Names (Impl).Unit := No_Unit_Index;
1353 Unit := Units_Htable.Get_Next (Table);
1355 end Reset_Units_In_Table;
1361 procedure Free_Units (Table : in out Units_Htable.Instance) is
1362 procedure Unchecked_Free is new
1363 Ada.Unchecked_Deallocation (Unit_Data, Unit_Index);
1368 Unit := Units_Htable.Get_First (Table);
1369 while Unit /= No_Unit_Index loop
1371 -- We cannot reset Unit.File_Names (Impl or Spec).Unit here as
1372 -- Source_Data buffer is freed by the following instruction
1373 -- Free_List (Tree.Projects, Free_Project => True);
1375 Unchecked_Free (Unit);
1376 Unit := Units_Htable.Get_Next (Table);
1379 Units_Htable.Reset (Table);
1386 procedure Free (Tree : in out Project_Tree_Ref) is
1387 procedure Unchecked_Free is new
1388 Ada.Unchecked_Deallocation
1389 (Project_Tree_Data, Project_Tree_Ref);
1391 procedure Unchecked_Free is new
1392 Ada.Unchecked_Deallocation
1393 (Project_Tree_Appdata'Class, Project_Tree_Appdata_Access);
1396 if Tree /= null then
1397 if Tree.Is_Root_Tree then
1398 Name_List_Table.Free (Tree.Shared.Name_Lists);
1399 Number_List_Table.Free (Tree.Shared.Number_Lists);
1400 String_Element_Table.Free (Tree.Shared.String_Elements);
1401 Variable_Element_Table.Free (Tree.Shared.Variable_Elements);
1402 Array_Element_Table.Free (Tree.Shared.Array_Elements);
1403 Array_Table.Free (Tree.Shared.Arrays);
1404 Package_Table.Free (Tree.Shared.Packages);
1405 Temp_Files_Table.Free (Tree.Shared.Private_Part.Temp_Files);
1408 if Tree.Appdata /= null then
1409 Free (Tree.Appdata.all);
1410 Unchecked_Free (Tree.Appdata);
1413 Source_Paths_Htable.Reset (Tree.Source_Paths_HT);
1414 Source_Files_Htable.Reset (Tree.Source_Files_HT);
1416 Reset_Units_In_Table (Tree.Units_HT);
1417 Free_List (Tree.Projects, Free_Project => True);
1418 Free_Units (Tree.Units_HT);
1420 Unchecked_Free (Tree);
1428 procedure Reset (Tree : Project_Tree_Ref) is
1432 if Tree.Is_Root_Tree then
1434 -- We cannot use 'Access here
:
1435 -- "illegal attribute for discriminant-dependent component"
1436 -- However, we know this is valid since Shared and Shared_Data have
1437 -- the same lifetime and will always exist concurrently.
1439 Tree
.Shared
:= Tree
.Shared_Data
'Unrestricted_Access;
1440 Name_List_Table
.Init
(Tree
.Shared
.Name_Lists
);
1441 Number_List_Table
.Init
(Tree
.Shared
.Number_Lists
);
1442 String_Element_Table
.Init
(Tree
.Shared
.String_Elements
);
1443 Variable_Element_Table
.Init
(Tree
.Shared
.Variable_Elements
);
1444 Array_Element_Table
.Init
(Tree
.Shared
.Array_Elements
);
1445 Array_Table
.Init
(Tree
.Shared
.Arrays
);
1446 Package_Table
.Init
(Tree
.Shared
.Packages
);
1448 -- Private part table
1450 Temp_Files_Table
.Init
(Tree
.Shared
.Private_Part
.Temp_Files
);
1452 Tree
.Shared
.Private_Part
.Current_Source_Path_File
:= No_Path
;
1453 Tree
.Shared
.Private_Part
.Current_Object_Path_File
:= No_Path
;
1456 Source_Paths_Htable
.Reset
(Tree
.Source_Paths_HT
);
1457 Source_Files_Htable
.Reset
(Tree
.Source_Files_HT
);
1458 Replaced_Source_HTable
.Reset
(Tree
.Replaced_Sources
);
1460 Tree
.Replaced_Source_Number
:= 0;
1462 Reset_Units_In_Table
(Tree
.Units_HT
);
1463 Free_List
(Tree
.Projects
, Free_Project
=> True);
1464 Free_Units
(Tree
.Units_HT
);
1467 -------------------------------------
1468 -- Set_Current_Object_Path_File_Of --
1469 -------------------------------------
1471 procedure Set_Current_Object_Path_File_Of
1472 (Shared
: Shared_Project_Tree_Data_Access
;
1473 To
: Path_Name_Type
)
1476 Shared
.Private_Part
.Current_Object_Path_File
:= To
;
1477 end Set_Current_Object_Path_File_Of
;
1479 -------------------------------------
1480 -- Set_Current_Source_Path_File_Of --
1481 -------------------------------------
1483 procedure Set_Current_Source_Path_File_Of
1484 (Shared
: Shared_Project_Tree_Data_Access
;
1485 To
: Path_Name_Type
)
1488 Shared
.Private_Part
.Current_Source_Path_File
:= To
;
1489 end Set_Current_Source_Path_File_Of
;
1491 -----------------------
1492 -- Set_Path_File_Var --
1493 -----------------------
1495 procedure Set_Path_File_Var
(Name
: String; Value
: String) is
1496 Host_Spec
: String_Access
:= To_Host_File_Spec
(Value
);
1498 if Host_Spec
= null then
1500 ("could not convert file name """ & Value
& """ to host spec");
1502 Setenv
(Name
, Host_Spec
.all);
1505 end Set_Path_File_Var
;
1511 function Switches_Name
1512 (Source_File_Name
: File_Name_Type
) return File_Name_Type
1515 return Extend_Name
(Source_File_Name
, Switches_Dependency_Suffix
);
1522 function Value
(Image
: String) return Casing_Type
is
1524 for Casing
in The_Casing_Images
'Range loop
1525 if To_Lower
(Image
) = To_Lower
(The_Casing_Images
(Casing
).all) then
1530 raise Constraint_Error
;
1533 ---------------------
1534 -- Has_Ada_Sources --
1535 ---------------------
1537 function Has_Ada_Sources
(Data
: Project_Id
) return Boolean is
1538 Lang
: Language_Ptr
;
1541 Lang
:= Data
.Languages
;
1542 while Lang
/= No_Language_Index
loop
1543 if Lang
.Name
= Name_Ada
then
1544 return Lang
.First_Source
/= No_Source
;
1550 end Has_Ada_Sources
;
1552 ------------------------
1553 -- Contains_ALI_Files --
1554 ------------------------
1556 function Contains_ALI_Files
(Dir
: Path_Name_Type
) return Boolean is
1557 Dir_Name
: constant String := Get_Name_String
(Dir
);
1559 Name
: String (1 .. 1_000
);
1561 Result
: Boolean := False;
1564 Open
(Direct
, Dir_Name
);
1566 -- For each file in the directory, check if it is an ALI file
1569 Read
(Direct
, Name
, Last
);
1571 Canonical_Case_File_Name
(Name
(1 .. Last
));
1572 Result
:= Last
>= 5 and then Name
(Last
- 3 .. Last
) = ".ali";
1580 -- If there is any problem, close the directory if open and return True.
1581 -- The library directory will be added to the path.
1584 if Is_Open
(Direct
) then
1589 end Contains_ALI_Files
;
1591 --------------------------
1592 -- Get_Object_Directory --
1593 --------------------------
1595 function Get_Object_Directory
1596 (Project
: Project_Id
;
1597 Including_Libraries
: Boolean;
1598 Only_If_Ada
: Boolean := False) return Path_Name_Type
1601 if (Project
.Library
and then Including_Libraries
)
1603 (Project
.Object_Directory
/= No_Path_Information
1604 and then (not Including_Libraries
or else not Project
.Library
))
1606 -- For a library project, add the library ALI directory if there is
1607 -- no object directory or if the library ALI directory contains ALI
1608 -- files; otherwise add the object directory.
1610 if Project
.Library
then
1611 if Project
.Object_Directory
= No_Path_Information
1613 (Including_Libraries
1615 Contains_ALI_Files
(Project
.Library_ALI_Dir
.Display_Name
))
1617 return Project
.Library_ALI_Dir
.Display_Name
;
1619 return Project
.Object_Directory
.Display_Name
;
1622 -- For a non-library project, add object directory if it is not a
1623 -- virtual project, and if there are Ada sources in the project or
1624 -- one of the projects it extends. If there are no Ada sources,
1625 -- adding the object directory could disrupt the order of the
1626 -- object dirs in the path.
1628 elsif not Project
.Virtual
then
1630 Add_Object_Dir
: Boolean;
1634 Add_Object_Dir
:= not Only_If_Ada
;
1636 while not Add_Object_Dir
and then Prj
/= No_Project
loop
1637 if Has_Ada_Sources
(Prj
) then
1638 Add_Object_Dir
:= True;
1644 if Add_Object_Dir
then
1645 return Project
.Object_Directory
.Display_Name
;
1652 end Get_Object_Directory
;
1654 -----------------------------------
1655 -- Ultimate_Extending_Project_Of --
1656 -----------------------------------
1658 function Ultimate_Extending_Project_Of
1659 (Proj
: Project_Id
) return Project_Id
1665 while Prj
/= null and then Prj
.Extended_By
/= No_Project
loop
1666 Prj
:= Prj
.Extended_By
;
1670 end Ultimate_Extending_Project_Of
;
1672 -----------------------------------
1673 -- Compute_All_Imported_Projects --
1674 -----------------------------------
1676 procedure Compute_All_Imported_Projects
1677 (Root_Project
: Project_Id
;
1678 Tree
: Project_Tree_Ref
)
1680 procedure Analyze_Tree
1681 (Local_Root
: Project_Id
;
1682 Local_Tree
: Project_Tree_Ref
;
1683 Context
: Project_Context
);
1684 -- Process Project and all its aggregated project to analyze their own
1685 -- imported projects.
1691 procedure Analyze_Tree
1692 (Local_Root
: Project_Id
;
1693 Local_Tree
: Project_Tree_Ref
;
1694 Context
: Project_Context
)
1696 pragma Unreferenced
(Local_Root
);
1698 Project
: Project_Id
;
1700 procedure Recursive_Add
1702 Tree
: Project_Tree_Ref
;
1703 Context
: Project_Context
;
1704 Dummy
: in out Boolean);
1705 -- Recursively add the projects imported by project Project, but not
1706 -- those that are extended.
1712 procedure Recursive_Add
1714 Tree
: Project_Tree_Ref
;
1715 Context
: Project_Context
;
1716 Dummy
: in out Boolean)
1718 pragma Unreferenced
(Dummy
, Tree
);
1720 List
: Project_List
;
1724 -- A project is not importing itself
1726 Prj2
:= Ultimate_Extending_Project_Of
(Prj
);
1728 if Project
/= Prj2
then
1730 -- Check that the project is not already in the list. We know
1731 -- the one passed to Recursive_Add have never been visited
1732 -- before, but the one passed it are the extended projects.
1734 List
:= Project
.All_Imported_Projects
;
1735 while List
/= null loop
1736 if List
.Project
= Prj2
then
1743 -- Add it to the list
1745 Project
.All_Imported_Projects
:=
1746 new Project_List_Element
'
1748 From_Encapsulated_Lib =>
1749 Context.From_Encapsulated_Lib
1750 or else Analyze_Tree.Context.From_Encapsulated_Lib,
1751 Next => Project.All_Imported_Projects);
1755 procedure For_All_Projects is
1756 new For_Every_Project_Imported_Context (Boolean, Recursive_Add);
1758 Dummy : Boolean := False;
1759 List : Project_List;
1762 List := Local_Tree.Projects;
1763 while List /= null loop
1764 Project := List.Project;
1766 (Project.All_Imported_Projects, Free_Project => False);
1768 (Project, Local_Tree, Dummy, Include_Aggregated => False);
1773 procedure For_Aggregates is
1774 new For_Project_And_Aggregated_Context (Analyze_Tree);
1776 -- Start of processing for Compute_All_Imported_Projects
1779 For_Aggregates (Root_Project, Tree);
1780 end Compute_All_Imported_Projects;
1786 function Is_Compilable (Source : Source_Id) return Boolean is
1788 case Source.Compilable is
1790 if Source.Language.Config.Compiler_Driver /= No_File
1792 Length_Of_Name (Source.Language.Config.Compiler_Driver) /= 0
1793 and then not Source.Locally_Removed
1794 and then (Source.Language.Config.Kind /= File_Based
1795 or else Source.Kind /= Spec)
1797 -- Do not modify Source.Compilable before the source record
1798 -- has been initialized.
1800 if Source.Source_TS /= Empty_Time_Stamp then
1801 Source.Compilable := Yes;
1807 if Source.Source_TS /= Empty_Time_Stamp then
1808 Source.Compilable := No;
1822 ------------------------------
1823 -- Object_To_Global_Archive --
1824 ------------------------------
1826 function Object_To_Global_Archive (Source : Source_Id) return Boolean is
1828 return Source.Language.Config.Kind = File_Based
1829 and then Source.Kind = Impl
1830 and then Source.Language.Config.Objects_Linked
1831 and then Is_Compilable (Source)
1832 and then Source.Language.Config.Object_Generated;
1833 end Object_To_Global_Archive;
1835 ----------------------------
1836 -- Get_Language_From_Name --
1837 ----------------------------
1839 function Get_Language_From_Name
1840 (Project : Project_Id;
1841 Name : String) return Language_Ptr
1844 Result : Language_Ptr;
1847 Name_Len := Name'Length;
1848 Name_Buffer (1 .. Name_Len) := Name;
1849 To_Lower (Name_Buffer (1 .. Name_Len));
1852 Result := Project.Languages;
1853 while Result /= No_Language_Index loop
1854 if Result.Name = N then
1858 Result := Result.Next;
1861 return No_Language_Index;
1862 end Get_Language_From_Name;
1868 function Other_Part (Source : Source_Id) return Source_Id is
1870 if Source.Unit /= No_Unit_Index then
1873 return Source.Unit.File_Names (Spec);
1875 return Source.Unit.File_Names (Impl);
1888 function Create_Flags
1889 (Report_Error : Error_Handler;
1890 When_No_Sources : Error_Warning;
1891 Require_Sources_Other_Lang : Boolean := True;
1892 Allow_Duplicate_Basenames : Boolean := True;
1893 Compiler_Driver_Mandatory : Boolean := False;
1894 Error_On_Unknown_Language : Boolean := True;
1895 Require_Obj_Dirs : Error_Warning := Error;
1896 Allow_Invalid_External : Error_Warning := Error;
1897 Missing_Source_Files : Error_Warning := Error;
1898 Ignore_Missing_With : Boolean := False)
1899 return Processing_Flags
1902 return Processing_Flags'
1903 (Report_Error
=> Report_Error
,
1904 When_No_Sources
=> When_No_Sources
,
1905 Require_Sources_Other_Lang
=> Require_Sources_Other_Lang
,
1906 Allow_Duplicate_Basenames
=> Allow_Duplicate_Basenames
,
1907 Error_On_Unknown_Language
=> Error_On_Unknown_Language
,
1908 Compiler_Driver_Mandatory
=> Compiler_Driver_Mandatory
,
1909 Require_Obj_Dirs
=> Require_Obj_Dirs
,
1910 Allow_Invalid_External
=> Allow_Invalid_External
,
1911 Missing_Source_Files
=> Missing_Source_Files
,
1912 Ignore_Missing_With
=> Ignore_Missing_With
);
1920 (Table
: Name_List_Table
.Instance
;
1921 List
: Name_List_Index
) return Natural
1923 Count
: Natural := 0;
1924 Tmp
: Name_List_Index
;
1928 while Tmp
/= No_Name_List
loop
1930 Tmp
:= Table
.Table
(Tmp
).Next
;
1940 procedure Debug_Output
(Str
: String) is
1942 if Current_Verbosity
> Default
then
1944 Write_Line
((1 .. Debug_Level
* 2 => ' ') & Str
);
1945 Set_Standard_Output
;
1953 procedure Debug_Indent
is
1955 if Current_Verbosity
= High
then
1957 Write_Str
((1 .. Debug_Level
* 2 => ' '));
1958 Set_Standard_Output
;
1966 procedure Debug_Output
(Str
: String; Str2
: Name_Id
) is
1968 if Current_Verbosity
> Default
then
1973 if Str2
= No_Name
then
1974 Write_Line
(" <no_name>");
1976 Write_Line
(" """ & Get_Name_String
(Str2
) & '"');
1979 Set_Standard_Output
;
1983 ---------------------------
1984 -- Debug_Increase_Indent --
1985 ---------------------------
1987 procedure Debug_Increase_Indent
1988 (Str
: String := ""; Str2
: Name_Id
:= No_Name
)
1991 if Str2
/= No_Name
then
1992 Debug_Output
(Str
, Str2
);
1996 Debug_Level
:= Debug_Level
+ 1;
1997 end Debug_Increase_Indent
;
1999 ---------------------------
2000 -- Debug_Decrease_Indent --
2001 ---------------------------
2003 procedure Debug_Decrease_Indent
(Str
: String := "") is
2005 if Debug_Level
> 0 then
2006 Debug_Level
:= Debug_Level
- 1;
2012 end Debug_Decrease_Indent
;
2018 function Debug_Name
(Tree
: Project_Tree_Ref
) return Name_Id
is
2023 Add_Str_To_Name_Buffer
("Tree [");
2026 while P
/= null loop
2027 if P
/= Tree
.Projects
then
2028 Add_Char_To_Name_Buffer
(',');
2031 Add_Str_To_Name_Buffer
(Get_Name_String
(P
.Project
.Name
));
2036 Add_Char_To_Name_Buffer
(']');
2045 procedure Free
(Tree
: in out Project_Tree_Appdata
) is
2046 pragma Unreferenced
(Tree
);
2051 --------------------------------
2052 -- For_Project_And_Aggregated --
2053 --------------------------------
2055 procedure For_Project_And_Aggregated
2056 (Root_Project
: Project_Id
;
2057 Root_Tree
: Project_Tree_Ref
)
2059 Agg
: Aggregated_Project_List
;
2062 Action
(Root_Project
, Root_Tree
);
2064 if Root_Project
.Qualifier
in Aggregate_Project
then
2065 Agg
:= Root_Project
.Aggregated_Projects
;
2066 while Agg
/= null loop
2067 For_Project_And_Aggregated
(Agg
.Project
, Agg
.Tree
);
2071 end For_Project_And_Aggregated
;
2073 ----------------------------------------
2074 -- For_Project_And_Aggregated_Context --
2075 ----------------------------------------
2077 procedure For_Project_And_Aggregated_Context
2078 (Root_Project
: Project_Id
;
2079 Root_Tree
: Project_Tree_Ref
)
2082 procedure Recursive_Process
2083 (Project
: Project_Id
;
2084 Tree
: Project_Tree_Ref
;
2085 Context
: Project_Context
);
2086 -- Process Project and all aggregated projects recursively
2088 -----------------------
2089 -- Recursive_Process --
2090 -----------------------
2092 procedure Recursive_Process
2093 (Project
: Project_Id
;
2094 Tree
: Project_Tree_Ref
;
2095 Context
: Project_Context
)
2097 Agg
: Aggregated_Project_List
;
2098 Ctx
: Project_Context
;
2101 Action
(Project
, Tree
, Context
);
2103 if Project
.Qualifier
in Aggregate_Project
then
2105 (In_Aggregate_Lib
=> True,
2106 From_Encapsulated_Lib
=>
2107 Context
.From_Encapsulated_Lib
2108 or else Project
.Standalone_Library
= Encapsulated
);
2110 Agg
:= Project
.Aggregated_Projects
;
2111 while Agg
/= null loop
2112 Recursive_Process
(Agg
.Project
, Agg
.Tree
, Ctx
);
2116 end Recursive_Process
;
2118 -- Start of processing for For_Project_And_Aggregated_Context
2122 (Root_Project
, Root_Tree
, Project_Context
'(False, False));
2123 end For_Project_And_Aggregated_Context;
2125 -- Package initialization for Prj
2128 -- Make sure that the standard config and user project file extensions are
2129 -- compatible with canonical case file naming.
2131 Canonical_Case_File_Name (Config_Project_File_Extension);
2132 Canonical_Case_File_Name (Project_File_Extension);