diff options
author | Vincent Celier <celier@adacore.com> | 2005-03-15 16:46:57 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2005-03-15 16:46:57 +0100 |
commit | 7e98a4c668eac2b10f06ff207a24d2ca4e867128 (patch) | |
tree | cf1142dd403f99e75300ca6822d5c4d182a98b74 /gcc/ada/make.adb | |
parent | 0ca89db7aa51322aa15f6d89b692b20ad5898c89 (diff) | |
download | gcc-7e98a4c668eac2b10f06ff207a24d2ca4e867128.zip gcc-7e98a4c668eac2b10f06ff207a24d2ca4e867128.tar.gz gcc-7e98a4c668eac2b10f06ff207a24d2ca4e867128.tar.bz2 |
mlib-tgt-tru64.adb, [...] (Library_Exist_For, [...]): Add new parameter In_Tree to specify the project tree...
2005-03-08 Vincent Celier <celier@adacore.com>
* mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb,
mlib-tgt-vms-alpha.adb, mlib-tgt-vms-ia64.adb, mlib-tgt-mingw.adb,
mlib-tgt-vxworks.adb, mlib-tgt-lynxos.adb (Library_Exist_For,
Library_File_Name_For): Add new parameter In_Tree
to specify the project tree: needed by the project manager.
Adapt to changes in project manager using new parameter In_Tree.
Remove local imports, use functions in System.CRTL.
* make.adb, clean.adb, gnatcmd.adb (Project_Tree): New constant needed
to use the project manager.
* makeutl.ads, makeutl.adb (Linker_Options_Switches): New parameter
In_Tree to designate the project tree. Adapt to changes in the project
manager, using In_Tree.
* mlib-prj.ads, mlib-prj.adb (Build_Library, Check_Library,
Copy_Interface_Sources): Add new parameter In_Tree to specify the
project tree: needed by the project manager.
(Build_Library): Check that Arg'Length >= 6 before checking if it
contains "--RTS=...".
* mlib-tgt.ads, mlib-tgt.adb (Library_Exist_For,
Library_File_Name_For): Add new parameter In_Tree to specify the
project tree: needed by the project manager.
* prj.ads, prj.adb: Major modifications to allow several project trees
in memory at the same time.
Change tables to dynamic tables and hash tables to dynamic hash
tables. Move tables and hash tables from Prj.Com (in the visible part)
and Prj.Env (in the private part). Move some constants from the visible
part to the private part. Make other constants deferred.
(Project_Empty): Make it a variable, not a function
(Empty_Project): Add parameter Tree. Returns the data with the default
naming data of the project tree Tree.
(Initialize): After updating Std_Naming_Data, copy its value to the
component Naming of Project Empty.
(Register_Default_Naming_Scheme): Use and update the default naming
component of the project tree, instead of the global variable
Std_Naming_Data.
(Standard_Naming_Data): Add defaulted parameter Tree. If project tree
Tree is not defaulted, return the default naming data of the Tree.
(Initial_Buffer_Size): Constant moved from private part
(Default_Ada_Spec_Suffix_Id, Default_Ada_Body_Suffix_Id, Slash_Id); new
variables initialized in procedure Initialize.
(Add_To_Buffer): Add two in out parameters to replace global variables
Buffer and Buffer_Last.
(Default_Ada_Spec_Suffix, Default_Body_Spec_Suffix, Slash): New
functions.
Adapt to changes to use new type Project_Tree_Ref and dynamic tables and
hash tables.
(Initialize, Reset, register-Default_Namng-Scheme): Add a new parameter
for the project tree.
(Project_Tree_Data, Project_Tree_Ref, No_Project): Declare types and
constant at the beginning of the package spec, so that they cane be used
in subprograms before their full declarations.
(Standard_Naming_Data): Add defaulted parameter of type Project_Node_Ref
(Empty_Project): Add parameter of type Project_Node_Ref
(Private_Project_Tree_Data): Add component Default_Naming of type
Naming_Data.
(Buffer, Buffer_Last): remove global variables
(Add_To_Buffer): Add two in out parameters to replace global variables
Buffer and Buffer_Last.
(Current_Packages_To_Check): Remove global variable
(Empty_Name): Move to private part
(No-Symbols): Make it a constant
(Private_Project_Tree_Data): New type for the private part of the
project tree data.
(Project_Tree_Data): New type for the data of a project tree
(Project_Tree_Ref): New type to designate a project tree
(Initialize, Reset, register-Default_Namng-Scheme): Add a new parameter
for the project tree.
* prj-attr.ads: Add with Table; needed, as package Prj no longer
imports package Table.
* prj-com.adb: Remove empty, no longer needed body
* prj-com.ads: Move most of the content of this package to package Prj.
* prj-dect.ads, prj-dect.adb (Parse): New parameters In_Tree to
designate the project node tree and Packages_To_Check to replace
global variable Current_Packages_To_Check.
Add new parameters In_Tree and Packages_To_Check to local subprograms,
when needed. Adapt to changes in project manager with project node tree
In_Tree.
* prj-env.ads, prj-env.adb: Add new parameter In_Tree to designate the
project tree to most subprograms. Move tables and hash tables to
private part of package Prj.
Adapt to changes in project manager using project tree In_Tree.
* prj-makr.adb (Tree): New constant to designate the project node tree
Adapt to change in project manager using project node tree Tree
* prj-nmsc.ads, prj-nmsc.adb (Check_Stand_Alone_Library): Correctly
display the Library_Src_Dir and the Library_Dir.
Add new parameter In_Tree to designate the project node tree to most
subprograms. Adapt to changes in the project manager, using project tree
In_Tree.
(Check_Naming_Scheme): Do not alter the casing on platforms where
the casing of file names is not significant.
(Check): Add new parameter In_Tree to designate the
* prj-pars.ads, prj-pars.adb (Parse): Add new parameter In_Tree to
designate the project tree.
Declare a project node tree to call Prj.Part.Parse and Prj.Proc.Process
* prj-part.ads, prj-part.adb (Buffer, Buffer_Last): Global variables,
to replace those that were in the private part of package Prj.
Add new parameter In__Tree to designate the project node tree to most
subprograms. Adapt to change in Prj.Tree with project node tree In_Tree.
(Post_Parse_Context_Clause): When specifying the project node of a with
clause, indicate that it is a limited with only if there is "limited"
in the with clause, not necessarily when In_Limited is True.
(Parse): Add new parameter In_Tree to designate the project node tree
* prj-pp.ads, prj-pp.adb (Pretty_Print): Add new parameter In_Tree to
designate the project node tree. Adapt to change in Prj.Tree with
project node tree In_Tree.
* prj-proc.ads, prj-proc.adb (Recursive_Process): Specify the project
tree In_Tree in the call to function Empty_Process to give its initial
value to the project data Processed_Data.
Add new parameters In_Tree to designate the project tree and
From_Project_Node_Tree to designate the project node tree to several
subprograms. Adapt to change in project manager with project tree
In_Tree and project node tree From_Project_Node_Tree.
* prj-strt.ads, prj-strt.adb (Buffer, Buffer_Last): Global variables,
to replace those that were in the private part of package Prj.
Add new parameter In_Tree to designate the project node tree to most
subprograms. Adapt to change in Prj.Tree with project node tree In_Tree.
* prj-tree.ads, prj-tree.adb: Add new parameter of type
Project_Node_Tree_Ref to most subprograms.
Use this new parameter to store project nodes in the designated project
node tree.
(Project_Node_Tree_Ref): New type to designate a project node tree
(Tree_Private_Part): Change table to dynamic table and hash tables to
dynamic hash tables.
* prj-util.ads, prj-util.adb: Add new parameter In_Tree to designate
the project tree to most subprograms. Adapt to changes in project
manager using project tree In_Tree.
* makegpr.adb (Project_Tree): New constant needed to use project
manager.
From-SVN: r96481
Diffstat (limited to 'gcc/ada/make.adb')
-rw-r--r-- | gcc/ada/make.adb | 491 |
1 files changed, 311 insertions, 180 deletions
diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb index e799e05..71f95c4 100644 --- a/gcc/ada/make.adb +++ b/gcc/ada/make.adb @@ -275,6 +275,8 @@ package body Make is Current_Verbosity : Prj.Verbosity := Prj.Default; -- Verbosity to parse the project files + Project_Tree : constant Project_Tree_Ref := new Project_Tree_Data; + Main_Project : Prj.Project_Id := No_Project; -- The project id of the main project file, if any @@ -943,7 +945,8 @@ package body Make is (Source_File => Name_Find, Source_File_Name => File_Name, Source_Index => Index, - Naming => Projects.Table (Main_Project).Naming, + Naming => Project_Tree.Projects.Table + (Main_Project).Naming, In_Package => The_Package, Allow_ALI => Program = Binder or else Program = Linker); @@ -958,7 +961,8 @@ package body Make is Switch_List := Switches.Values; while Switch_List /= Nil_String loop - Element := String_Elements.Table (Switch_List); + Element := + Project_Tree.String_Elements.Table (Switch_List); Get_Name_String (Element.Value); if Name_Len > 0 then @@ -1073,7 +1077,9 @@ package body Make is if Project /= No_Project then Change_Dir - (Get_Name_String (Projects.Table (Project).Object_Directory)); + (Get_Name_String + (Project_Tree.Projects.Table + (Project).Object_Directory)); -- Otherwise, for sources outside of any project, set the working -- directory to the object directory of the main project. @@ -1081,7 +1087,8 @@ package body Make is elsif Main_Project /= No_Project then Change_Dir (Get_Name_String - (Projects.Table (Main_Project).Object_Directory)); + (Project_Tree.Projects.Table + (Main_Project).Object_Directory)); end if; end if; end Change_To_Object_Directory; @@ -1716,7 +1723,8 @@ package body Make is Get_Reference (Source_File_Name => Source_File_Name, Project => Arguments_Project, - Path => Arguments_Path_Name); + Path => Arguments_Path_Name, + In_Tree => Project_Tree); -- If the source is not a source of a project file, check if -- this is allowed. @@ -1736,14 +1744,15 @@ package body Make is -- We get the project directory for the relative path -- switches and arguments. - Data := Projects.Table (Arguments_Project); + Data := Project_Tree.Projects.Table (Arguments_Project); -- If the source is in an extended project, we go to -- the ultimate extending project. while Data.Extended_By /= No_Project loop Arguments_Project := Data.Extended_By; - Data := Projects.Table (Arguments_Project); + Data := + Project_Tree.Projects.Table (Arguments_Project); end loop; -- If building a dynamic or relocatable library, compile with @@ -1763,7 +1772,8 @@ package body Make is if Data.Dir_Path = null then Data.Dir_Path := new String'(Get_Name_String (Data.Display_Directory)); - Projects.Table (Arguments_Project) := Data; + Project_Tree.Projects.Table (Arguments_Project) := + Data; end if; -- We now look for package Compiler @@ -1772,7 +1782,8 @@ package body Make is Compiler_Package := Prj.Util.Value_Of (Name => Name_Compiler, - In_Packages => Data.Decl.Packages); + In_Packages => Data.Decl.Packages, + In_Tree => Project_Tree); if Compiler_Package /= No_Package then @@ -1804,7 +1815,8 @@ package body Make is begin while Current /= Nil_String loop - Element := String_Elements.Table (Current); + Element := Project_Tree.String_Elements. + Table (Current); Number := Number + 1; Current := Element.Next; end loop; @@ -1816,7 +1828,8 @@ package body Make is Current := Switches.Values; for Index in New_Args'Range loop - Element := String_Elements.Table (Current); + Element := Project_Tree.String_Elements. + Table (Current); Get_Name_String (Element.Value); New_Args (Index) := new String'(Name_Buffer (1 .. Name_Len)); @@ -2221,22 +2234,26 @@ package body Make is -- check for an eventual library project, and use the full path. if Arguments_Project /= No_Project then - if not Projects.Table (Arguments_Project).Externally_Built then - Prj.Env.Set_Ada_Paths (Arguments_Project, True); + if not Project_Tree.Projects.Table + (Arguments_Project).Externally_Built + then + Prj.Env.Set_Ada_Paths + (Arguments_Project, Project_Tree, True); if not Unique_Compile and then MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None then declare The_Data : Project_Data := - Projects.Table (Arguments_Project); + Project_Tree.Projects.Table + (Arguments_Project); Prj : Project_Id := Arguments_Project; begin while The_Data.Extended_By /= No_Project loop Prj := The_Data.Extended_By; - The_Data := Projects.Table (Prj); + The_Data := Project_Tree.Projects.Table (Prj); end loop; if The_Data.Library @@ -2252,7 +2269,8 @@ package body Make is -- Now mark the project as processed - Projects.Table (Prj).Need_To_Build_Lib := True; + Project_Tree.Projects.Table + (Prj).Need_To_Build_Lib := True; end if; end; end if; @@ -3006,7 +3024,9 @@ package body Make is else declare Parent_Directory : constant String := - Get_Name_String (Projects.Table (Project).Directory); + Get_Name_String + (Project_Tree.Projects.Table + (Project).Directory); begin if Parent_Directory (Parent_Directory'Last) = @@ -3025,17 +3045,21 @@ package body Make is -- Start of processing for Configuration_Pragmas_Switch begin - Prj.Env.Create_Config_Pragmas_File (For_Project, Main_Project); + Prj.Env.Create_Config_Pragmas_File + (For_Project, Main_Project, Project_Tree); - if Projects.Table (For_Project).Config_File_Name /= No_Name then + if Project_Tree.Projects.Table + (For_Project).Config_File_Name /= No_Name + then Temporary_Config_File := - Projects.Table (For_Project).Config_File_Temp; + Project_Tree.Projects.Table (For_Project).Config_File_Temp; Last := 1; Result (1) := new String' ("-gnatec=" & Get_Name_String - (Projects.Table (For_Project).Config_File_Name)); + (Project_Tree.Projects.Table + (For_Project).Config_File_Name)); else Temporary_Config_File := False; @@ -3043,16 +3067,20 @@ package body Make is -- Check for attribute Builder'Global_Configuration_Pragmas - The_Packages := Projects.Table (Main_Project).Decl.Packages; + The_Packages := Project_Tree.Projects.Table + (Main_Project).Decl.Packages; Gnatmake := Prj.Util.Value_Of (Name => Name_Builder, - In_Packages => The_Packages); + In_Packages => The_Packages, + In_Tree => Project_Tree); if Gnatmake /= No_Package then Global_Attribute := Prj.Util.Value_Of (Variable_Name => Name_Global_Configuration_Pragmas, - In_Variables => Packages.Table (Gnatmake).Decl.Attributes); + In_Variables => Project_Tree.Packages.Table + (Gnatmake).Decl.Attributes, + In_Tree => Project_Tree); Global_Attribute_Present := Global_Attribute /= Nil_Variable_Value and then Get_Name_String (Global_Attribute.Value) /= ""; @@ -3076,16 +3104,20 @@ package body Make is -- Check for attribute Compiler'Local_Configuration_Pragmas - The_Packages := Projects.Table (For_Project).Decl.Packages; + The_Packages := + Project_Tree.Projects.Table (For_Project).Decl.Packages; Compiler := Prj.Util.Value_Of (Name => Name_Compiler, - In_Packages => The_Packages); + In_Packages => The_Packages, + In_Tree => Project_Tree); if Compiler /= No_Package then Local_Attribute := Prj.Util.Value_Of (Variable_Name => Name_Local_Configuration_Pragmas, - In_Variables => Packages.Table (Compiler).Decl.Attributes); + In_Variables => Project_Tree.Packages.Table + (Compiler).Decl.Attributes, + In_Tree => Project_Tree); Local_Attribute_Present := Local_Attribute /= Nil_Variable_Value and then Get_Name_String (Local_Attribute.Value) /= ""; @@ -3134,7 +3166,7 @@ package body Make is if Gnatmake_Called and not Debug.Debug_Flag_N then Delete_Mapping_Files; Delete_Temp_Config_Files; - Prj.Env.Delete_All_Path_Files; + Prj.Env.Delete_All_Path_Files (Project_Tree); end if; end Delete_All_Temp_Files; @@ -3167,18 +3199,24 @@ package body Make is Success : Boolean; begin if (not Debug.Debug_Flag_N) and Main_Project /= No_Project then - for Project in 1 .. Projects.Last loop - if Projects.Table (Project).Config_File_Temp then + for Project in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop + if + Project_Tree.Projects.Table (Project).Config_File_Temp + then if Verbose_Mode then Write_Str ("Deleting temp configuration file """); Write_Str (Get_Name_String - (Projects.Table (Project).Config_File_Name)); + (Project_Tree.Projects.Table + (Project).Config_File_Name)); Write_Line (""""); end if; Delete_File (Name => Get_Name_String - (Projects.Table (Project).Config_File_Name), + (Project_Tree.Projects.Table + (Project).Config_File_Name), Success => Success); -- Make sure that we don't have a config file for this @@ -3186,9 +3224,12 @@ package body Make is -- In this case, we will recreate another config file: -- we cannot reuse the one that we just deleted! - Projects.Table (Project).Config_Checked := False; - Projects.Table (Project).Config_File_Name := No_Name; - Projects.Table (Project).Config_File_Temp := False; + Project_Tree.Projects.Table (Project). + Config_Checked := False; + Project_Tree.Projects.Table (Project). + Config_File_Name := No_Name; + Project_Tree.Projects.Table (Project). + Config_File_Temp := False; end if; end loop; end if; @@ -3446,7 +3487,8 @@ package body Make is -- Get the project of the current main - Proj := Prj.Env.Project_Of (File_Name, Main_Project); + Proj := Prj.Env.Project_Of + (File_Name, Main_Project, Project_Tree); -- Fail if the current main is not a source of a -- project. @@ -3462,7 +3504,8 @@ package body Make is -- is the actual path of a source of a project. if Main /= File_Name then - Data := Projects.Table (Main_Project); + Data := + Project_Tree.Projects.Table (Main_Project); Real_Path := Locate_Regular_File @@ -3496,6 +3539,7 @@ package body Make is Prj.Env.File_Name_Of_Library_Unit_Body (Name => File_Name, Project => Main_Project, + In_Tree => Project_Tree, Main_Project_Only => False, Full_Path => True); Normed_Path : constant String := @@ -3542,7 +3586,7 @@ package body Make is ("""" & Main & """ is not a source of project " & Get_Name_String - (Projects.Table + (Project_Tree.Projects.Table (Real_Main_Project).Name)); end if; end if; @@ -3591,12 +3635,12 @@ package body Make is -- Traverse all units - for J in Prj.Com.Units.First .. Prj.Com.Units.Last loop + for J in Unit_Table.First .. + Unit_Table.Last (Project_Tree.Units) + loop declare - Unit : constant Prj.Com.Unit_Data := - Prj.Com.Units.Table (J); - use Prj.Com; - + Unit : constant Unit_Data := + Project_Tree.Units.Table (J); begin if Unit.Name /= No_Name then @@ -3650,9 +3694,11 @@ package body Make is if ALI_Name /= No_Name and then - Projects.Table (ALI_Project).Extended_By = No_Project + Project_Tree.Projects.Table + (ALI_Project).Extended_By = No_Project and then - Projects.Table (ALI_Project).Extends = No_Project + Project_Tree.Projects.Table + (ALI_Project).Extends = No_Project then -- First line is the unit name @@ -3691,8 +3737,8 @@ package body Make is Get_Name_String (ALI_Name); begin Get_Name_String - (Projects.Table (ALI_Project). - Object_Directory); + (Project_Tree.Projects.Table + (ALI_Project).Object_Directory); if Name_Buffer (Name_Len) /= Directory_Separator @@ -3792,7 +3838,7 @@ package body Make is -- And the project file cannot be a library project file - elsif Projects.Table (Main_Project).Library then + elsif Project_Tree.Projects.Table (Main_Project).Library then Make_Failed ("-B cannot be used for a library project file"); else @@ -3832,7 +3878,7 @@ package body Make is -- cannot be specified on the command line. if Osint.Number_Of_Files /= 0 then - if Projects.Table (Main_Project).Library + if Project_Tree.Projects.Table (Main_Project).Library and then not Unique_Compile and then ((not Make_Steps) or else Bind_Only or else Link_Only) then @@ -3859,7 +3905,8 @@ package body Make is end if; declare - Value : String_List_Id := Projects.Table (Main_Project).Mains; + Value : String_List_Id := + Project_Tree.Projects.Table (Main_Project).Mains; begin -- The attribute Main is an empty list or not specified, @@ -3868,7 +3915,8 @@ package body Make is if Value = Prj.Nil_String or else Unique_Compile then if (not Make_Steps) or else Compile_Only - or else not Projects.Table (Main_Project).Library + or else not Project_Tree.Projects.Table + (Main_Project).Library then -- First make sure that the binder and the linker -- will not be invoked. @@ -3900,11 +3948,13 @@ package body Make is declare Data : constant Project_Data := - Projects.Table (Main_Project); + Project_Tree.Projects.Table (Main_Project); Languages : constant Variable_Value := Prj.Util.Value_Of - (Name_Languages, Data.Decl.Attributes); + (Name_Languages, + Data.Decl.Attributes, + Project_Tree); Current : String_List_Id; Element : String_Element; @@ -3921,7 +3971,8 @@ package body Make is Look_For_Foreign : while Current /= Nil_String loop - Element := String_Elements.Table (Current); + Element := Project_Tree.String_Elements. + Table (Current); Get_Name_String (Element.Value); To_Lower (Name_Buffer (1 .. Name_Len)); @@ -3938,7 +3989,9 @@ package body Make is -- language, all the Ada mains. while Value /= Prj.Nil_String loop - Get_Name_String (String_Elements.Table (Value).Value); + Get_Name_String + (Project_Tree.String_Elements.Table + (Value).Value); -- To know if a main is an Ada main, get its project. -- It should be the project specified on the command @@ -3946,17 +3999,23 @@ package body Make is if (not Foreign_Language) or else Prj.Env.Project_Of - (Name_Buffer (1 .. Name_Len), Main_Project) = + (Name_Buffer (1 .. Name_Len), + Main_Project, + Project_Tree) = Main_Project then At_Least_One_Main := True; Osint.Add_File (Get_Name_String - (String_Elements.Table (Value).Value), - Index => String_Elements.Table (Value).Index); + (Project_Tree.String_Elements.Table + (Value).Value), + Index => + Project_Tree.String_Elements.Table + (Value).Index); end if; - Value := String_Elements.Table (Value).Next; + Value := Project_Tree.String_Elements.Table + (Value).Next; end loop; -- If we did not get any main, it means that all mains @@ -3984,7 +4043,8 @@ package body Make is end if; if Main_Project /= No_Project - and then Projects.Table (Main_Project).Externally_Built + and then Project_Tree.Projects.Table + (Main_Project).Externally_Built then Make_Failed ("nothing to do for a main project that is externally built"); @@ -3992,10 +4052,11 @@ package body Make is if Osint.Number_Of_Files = 0 then if Main_Project /= No_Project - and then Projects.Table (Main_Project).Library + and then Project_Tree.Projects.Table (Main_Project).Library then if Do_Bind_Step - and then not Projects.Table (Main_Project).Standalone_Library + and then not Project_Tree.Projects.Table + (Main_Project).Standalone_Library then Make_Failed ("only stand-alone libraries may be bound"); end if; @@ -4008,6 +4069,7 @@ package body Make is MLib.Prj.Build_Library (For_Project => Main_Project, + In_Tree => Project_Tree, Gnatbind => Gnatbind.all, Gnatbind_Path => Gnatbind_Path, Gcc => Gcc.all, @@ -4079,10 +4141,10 @@ package body Make is if Main_Project /= No_Project then - if Projects.Table (Main_Project).Object_Directory /= No_Name then - - -- Change the current directory to the object directory of - -- the main project. + if Project_Tree.Projects.Table + (Main_Project).Object_Directory /= No_Name + then + -- Change current directory to object directory of main project begin Project_Object_Directory := No_Project; @@ -4098,7 +4160,7 @@ package body Make is Parent : constant Dir_Name_Str := Dir_Name (Get_Name_String - (Projects.Table + (Project_Tree.Projects.Table (Main_Project).Object_Directory)); Dir : Dir_Type; @@ -4134,7 +4196,8 @@ package body Make is Make_Failed ("unable to change working directory to """, Get_Name_String - (Projects.Table (Main_Project).Object_Directory), + (Project_Tree.Projects.Table + (Main_Project).Object_Directory), """"); end; end if; @@ -4153,26 +4216,30 @@ package body Make is Prj.Env.File_Name_Of_Library_Unit_Body (Name => Main_Source_File_Name, Project => Main_Project, + In_Tree => Project_Tree, Main_Project_Only => not Unique_Compile); The_Packages : constant Package_Id := - Projects.Table (Main_Project).Decl.Packages; + Project_Tree.Projects.Table (Main_Project).Decl.Packages; Builder_Package : constant Prj.Package_Id := Prj.Util.Value_Of (Name => Name_Builder, - In_Packages => The_Packages); + In_Packages => The_Packages, + In_Tree => Project_Tree); Binder_Package : constant Prj.Package_Id := Prj.Util.Value_Of (Name => Name_Binder, - In_Packages => The_Packages); + In_Packages => The_Packages, + In_Tree => Project_Tree); Linker_Package : constant Prj.Package_Id := Prj.Util.Value_Of - (Name => Name_Linker, - In_Packages => The_Packages); + (Name => Name_Linker, + In_Packages => The_Packages, + In_Tree => Project_Tree); begin -- We fail if we cannot find the main source file @@ -4250,13 +4317,16 @@ package body Make is (Name => Name_Ada, Index => 0, Attribute_Or_Array_Name => Name_Default_Switches, - In_Package => Builder_Package); + In_Package => Builder_Package, + In_Tree => Project_Tree); Switches : constant Array_Element_Id := Prj.Util.Value_Of (Name => Name_Switches, In_Arrays => - Packages.Table (Builder_Package).Decl.Arrays); + Project_Tree.Packages.Table + (Builder_Package).Decl.Arrays, + In_Tree => Project_Tree); begin if Defaults /= Nil_Variable_Value then @@ -4359,30 +4429,41 @@ package body Make is if not Unique_Compile and then MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None then - for Proj in Projects.First .. Projects.Last loop - if Projects.Table (Proj).Library then - Projects.Table (Proj).Need_To_Build_Lib := - (not MLib.Tgt.Library_Exists_For (Proj)) - and then (not Projects.Table (Proj).Externally_Built); - - if Projects.Table (Proj).Need_To_Build_Lib then - + for Proj in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop + if Project_Tree.Projects.Table (Proj).Library then + Project_Tree.Projects.Table + (Proj).Need_To_Build_Lib := + (not MLib.Tgt.Library_Exists_For (Proj, Project_Tree)) + and then (not Project_Tree.Projects.Table + (Proj).Externally_Built); + + if Project_Tree.Projects.Table + (Proj).Need_To_Build_Lib + then -- If there is no object directory, then it will be -- impossible to build the library. So fail immediately. - if Projects.Table (Proj).Object_Directory = No_Name then + if Project_Tree.Projects.Table + (Proj).Object_Directory = No_Name + then Make_Failed ("no object files to build library for project """, - Get_Name_String (Projects.Table (Proj).Name), + Get_Name_String + (Project_Tree.Projects.Table (Proj).Name), """"); - Projects.Table (Proj).Need_To_Build_Lib := False; + Project_Tree.Projects.Table + (Proj).Need_To_Build_Lib := False; else if Verbose_Mode then Write_Str ("Library file does not exist for project """); Write_Str - (Get_Name_String (Projects.Table (Proj).Name)); + (Get_Name_String + (Project_Tree.Projects.Table + (Proj).Name)); Write_Line (""""); end if; @@ -4416,8 +4497,9 @@ package body Make is end if; end loop; - Get_Name_String (Projects.Table - (Main_Project).Exec_Directory); + Get_Name_String + (Project_Tree.Projects.Table + (Main_Project).Exec_Directory); if Name_Buffer (Name_Len) /= Directory_Separator then Name_Len := Name_Len + 1; @@ -4445,7 +4527,8 @@ package body Make is declare Dir_Path : constant String_Access := new String'(Get_Name_String - (Projects.Table (Main_Project).Directory)); + (Project_Tree.Projects.Table + (Main_Project).Directory)); begin for J in 1 .. Binder_Switches.Last loop Test_If_Relative_Path @@ -4481,10 +4564,10 @@ package body Make is end; end if; - -- We now put in the Binder_Switches and Linker_Switches tables, - -- the binder and linker switches of the command line that have been - -- put in the Saved_ tables. If a project file was used, then the - -- command line switches will follow the project file switches. + -- We now put in the Binder_Switches and Linker_Switches tables, the + -- binder and linker switches of the command line that have been put in + -- the Saved_ tables. If a project file was used, then the command line + -- switches will follow the project file switches. for J in 1 .. Saved_Binder_Switches.Last loop Add_Switch @@ -4563,15 +4646,20 @@ package body Make is The_Mapping_File_Names := new Temp_File_Names - (No_Project .. Projects.Last, 1 .. Saved_Maximum_Processes); + (No_Project .. Project_Table.Last (Project_Tree.Projects), + 1 .. Saved_Maximum_Processes); Last_Mapping_File_Names := - new Indices'(No_Project .. Projects.Last => 0); + new Indices' + (No_Project .. Project_Table.Last (Project_Tree.Projects) + => 0); The_Free_Mapping_File_Indices := new Free_File_Indices - (No_Project .. Projects.Last, 1 .. Saved_Maximum_Processes); + (No_Project .. Project_Table.Last (Project_Tree.Projects), + 1 .. Saved_Maximum_Processes); Last_Free_Indices := - new Indices'(No_Project .. Projects.Last => 0); + new Indices'(No_Project .. Project_Table.Last + (Project_Tree.Projects) => 0); Bad_Compilation.Init; @@ -4632,8 +4720,9 @@ package body Make is -- executable "main.2" for a main subprogram -- "main.2.ada", when the body termination is ".2.ada". - Executable := Prj.Util.Executable_Of - (Main_Project, Main_Source_File, Main_Index); + Executable := + Prj.Util.Executable_Of + (Main_Project, Project_Tree, Main_Source_File, Main_Index); end if; end if; @@ -4653,7 +4742,7 @@ package body Make is end if; end loop; - Get_Name_String (Projects.Table + Get_Name_String (Project_Tree.Projects.Table (Main_Project).Exec_Directory); if @@ -4752,23 +4841,31 @@ package body Make is -- Put in Library_Projs table all library project -- file ids when the library need to be rebuilt. - for Proj1 in Projects.First .. Projects.Last loop - - if Projects.Table (Proj1).Standalone_Library then + for Proj1 in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop + if Project_Tree.Projects.Table + (Proj1).Standalone_Library + then There_Are_Stand_Alone_Libraries := True; end if; - if Projects.Table (Proj1).Library - and then not Projects.Table (Proj1).Need_To_Build_Lib - and then not Projects.Table (Proj1).Externally_Built + if Project_Tree.Projects.Table (Proj1).Library + and then not Project_Tree.Projects.Table + (Proj1).Need_To_Build_Lib + and then not Project_Tree.Projects.Table + (Proj1).Externally_Built then - MLib.Prj.Check_Library (Proj1); + MLib.Prj.Check_Library (Proj1, Project_Tree); end if; - if Projects.Table (Proj1).Need_To_Build_Lib then + if Project_Tree.Projects.Table + (Proj1).Need_To_Build_Lib + then Library_Projs.Increment_Last; Current := Library_Projs.Last; - Depth := Projects.Table (Proj1).Depth; + Depth := Project_Tree.Projects.Table + (Proj1).Depth; -- Put the projects in decreasing depth order, -- so that if libA depends on libB, libB is first @@ -4776,13 +4873,15 @@ package body Make is while Current > 1 loop Proj2 := Library_Projs.Table (Current - 1); - exit when Projects.Table (Proj2).Depth >= Depth; + exit when Project_Tree.Projects.Table + (Proj2).Depth >= Depth; Library_Projs.Table (Current) := Proj2; Current := Current - 1; end loop; Library_Projs.Table (Current) := Proj1; - Projects.Table (Proj1).Need_To_Build_Lib := False; + Project_Tree.Projects.Table + (Proj1).Need_To_Build_Lib := False; end if; end loop; end; @@ -4793,6 +4892,7 @@ package body Make is Library_Rebuilt := True; MLib.Prj.Build_Library (For_Project => Library_Projs.Table (J), + In_Tree => Project_Tree, Gnatbind => Gnatbind.all, Gnatbind_Path => Gnatbind_Path, Gcc => Gcc.all, @@ -4994,9 +5094,12 @@ package body Make is if Main_Project /= No_Project and then MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None then - for Proj in Projects.First .. Projects.Last loop - if Projects.Table (Proj).Library and then - Projects.Table (Proj).Library_Kind /= Static + for Proj in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop + if Project_Tree.Projects.Table (Proj).Library + and then Project_Tree.Projects.Table + (Proj).Library_Kind /= Static then Shared_Libs := True; Bind_Shared := Shared_Switch'Access; @@ -5039,7 +5142,7 @@ package body Make is -- Put all the source directories in ADA_INCLUDE_PATH, -- and all the object directories in ADA_OBJECTS_PATH - Prj.Env.Set_Ada_Paths (Main_Project, False); + Prj.Env.Set_Ada_Paths (Main_Project, Project_Tree, False); -- If switch -C was specified, create a binder mapping file @@ -5103,14 +5206,18 @@ package body Make is if MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None then -- Check for library projects - for Proj1 in 1 .. Projects.Last loop + for Proj1 in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop if Proj1 /= Main_Project - and then Projects.Table (Proj1).Library + and then + Project_Tree.Projects.Table (Proj1).Library then -- Add this project to table Library_Projs There_Are_Libraries := True; - Depth := Projects.Table (Proj1).Depth; + Depth := + Project_Tree.Projects.Table (Proj1).Depth; Library_Projs.Increment_Last; Current := Library_Projs.Last; @@ -5119,7 +5226,8 @@ package body Make is while Current > 1 loop Proj2 := Library_Projs.Table (Current - 1); - exit when Projects.Table (Proj2).Depth <= Depth; + exit when Project_Tree.Projects.Table + (Proj2).Depth <= Depth; Library_Projs.Table (Current) := Proj2; Current := Current - 1; end loop; @@ -5129,14 +5237,16 @@ package body Make is -- If it is not a static library and path option -- is set, add it to the Library_Paths table. - if Projects.Table (Proj1).Library_Kind /= Static + if Project_Tree.Projects.Table + (Proj1).Library_Kind /= Static and then Path_Option /= null then Library_Paths.Increment_Last; Library_Paths.Table (Library_Paths.Last) := new String' (Get_Name_String - (Projects.Table (Proj1).Library_Dir)); + (Project_Tree.Projects.Table + (Proj1).Library_Dir)); end if; end if; end loop; @@ -5148,7 +5258,7 @@ package body Make is Linker_Switches.Table (Linker_Switches.Last) := new String'("-L" & Get_Name_String - (Projects.Table + (Project_Tree.Projects.Table (Library_Projs.Table (Index)). Library_Dir)); @@ -5158,7 +5268,7 @@ package body Make is Linker_Switches.Table (Linker_Switches.Last) := new String'("-l" & Get_Name_String - (Projects.Table + (Project_Tree.Projects.Table (Library_Projs.Table (Index)). Library_Name)); end loop; @@ -5233,15 +5343,15 @@ package body Make is -- Put the object directories in ADA_OBJECTS_PATH - Prj.Env.Set_Ada_Paths (Main_Project, False); + Prj.Env.Set_Ada_Paths (Main_Project, Project_Tree, False); -- Check for attributes Linker'Linker_Options in projects -- other than the main project declare Linker_Options : constant String_List := - Linker_Options_Switches (Main_Project); - + Linker_Options_Switches + (Main_Project, Project_Tree); begin for Option in Linker_Options'Range loop Linker_Switches.Increment_Last; @@ -5340,21 +5450,25 @@ package body Make is File_Name_Of_Library_Unit_Body (Name => Main_Source_File_Name, Project => Main_Project, + In_Tree => Project_Tree, Main_Project_Only => not Unique_Compile); The_Packages : constant Package_Id := - Projects.Table (Main_Project).Decl.Packages; + Project_Tree.Projects.Table + (Main_Project).Decl.Packages; Binder_Package : constant Prj.Package_Id := Prj.Util.Value_Of (Name => Name_Binder, - In_Packages => The_Packages); + In_Packages => The_Packages, + In_Tree => Project_Tree); Linker_Package : constant Prj.Package_Id := Prj.Util.Value_Of - (Name => Name_Linker, - In_Packages => The_Packages); + (Name => Name_Linker, + In_Packages => The_Packages, + In_Tree => Project_Tree); begin -- We fail if we cannot find the main source file @@ -5442,7 +5556,8 @@ package body Make is declare Dir_Path : constant String_Access := new String'(Get_Name_String - (Projects.Table (Main_Project).Directory)); + (Project_Tree.Projects.Table + (Main_Project).Directory)); begin for J in Last_Binder_Switch + 1 .. Binder_Switches.Last @@ -5516,7 +5631,7 @@ package body Make is if not Debug.Debug_Flag_N then Delete_Mapping_Files; - Prj.Env.Delete_All_Path_Files; + Prj.Env.Delete_All_Path_Files (Project_Tree); end if; Exit_Program (E_Success); @@ -5528,7 +5643,7 @@ package body Make is when Compilation_Failed => if not Debug.Debug_Flag_N then Delete_Mapping_Files; - Prj.Env.Delete_All_Path_Files; + Prj.Env.Delete_All_Path_Files (Project_Tree); end if; Exit_Program (E_Fatal); @@ -5605,7 +5720,7 @@ package body Make is if Project /= No_Project then Prj.Env.Create_Mapping_File - (Project, + (Project, Project_Tree, The_Mapping_File_Names (Project, Last_Mapping_File_Names (Project))); @@ -5669,7 +5784,7 @@ package body Make is Snames.Initialize; - Prj.Initialize; + Prj.Initialize (Project_Tree); Dependencies.Init; @@ -5789,6 +5904,7 @@ package body Make is Prj.Pars.Parse (Project => Main_Project, + In_Tree => Project_Tree, Project_File_Name => Project_File_Name.all, Packages_To_Check => Packages_To_Check_By_Gnatmake); @@ -5807,14 +5923,16 @@ package body Make is -- We add the source directories and the object directories -- to the search paths. - Add_Source_Directories (Main_Project); - Add_Object_Directories (Main_Project); + Add_Source_Directories (Main_Project, Project_Tree); + Add_Object_Directories (Main_Project, Project_Tree); -- Compute depth of each project - for Proj in 1 .. Projects.Last loop - Projects.Table (Proj).Seen := False; - Projects.Table (Proj).Depth := 0; + for Proj in Project_Table.First .. + Project_Table.Last (Project_Tree.Projects) + loop + Project_Tree.Projects.Table (Proj).Seen := False; + Project_Tree.Projects.Table (Proj).Depth := 0; end loop; Recursive_Compute_Depth @@ -5860,11 +5978,12 @@ package body Make is Into_Q : Boolean) is Put_In_Q : Boolean := Into_Q; - Unit : Com.Unit_Data; + Unit : Unit_Data; Sfile : Name_Id; Extending : constant Boolean := - Projects.Table (The_Project).Extends /= No_Project; + Project_Tree.Projects.Table + (The_Project).Extends /= No_Project; function Check_Project (P : Project_Id) return Boolean; -- Returns True if P is The_Project or a project extended by @@ -5880,7 +5999,8 @@ package body Make is return True; elsif Extending then declare - Data : Project_Data := Projects.Table (The_Project); + Data : Project_Data := + Project_Tree.Projects.Table (The_Project); begin loop @@ -5888,7 +6008,7 @@ package body Make is return True; end if; - Data := Projects.Table (Data.Extends); + Data := Project_Tree.Projects.Table (Data.Extends); exit when Data.Extends = No_Project; end loop; end; @@ -5897,30 +6017,31 @@ package body Make is return False; end Check_Project; - -- Start of processing of Insert_Project_Sources + -- Start of processing for Insert_Project_Sources begin -- For all the sources in the project files, - for Id in Com.Units.First .. Com.Units.Last loop - Unit := Com.Units.Table (Id); + for Id in Unit_Table.First .. + Unit_Table.Last (Project_Tree.Units) + loop + Unit := Project_Tree.Units.Table (Id); Sfile := No_Name; -- If there is a source for the body, and the body has not been -- locally removed, - if Unit.File_Names (Com.Body_Part).Name /= No_Name - and then Unit.File_Names (Com.Body_Part).Path /= Slash + if Unit.File_Names (Body_Part).Name /= No_Name + and then Unit.File_Names (Body_Part).Path /= Slash then - -- And it is a source for the specified project - if Check_Project (Unit.File_Names (Com.Body_Part).Project) then + if Check_Project (Unit.File_Names (Body_Part).Project) then -- If we don't have a spec, we cannot consider the source -- if it is a subunit - if Unit.File_Names (Com.Specification).Name = No_Name then + if Unit.File_Names (Specification).Name = No_Name then declare Src_Ind : Source_File_Index; @@ -5937,7 +6058,7 @@ package body Make is begin Src_Ind := Sinput.P.Load_Project_File (Get_Name_String - (Unit.File_Names (Com.Body_Part).Path)); + (Unit.File_Names (Body_Part).Path)); -- If it is a subunit, discard it @@ -5945,24 +6066,24 @@ package body Make is Sfile := No_Name; else - Sfile := Unit.File_Names (Com.Body_Part).Name; + Sfile := Unit.File_Names (Body_Part).Name; end if; end; else - Sfile := Unit.File_Names (Com.Body_Part).Name; + Sfile := Unit.File_Names (Body_Part).Name; end if; end if; - elsif Unit.File_Names (Com.Specification).Name /= No_Name - and then Unit.File_Names (Com.Specification).Path /= Slash - and then Check_Project (Unit.File_Names (Com.Specification).Project) + elsif Unit.File_Names (Specification).Name /= No_Name + and then Unit.File_Names (Specification).Path /= Slash + and then Check_Project (Unit.File_Names (Specification).Project) then -- If there is no source for the body, but there is a source -- for the spec which has not been locally removed, then we take -- this one. - Sfile := Unit.File_Names (Com.Specification).Name; + Sfile := Unit.File_Names (Specification).Name; end if; -- If Put_In_Q is True, we insert into the Q @@ -6090,7 +6211,7 @@ package body Make is declare Source_File_Name : constant String := Get_Name_String (Source_File); - Saved_Verbosity : constant Verbosity := Prj.Com.Current_Verbosity; + Saved_Verbosity : constant Verbosity := Current_Verbosity; Project : Project_Id := No_Project; Path_Name : Name_Id := No_Name; Data : Project_Data; @@ -6100,13 +6221,14 @@ package body Make is -- the source. Call it with verbosity default to avoid verbose -- messages. - Prj.Com.Current_Verbosity := Default; + Current_Verbosity := Default; Prj.Env. Get_Reference (Source_File_Name => Source_File_Name, Project => Project, + In_Tree => Project_Tree, Path => Path_Name); - Prj.Com.Current_Verbosity := Saved_Verbosity; + Current_Verbosity := Saved_Verbosity; -- If this source is in a project, check that the ALI file is -- in its object directory. If it is not, return False, so that @@ -6116,9 +6238,10 @@ package body Make is -- the general case and return True at the end of the function. if Project /= No_Project - and then Projects.Table (Project).Extends /= No_Project + and then Project_Tree.Projects.Table + (Project).Extends /= No_Project then - Data := Projects.Table (Project); + Data := Project_Tree.Projects.Table (Project); declare Object_Directory : constant String := @@ -6328,26 +6451,26 @@ package body Make is -- been seen or if the depth is large enough. if Project = No_Project - or else Projects.Table (Project).Seen - or else Projects.Table (Project).Depth >= Depth + or else Project_Tree.Projects.Table (Project).Seen + or else Project_Tree.Projects.Table (Project).Depth >= Depth then return; end if; - Projects.Table (Project).Depth := Depth; + Project_Tree.Projects.Table (Project).Depth := Depth; -- Mark the project as Seen to avoid endless loop caused by limited -- withs. - Projects.Table (Project).Seen := True; + Project_Tree.Projects.Table (Project).Seen := True; - List := Projects.Table (Project).Imported_Projects; + List := Project_Tree.Projects.Table (Project).Imported_Projects; -- Visit each imported project while List /= Empty_Project_List loop - Proj := Project_Lists.Table (List).Project; - List := Project_Lists.Table (List).Next; + Proj := Project_Tree.Project_Lists.Table (List).Project; + List := Project_Tree.Project_Lists.Table (List).Next; Recursive_Compute_Depth (Project => Proj, Depth => Depth + 1); @@ -6356,12 +6479,12 @@ package body Make is -- Visit a project being extended, if any Recursive_Compute_Depth - (Project => Projects.Table (Project).Extends, + (Project => Project_Tree.Projects.Table (Project).Extends, Depth => Depth + 1); -- Reset the Seen flag, as we leave this project - Projects.Table (Project).Seen := False; + Project_Tree.Projects.Table (Project).Seen := False; end Recursive_Compute_Depth; ----------------------- @@ -6976,20 +7099,25 @@ package body Make is Prj.Util.Value_Of (Name => Name_Default_Switches, In_Arrays => - Packages.Table (In_Package).Decl.Arrays); + Project_Tree.Packages.Table + (In_Package).Decl.Arrays, + In_Tree => Project_Tree); Switches_Array : constant Array_Element_Id := Prj.Util.Value_Of (Name => Name_Switches, In_Arrays => - Packages.Table (In_Package).Decl.Arrays); + Project_Tree.Packages.Table + (In_Package).Decl.Arrays, + In_Tree => Project_Tree); begin Switches := Prj.Util.Value_Of (Index => Source_File, Src_Index => Source_Index, - In_Array => Switches_Array); + In_Array => Switches_Array, + In_Tree => Project_Tree); if Switches = Nil_Variable_Value then declare @@ -7028,7 +7156,8 @@ package body Make is Prj.Util.Value_Of (Index => Name_Find, Src_Index => 0, - In_Array => Switches_Array); + In_Array => Switches_Array, + In_Tree => Project_Tree); if Switches = Nil_Variable_Value and then Allow_ALI @@ -7046,7 +7175,8 @@ package body Make is Prj.Util.Value_Of (Index => Name_Find, Src_Index => 0, - In_Array => Switches_Array); + In_Array => Switches_Array, + In_Tree => Project_Tree); end if; end if; end; @@ -7057,7 +7187,8 @@ package body Make is Prj.Util.Value_Of (Index => Name_Ada, Src_Index => 0, - In_Array => Defaults); + In_Array => Defaults, + In_Tree => Project_Tree); end if; return Switches; |