From 7db29ea7231998d62575270e5d31604c800adbb7 Mon Sep 17 00:00:00 2001 From: Emmanuel Briot Date: Thu, 4 Aug 2011 12:03:56 +0000 Subject: [PATCH] make.adb, [...] (Complete_Mains): if a main specified on the command line is not a file name... 2011-08-04 Emmanuel Briot * make.adb, makeutl.adb (Complete_Mains): if a main specified on the command line is not a file name, also check whether it could be a unit name. From-SVN: r177362 --- gcc/ada/ChangeLog | 6 ++ gcc/ada/make.adb | 137 -------------------------------------------- gcc/ada/makeutl.adb | 47 ++++++++++----- 3 files changed, 40 insertions(+), 150 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f24846bd44d..d7309c5e45f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2011-08-04 Emmanuel Briot + + * make.adb, makeutl.adb (Complete_Mains): if a main specified on the + command line is not a file name, also check whether it could be a unit + name. + 2011-08-04 Eric Botcazou * bindgen.adb (Gen_Finalize_Library_Ada): Factor out code to generate diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb index c0129c332c7..6b485f08cca 100644 --- a/gcc/ada/make.adb +++ b/gcc/ada/make.adb @@ -4151,143 +4151,6 @@ package body Make is Mains.Complete_Mains (Root_Environment.Flags, Main_Project, Project_Tree); --- --- --- Real_Main_Project : Project_Id := No_Project; --- -- The project of the first main --- --- Proj : Project_Id := No_Project; --- -- The project of the current main --- --- Real_Path : String_Access; --- --- begin --- Mains.Reset; --- --- -- Check each main --- --- loop --- declare --- Main : constant String := Mains.Next_Main; --- -- The name specified on the command line may include directory --- -- information. --- --- File_Name : constant String := Base_Name (Main); --- -- The simple file name of the current main --- --- Lang : Language_Ptr; --- --- begin --- exit when Main = ""; --- --- -- Get the project of the current main --- --- Proj := Prj.Env.Project_Of --- (File_Name, Main_Project, Project_Tree); --- --- -- Fail if the current main is not a source of a project --- --- if Proj = No_Project then --- Make_Failed --- ("""" & Main & """ is not a source of any project"); --- --- else --- -- If there is directory information, check that the source --- -- exists and, if it does, that the path is the actual path --- -- of a source of a project. --- --- if Main /= File_Name then --- Lang := Get_Language_From_Name (Main_Project, "ada"); --- --- Real_Path := --- Locate_Regular_File --- (Main & Get_Name_String --- (Lang.Config.Naming_Data.Body_Suffix), --- ""); --- if Real_Path = null then --- Real_Path := --- Locate_Regular_File --- (Main & Get_Name_String --- (Lang.Config.Naming_Data.Spec_Suffix), --- ""); --- end if; --- --- if Real_Path = null then --- Real_Path := Locate_Regular_File (Main, ""); --- end if; --- --- -- Fail if the file cannot be found --- --- if Real_Path = null then --- Make_Failed ("file """ & Main & """ does not exist"); --- end if; --- --- declare --- Project_Path : constant String := --- 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 := --- Normalize_Pathname --- (Real_Path.all, --- Case_Sensitive => False); --- Proj_Path : constant String := --- Normalize_Pathname --- (Project_Path, --- Case_Sensitive => False); --- --- begin --- Free (Real_Path); --- --- -- Fail if it is not the correct path --- --- if Normed_Path /= Proj_Path then --- if Verbose_Mode then --- Set_Standard_Error; --- Write_Str (Normed_Path); --- Write_Str (" /= "); --- Write_Line (Proj_Path); --- end if; --- --- Make_Failed --- ("""" & Main & --- """ is not a source of any project"); --- end if; --- end; --- end if; --- --- if not Unique_Compile then --- --- -- Record the project, if it is the first main --- --- if Real_Main_Project = No_Project then --- Real_Main_Project := Proj; --- --- elsif Proj /= Real_Main_Project then --- --- -- Fail, as the current main is not a source of the --- -- same project as the first main. --- --- Make_Failed --- ("""" & Main & --- """ is not a source of project " & --- Get_Name_String (Real_Main_Project.Name)); --- end if; --- end if; --- end if; --- --- -- If -u and -U are not used, we may have mains that are --- -- sources of a project that is not the one specified with --- -- switch -P. --- --- if not Unique_Compile then --- Main_Project := Real_Main_Project; --- end if; --- end; --- end loop; end Check_Mains; -- Start of processing for Gnatmake diff --git a/gcc/ada/makeutl.adb b/gcc/ada/makeutl.adb index 17aba047221..dca18b90645 100644 --- a/gcc/ada/makeutl.adb +++ b/gcc/ada/makeutl.adb @@ -1351,25 +1351,30 @@ package body Makeutl is for J in reverse Names.First .. Names.Last loop declare - File : Main_Info := Names.Table (J); - Main_Id : File_Name_Type := File.File; - Main : constant String := - Get_Name_String (Main_Id); - Source : Prj.Source_Id := No_Source; + File : Main_Info := Names.Table (J); + Main_Id : File_Name_Type := File.File; + Main : constant String := Get_Name_String (Main_Id); + Source : Prj.Source_Id := No_Source; + Suffix : File_Name_Type; + Iter : Source_Iterator; Is_Absolute : Boolean := False; - Suffix : File_Name_Type; - Iter : Source_Iterator; begin - if Base_Name (Main) /= Main then + if Base /= Main then if Is_Absolute_Path (Main) then - Main_Id := Create_Name (Base_Name (Main)); + Main_Id := Create_Name (Base); Is_Absolute := True; else - Fail_Program - (Tree, - "mains cannot include directory information (""" - & Main & """)"); + declare + Absolute : constant String := + Normalize_Pathname + (Name => Main, + Directory => "", + Resolve_Links => False); + begin + File.File := Create_Name (Absolute); + Main_Id := Create_Name (Base); + end; end if; end if; @@ -1468,6 +1473,22 @@ package body Makeutl is end if; end if; + if Source = No_Source then + -- Still not found ? Maybe we have a unit name + declare + Unit : constant Unit_Index := + Units_Htable.Get + (File.Tree.Units_HT, Name_Id (Main_Id)); + begin + if Unit /= No_Unit_Index then + Source := Unit.File_Names (Impl); + if Source = No_Source then + Source := Unit.File_Names (Spec); + end if; + end if; + end; + end if; + if Source /= No_Source then -- If we have found a multi-unit source file but -- 2.30.2