Project dependencies are needed in various cases, for instance because
the linker needs to find all the list of non-Ada objects when building
a global archive in gprbuild. But these project dependencies need to be
explicitly computed initially, and this wasn't done for aggregated
projects.
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-08-29 Emmanuel Briot <[email protected]>
* make.adb, prj.adb, prj.ads (Compute_All_Imported_Projects): Also
initialize aggregated projects.
Index: make.adb
===================================================================
--- make.adb (revision 178199)
+++ make.adb (working copy)
@@ -6621,7 +6621,7 @@
Add_Object_Directories (Main_Project, Project_Tree);
Recursive_Compute_Depth (Main_Project);
- Compute_All_Imported_Projects (Project_Tree);
+ Compute_All_Imported_Projects (Main_Project, Project_Tree);
else
Index: prj.adb
===================================================================
--- prj.adb (revision 178179)
+++ prj.adb (working copy)
@@ -1283,72 +1283,97 @@
-- Compute_All_Imported_Projects --
-----------------------------------
- procedure Compute_All_Imported_Projects (Tree : Project_Tree_Ref) is
- Project : Project_Id;
+ procedure Compute_All_Imported_Projects
+ (Root_Project : Project_Id;
+ Tree : Project_Tree_Ref)
+ is
+ procedure Analyze_Tree
+ (Local_Root : Project_Id; Local_Tree : Project_Tree_Ref);
+ -- Process Project and all its aggregated project to analyze their own
+ -- imported projects.
- procedure Recursive_Add
- (Prj : Project_Id;
- Tree : Project_Tree_Ref;
- Dummy : in out Boolean);
- -- Recursively add the projects imported by project Project, but not
- -- those that are extended.
+ ------------------
+ -- Analyze_Tree --
+ ------------------
- -------------------
- -- Recursive_Add --
- -------------------
-
- procedure Recursive_Add
- (Prj : Project_Id;
- Tree : Project_Tree_Ref;
- Dummy : in out Boolean)
+ procedure Analyze_Tree
+ (Local_Root : Project_Id; Local_Tree : Project_Tree_Ref)
is
- pragma Unreferenced (Dummy, Tree);
- List : Project_List;
- Prj2 : Project_Id;
+ pragma Unreferenced (Local_Root);
- begin
- -- A project is not importing itself
+ Project : Project_Id;
- Prj2 := Ultimate_Extending_Project_Of (Prj);
+ procedure Recursive_Add
+ (Prj : Project_Id;
+ Tree : Project_Tree_Ref;
+ Dummy : in out Boolean);
+ -- Recursively add the projects imported by project Project, but not
+ -- those that are extended.
- if Project /= Prj2 then
+ -------------------
+ -- Recursive_Add --
+ -------------------
- -- Check that the project is not already in the list. We know the
- -- one passed to Recursive_Add have never been visited before, but
- -- the one passed it are the extended projects.
+ procedure Recursive_Add
+ (Prj : Project_Id;
+ Tree : Project_Tree_Ref;
+ Dummy : in out Boolean)
+ is
+ pragma Unreferenced (Dummy, Tree);
+ List : Project_List;
+ Prj2 : Project_Id;
- List := Project.All_Imported_Projects;
- while List /= null loop
- if List.Project = Prj2 then
- return;
- end if;
+ begin
+ -- A project is not importing itself
- List := List.Next;
- end loop;
+ Prj2 := Ultimate_Extending_Project_Of (Prj);
- -- Add it to the list
+ if Project /= Prj2 then
- Project.All_Imported_Projects :=
- new Project_List_Element'
- (Project => Prj2,
- Next => Project.All_Imported_Projects);
- end if;
- end Recursive_Add;
+ -- Check that the project is not already in the list. We know
+ -- the one passed to Recursive_Add have never been visited
+ -- before, but the one passed it are the extended projects.
- procedure For_All_Projects is
- new For_Every_Project_Imported (Boolean, Recursive_Add);
+ List := Project.All_Imported_Projects;
+ while List /= null loop
+ if List.Project = Prj2 then
+ return;
+ end if;
- Dummy : Boolean := False;
- List : Project_List;
+ List := List.Next;
+ end loop;
+ -- Add it to the list
+
+ Project.All_Imported_Projects :=
+ new Project_List_Element'
+ (Project => Prj2,
+ Next => Project.All_Imported_Projects);
+ end if;
+ end Recursive_Add;
+
+ procedure For_All_Projects is
+ new For_Every_Project_Imported (Boolean, Recursive_Add);
+
+ Dummy : Boolean := False;
+ List : Project_List;
+ begin
+ List := Local_Tree.Projects;
+ while List /= null loop
+ Project := List.Project;
+ Free_List
+ (Project.All_Imported_Projects, Free_Project => False);
+ For_All_Projects
+ (Project, Local_Tree, Dummy, Include_Aggregated => False);
+ List := List.Next;
+ end loop;
+ end Analyze_Tree;
+
+ procedure For_Aggregates is
+ new For_Project_And_Aggregated (Analyze_Tree);
+
begin
- List := Tree.Projects;
- while List /= null loop
- Project := List.Project;
- Free_List (Project.All_Imported_Projects, Free_Project => False);
- For_All_Projects (Project, Tree, Dummy, Include_Aggregated => False);
- List := List.Next;
- end loop;
+ For_Aggregates (Root_Project, Tree);
end Compute_All_Imported_Projects;
-------------------
Index: prj.ads
===================================================================
--- prj.ads (revision 178179)
+++ prj.ads (working copy)
@@ -909,9 +909,11 @@
-- If Only_If_Ada is True, then No_Name will be returned when the project
-- doesn't Ada sources.
- procedure Compute_All_Imported_Projects (Tree : Project_Tree_Ref);
+ procedure Compute_All_Imported_Projects
+ (Root_Project : Project_Id;
+ Tree : Project_Tree_Ref);
-- For all projects in the tree, compute the list of the projects imported
- -- directly or indirectly by project Project. The result is stored in
+ -- directly or indirectly by project Root_Project. The result is stored in
-- Project.All_Imported_Projects for each project
function Ultimate_Extending_Project_Of