Function Prj.Env.Ada_Objects_Path was no conform to its documentation, in particular, the second call was returning the same value even if parameter Including_Libraries was different. This patch corrects this.
Tested on x86_64-pc-linux-gnu, committed on trunk 2014-01-24 Vincent Celier <cel...@adacore.com> * prj-env.adb (Ada_Objects_Path): Use Ada_Objects_Path_No_Libs to cache the result when Including_Libraries is False. * prj-env.ads (Ada_Objects_Path): Update documentation * prj.adb (Free (Project_Id)): Also free Ada_Objects_Path_No_Libs (Get_Object_Directory): Return the Library_Ali_Dir only when when Including_Libraries is True. * prj.ads (Get_Object_Directory): Fix and complete documentation (Project_Data): New component Ada_Objects_Path_No_Libs
Index: prj.adb =================================================================== --- prj.adb (revision 207034) +++ prj.adb (working copy) @@ -1105,6 +1105,7 @@ Free (Project.Ada_Include_Path); Free (Project.Objects_Path); Free (Project.Ada_Objects_Path); + Free (Project.Ada_Objects_Path_No_Libs); Free_List (Project.Imported_Projects, Free_Project => False); Free_List (Project.All_Imported_Projects, Free_Project => False); Free_List (Project.Languages); @@ -1485,7 +1486,10 @@ if Project.Library then if Project.Object_Directory = No_Path_Information - or else Contains_ALI_Files (Project.Library_ALI_Dir.Display_Name) + or else + (Including_Libraries + and then + Contains_ALI_Files (Project.Library_ALI_Dir.Display_Name)) then return Project.Library_ALI_Dir.Display_Name; else Index: prj.ads =================================================================== --- prj.ads (revision 207026) +++ prj.ads (working copy) @@ -973,11 +973,12 @@ Only_If_Ada : Boolean := False) return Path_Name_Type; -- Return the object directory to use for the project. This depends on -- whether we have a library project or a standard project. This function - -- might return No_Name when no directory applies. - -- If we have a library project file and Including_Libraries is True then - -- the library dir is returned instead of the object dir. - -- If Only_If_Ada is True, then No_Name will be returned when the project - -- doesn't Ada sources. + -- might return No_Name when no directory applies. If the project is a + -- library project file and Including_Libraries is True then the library + -- ALI dir is returned instead of the object dir, except when there is no + -- ALI files in the Library ALI dir and the object directory exists. If + -- Only_If_Ada is True, then No_Name is returned when the project doesn't + -- include any Ada source. procedure Compute_All_Imported_Projects (Root_Project : Project_Id; @@ -1400,10 +1401,15 @@ ------------------- Ada_Objects_Path : String_Access := null; - -- The cached value of ADA_OBJECTS_PATH for this project file. Do not - -- use this field directly outside of the compiler, use - -- Prj.Env.Ada_Objects_Path instead. + -- The cached value of ADA_OBJECTS_PATH for this project file, with + -- library ALI directories for library projects instead of object + -- directories. Do not use this field directly outside of the + -- compiler, use Prj.Env.Ada_Objects_Path instead. + Ada_Objects_Path_No_Libs : String_Access := null; + -- The cached value of ADA_OBJECTS_PATH for this project file with all + -- object directories (no library ALI dir for library projects). + Libgnarl_Needed : Yes_No_Unknown := Unknown; -- Set to True when libgnarl is needed to link Index: prj-env.adb =================================================================== --- prj-env.adb (revision 207032) +++ prj-env.adb (working copy) @@ -219,21 +219,37 @@ Dummy : Boolean := False; + Result : String_Access; + -- Start of processing for Ada_Objects_Path begin -- If it is the first time we call this function for -- this project, compute the objects path - if Project.Ada_Objects_Path = null then + if Including_Libraries and then Project.Ada_Objects_Path /= null then + return Project.Ada_Objects_Path; + + elsif not Including_Libraries + and then Project.Ada_Objects_Path_No_Libs /= null + then + return Project.Ada_Objects_Path_No_Libs; + + else Buffer := new String (1 .. 4096); For_All_Projects (Project, In_Tree, Dummy); + Result := new String'(Buffer (1 .. Buffer_Last)); + Free (Buffer); - Project.Ada_Objects_Path := new String'(Buffer (1 .. Buffer_Last)); - Free (Buffer); + if Including_Libraries then + Project.Ada_Objects_Path := Result; + + else + Project.Ada_Objects_Path_No_Libs := Result; + end if; + + return Result; end if; - - return Project.Ada_Objects_Path; end Ada_Objects_Path; ------------------- Index: prj-env.ads =================================================================== --- prj-env.ads (revision 207026) +++ prj-env.ads (working copy) @@ -90,9 +90,12 @@ (Project : Project_Id; In_Tree : Project_Tree_Ref; Including_Libraries : Boolean := True) return String_Access; - -- Get the ADA_OBJECTS_PATH of a Project file. For the first call, compute - -- it and cache it. When Including_Libraries is False, do not include the - -- object directories of the library projects, and do not cache the result. + -- Get the ADA_OBJECTS_PATH of a Project file. For the first call with the + -- exact same parameters, compute it and cache it. When Including_Libraries + -- is False, the object directory of a library project is replaced with the + -- library ALI directory of this project (usually the library directory of + -- the project, except when attribute Library_ALI_Dir is declared) except + -- when the library ALI directory does not contain any ALI file. procedure Set_Ada_Paths (Project : Project_Id;