-- --
-- B o d y --
-- --
--- Copyright (C) 2003-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2003-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
end if;
case Arg (2) is
+ when '-' =>
+ if Arg'Length > Subdirs_Option'Length and then
+ Arg (1 .. Subdirs_Option'Length) = Subdirs_Option
+ then
+ Subdirs :=
+ new String'
+ (Arg (Subdirs_Option'Length + 1 .. Arg'Last));
+
+ else
+ Bad_Argument;
+ end if;
+
when 'a' =>
if Arg'Length < 4 then
Bad_Argument;
end;
end if;
+ when 'e' =>
+ if Arg = "-eL" then
+ Follow_Links_For_Files := True;
+
+ else
+ Bad_Argument;
+ end if;
+
when 'f' =>
Force_Deletions := True;
Put_Line (" names may be omitted if -P<project> is specified");
New_Line;
+ Put_Line (" --subdirs=dir real obj/lib/exec dirs are subdirs");
+ New_Line;
+
Put_Line (" -c Only delete compiler generated files");
Put_Line (" -D dir Specify dir as the object library");
+ Put_Line (" -eL Follow symbolic links when processing " &
+ "project files");
Put_Line (" -f Force deletions of unwritable files");
Put_Line (" -F Full project path name " &
"in brief error messages");
-- --
-- B o d y --
-- --
--- Copyright (C) 1996-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 1996-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Sinput.P;
with Snames; use Snames;
with Table;
+with Targparm;
with Tempdir;
with Types; use Types;
with Hostparm; use Hostparm;
-- METRIC).
procedure Delete_Temp_Config_Files;
- -- Delete all temporary config files
+ -- Delete all temporary config files. The caller is responsible for
+ -- ensuring that Keep_Temporary_Files is False.
procedure Get_Closure;
-- Get the sources in the closure of the ASIS_Main and add them to the
pragma Warnings (Off, Success);
begin
- if not Keep_Temporary_Files then
- if Project /= No_Project then
- for Prj in Project_Table.First ..
- Project_Table.Last (Project_Tree.Projects)
- loop
- if
- Project_Tree.Projects.Table (Prj).Config_File_Temp
- then
- if Verbose_Mode then
- Output.Write_Str ("Deleting temp configuration file """);
- Output.Write_Str
- (Get_Name_String
- (Project_Tree.Projects.Table
- (Prj).Config_File_Name));
- Output.Write_Line ("""");
- end if;
+ -- This should only be called if Keep_Temporary_Files is False
- Delete_File
- (Name => Get_Name_String
+ pragma Assert (not Keep_Temporary_Files);
+
+ if Project /= No_Project then
+ for Prj in Project_Table.First ..
+ Project_Table.Last (Project_Tree.Projects)
+ loop
+ if
+ Project_Tree.Projects.Table (Prj).Config_File_Temp
+ then
+ if Verbose_Mode then
+ Output.Write_Str ("Deleting temp configuration file """);
+ Output.Write_Str
+ (Get_Name_String
(Project_Tree.Projects.Table
- (Prj).Config_File_Name),
- Success => Success);
+ (Prj).Config_File_Name));
+ Output.Write_Line ("""");
end if;
- end loop;
- end if;
- -- If a temporary text file that contains a list of files for a tool
- -- has been created, delete this temporary file.
+ Delete_File
+ (Name =>
+ Get_Name_String
+ (Project_Tree.Projects.Table (Prj).Config_File_Name),
+ Success => Success);
+ end if;
+ end loop;
+ end if;
- if Temp_File_Name /= null then
- Delete_File (Temp_File_Name.all, Success);
- end if;
+ -- If a temporary text file that contains a list of files for a tool
+ -- has been created, delete this temporary file.
+
+ if Temp_File_Name /= null then
+ Delete_File (Temp_File_Name.all, Success);
end if;
end Delete_Temp_Config_Files;
6 => new String'("-bargs"),
7 => new String'("-R"),
8 => new String'("-Z"));
- -- Arguments of the invocation of gnatmake to get the list of
+ -- Arguments for the invocation of gnatmake which are added to the
+ -- Last_Arguments list by this procedure.
FD : File_Descriptor;
-- File descriptor for the temp file that will get the output of the
File : Ada.Text_IO.File_Type;
Line : String (1 .. 250);
Last : Natural;
+ -- Used to read file if there is an error, it is good enough to display
+ -- just 250 characters if the first line of the file is very long.
Udata : Unit_Data;
Path : Path_Name_Type;
if not Keep_Temporary_Files then
Delete (File);
-
else
Close (File);
end if;
for C in Command_List'Range loop
if not Command_List (C).VMS_Only then
- Put ("gnat " & To_Lower (Command_List (C).Cname.all));
+ if Targparm.AAMP_On_Target then
+ Put ("gnaampcmd ");
+ else
+ Put ("gnat ");
+ end if;
+
+ Put (To_Lower (Command_List (C).Cname.all));
Set_Col (25);
- Put (Command_List (C).Unixcmd.all);
+ Put (Program_Name (Command_List (C).Unixcmd.all).all);
declare
Sws : Argument_List_Access renames Command_List (C).Unixsws;
Set_Mode (Ada_Only);
+ -- Add the default search directories, to be able to find system.ads in the
+ -- subsequent call to Targparm.Get_Target_Parameters.
+
+ Add_Default_Search_Dirs;
+
+ -- Get target parameters so that AAMP_On_Target will be set, for testing in
+ -- Osint.Program_Name to handle the mapping of GNAAMP tool names.
+
+ Targparm.Get_Target_Parameters;
+
-- Add the directory where the GNAT driver is invoked in front of the path,
-- if the GNAT driver is invoked with directory information. Do not do this
-- for VMS, where the notion of path does not really exist.
end if;
end if;
+ -- --subdirs=... Specify Subdirs
+
+ if Argv'Length > Subdirs_Option'Length and then
+ Argv
+ (Argv'First .. Argv'First + Subdirs_Option'Length - 1) =
+ Subdirs_Option
+ then
+ Subdirs :=
+ new String'
+ (Argv
+ (Argv'First + Subdirs_Option'Length .. Argv'Last));
+
+ Remove_Switch (Arg_Num);
+
-- -aPdir Add dir to the project search path
- if Argv'Length > 3
+ elsif Argv'Length > 3
and then Argv (Argv'First + 1 .. Argv'First + 2) = "aP"
then
Add_Search_Project_Directory
Remove_Switch (Arg_Num);
+ -- -eL Follow links for files
+
+ elsif Argv.all = "-eL" then
+ Follow_Links_For_Files := True;
+
+ Remove_Switch (Arg_Num);
+
-- -vPx Specify verbosity while parsing project files
elsif Argv'Length = 4
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Opt;
with Osint; use Osint;
with Output; use Output;
+with Prj; use Prj;
with Prj.Makr;
with Switch; use Switch;
with Table;
-- Scan options first
loop
- case Getopt ("c: d: gnatep=! gnatep! gnateD! D: h P: v x: f:") is
+ case Getopt
+ ("-subdirs=! c: d: gnatep=! gnatep! gnateD! eL D: h P: v x: f:")
+ is
when ASCII.NUL =>
exit;
+ when '-' =>
+ Subdirs := new String'(Parameter);
+
when 'c' =>
if File_Set then
Fail ("only one -P or -c switch may be specified");
when 'D' =>
Get_Directories (Parameter);
+ when 'e' =>
+ Opt.Follow_Links_For_Files := True;
+
when 'f' =>
Foreign_Patterns.Increment_Last;
Foreign_Patterns.Table (Foreign_Patterns.Last) :=
Write_Eol;
Write_Line ("switches:");
+ Write_Line (" --subdirs=dir real obj/lib/exec dirs are subdirs");
+ Write_Eol;
+
Write_Line (" -cfile create configuration pragmas file");
Write_Line (" -ddir use dir as one of the source " &
"directories");
Write_Line (" -Dfile get source directories from file");
+ Write_Line (" -eL follow symbolic links when processing " &
+ "project files");
Write_Line (" -fpat foreign pattern");
Write_Line (" -gnateDsym=v preprocess with symbol definition");
Write_Line (" -gnatep=data preprocess files with data file");
-- --
-- B o d y --
-- --
--- Copyright (C) 2004-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2004-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Dash_cargs : constant String_Access := Dash_cargs_String'Access;
Dash_d_String : aliased String := "-d";
Dash_d : constant String_Access := Dash_d_String'Access;
+ Dash_eL_String : aliased String := "-eL";
+ Dash_eL : constant String_Access := Dash_eL_String'Access;
Dash_f_String : aliased String := "-f";
Dash_f : constant String_Access := Dash_f_String'Access;
Dash_k_String : aliased String := "-k";
Add_Argument (Dash_d, True);
end if;
+ -- -eL
+
+ if Follow_Links_For_Files then
+ Add_Argument (Dash_eL, True);
+ end if;
+
-- -k
if Keep_Going then
-- Add the directory where gprmake is invoked in front of the path,
-- if gprmake is invoked from a bin directory or with directory
- -- information. Only do this if the platform is not VMS,
- -- where the notion of path does not really exist.
+ -- information. Only do this if the platform is not VMS, where the
+ -- notion of path does not really exist.
-- Below code shares nasty code duplication with make.adb code???
elsif Arg = "-d" then
Display_Compilation_Progress := True;
+ elsif Arg = "-eL" then
+ Follow_Links_For_Files := True;
+
elsif Arg = "-f" then
Force_Compilations := True;
Write_Str (" -c Compile only");
Write_Eol;
+ -- Line for -eL
+
+ Write_Str (" -eL Follow symbolic links when processing " &
+ "project files");
+ Write_Eol;
+
-- Line for -f
Write_Str (" -f Force recompilations");
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Write_Str (" --RTS=dir specify the default source and object search"
& " path");
Write_Eol;
+
+ -- Line for --subdirs=
+
+ Write_Str (" --subdirs=dir real obj/lib/exec dirs are subdirs");
+ Write_Eol;
Write_Eol;
-- General Compiler, Binder, Linker switches
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Osint;
with Prj.Com; use Prj.Com;
-with System.Case_Util; use System.Case_Util;
+
+with GNAT.Case_Util; use GNAT.Case_Util;
package body Prj.Attr is
+ use GNAT;
+
-- Data for predefined attributes and packages
-- Names are in lower case and end with '#'
"SVobject_dir#" &
"SVexec_dir#" &
"LVsource_dirs#" &
+ "Lainherit_source_path#" &
"LVexcluded_source_dirs#" &
-- Source files
-- Configuration - Archives
"LVarchive_builder#" &
+ "LVarchive_builder_append_option#" &
"LVarchive_indexer#" &
"SVarchive_suffix#" &
"LVlibrary_partial_linker#" &
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- It is also possible to define new packages with their attributes
-with System.Strings;
with Table;
-package Prj.Attr is
+with GNAT.Strings;
- use System;
+package Prj.Attr is
- function Package_Name_List return Strings.String_List;
+ function Package_Name_List return GNAT.Strings.String_List;
-- Returns the list of valid package names, including those added by
-- procedures Register_New_Package below. The String_Access components of
-- the returned String_List should never be freed.
-- Characteristics of an attribute. Optional_Index indicates that there
-- may be an optional index in the index of the associative array, as in
-- for Switches ("files.ada" at 2) use ...
+ -- Above character literals should be documented ???
subtype Defined_Attribute_Kind is Attribute_Kind
range Single .. Optional_Index_Case_Insensitive_Associative_Array;
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Snames;
with Uintp; use Uintp;
-with System.Strings;
+with GNAT.Strings;
package body Prj.Dect is
- use System;
+ use GNAT;
type Zone is (In_Project, In_Package, In_Case_Construction);
-- Used to indicate if we are parsing a package (In_Package),
-- --
-- B o d y --
-- --
--- Copyright (C) 2000-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2000-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Prefix := new String'(Executable_Prefix_Path);
if Prefix.all /= "" then
- if Get_Mode = Ada_Only then
- Current_Project_Path :=
- new String'(Name_Buffer (1 .. Name_Len) &
- Path_Separator &
- Prefix.all & Directory_Separator & "gnat");
-
- else
- Current_Project_Path :=
- new String'(Name_Buffer (1 .. Name_Len) &
- Path_Separator &
- Prefix.all & Directory_Separator &
- "share" & Directory_Separator & "gpr");
+ if Get_Mode = Multi_Language then
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Prefix.all &
+ Directory_Separator & "share" &
+ Directory_Separator & "gpr");
end if;
+
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Prefix.all &
+ Directory_Separator & "lib" &
+ Directory_Separator & "gnat");
end if;
else
-- --
-- B o d y --
-- --
--- Copyright (C) 2000-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2000-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Src_Data : Source_Data := No_Source_Data;
begin
- -- This is a new source. Create an entry for it in the Sources table.
+ -- This is a new source so create an entry for it in the Sources table
Source_Data_Table.Increment_Last (In_Tree.Sources);
Id := Source_Data_Table.Last (In_Tree.Sources);
Write_Str ("Adding source #");
Write_Str (Id'Img);
Write_Str (", File : ");
+ Write_Str (Get_Name_String (File_Name));
if Lang_Kind = Unit_Based then
Write_Str (", Unit : ");
Write_Str (Get_Name_String (Unit));
end if;
- Write_Line (Get_Name_String (File_Name));
+ Write_Eol;
end if;
Src_Data.Project := Project;
Src_Data.Language_Name := Lang;
Src_Data.Language := Lang_Id;
Src_Data.Lang_Kind := Lang_Kind;
+ Src_Data.Compiled := In_Tree.Languages_Data.Table
+ (Lang_Id).Config.Compiler_Driver /=
+ Empty_File_Name;
Src_Data.Kind := Kind;
Src_Data.Alternate_Languages := Alternate_Languages;
Src_Data.Other_Part := Other_Part;
Src_Data.Unit := Unit;
Src_Data.Index := Index;
Src_Data.File := File_Name;
- Src_Data.Object := Object_Name (File_Name);
Src_Data.Display_File := Display_File;
- Src_Data.Dependency :=
- In_Tree.Languages_Data.Table (Lang_Id).Config.Dependency_Kind;
- Src_Data.Dep_Name :=
- Dependency_Name (File_Name, Src_Data.Dependency);
- Src_Data.Switches := Switches_Name (File_Name);
+ Src_Data.Dependency := In_Tree.Languages_Data.Table
+ (Lang_Id).Config.Dependency_Kind;
Src_Data.Naming_Exception := Naming_Exception;
+ if Src_Data.Compiled then
+ Src_Data.Object := Object_Name (File_Name);
+ Src_Data.Dep_Name :=
+ Dependency_Name (File_Name, Src_Data.Dependency);
+ Src_Data.Switches := Switches_Name (File_Name);
+ end if;
+
if Path /= No_Path then
Src_Data.Path := Path;
Src_Data.Display_Path := Display_Path;
Check_Programming_Languages (In_Tree, Project, Data);
+ if Data.Qualifier = Dry and then Data.Source_Dirs /= Nil_String then
+ Error_Msg
+ (Project,
+ In_Tree,
+ "an abstract project need to have no language, no sources or no " &
+ "source directories",
+ Data.Location);
+ end if;
+
-- Check configuration in multi language mode
if Must_Check_Configuration then
Get_Name_String (Element.Value.Value);
- if Name_Len = 0 then
- Error_Msg
- (Project,
- In_Tree,
- "compiler driver name cannot be empty",
- Element.Value.Location);
- end if;
-
In_Tree.Languages_Data.Table
(Lang_Index).Config.Compiler_Driver :=
File_Name_Type (Element.Value.Value);
From_List => List,
In_Tree => In_Tree);
+ elsif Attribute.Name = Name_Archive_Builder_Append_Option then
+
+ -- Attribute Archive_Builder: the archive builder
+ -- (usually "ar") and its minimum options (usually "cr").
+
+ List := Attribute.Value.Values;
+
+ if List /= Nil_String then
+ Put
+ (Into_List => Data.Config.Archive_Builder_Append_Option,
+ From_List => List,
+ In_Tree => In_Tree);
+ end if;
+
elsif Attribute.Name = Name_Archive_Indexer then
-- Attribute Archive_Indexer: the optional archive
Error_Msg
(Project,
In_Tree,
- "invalid value """ &
- Get_Name_String (Attribute.Value.Value) &
- """ for Symbolic_Link_Supported",
+ "invalid value """
+ & Get_Name_String (Attribute.Value.Value)
+ & """ for Symbolic_Link_Supported",
Attribute.Value.Location);
end;
Attribute.Value.Location);
end;
- elsif
- Attribute.Name = Name_Library_Auto_Init_Supported
- then
+ elsif Attribute.Name = Name_Library_Auto_Init_Supported then
declare
pragma Unsuppress (All_Checks);
begin
Data.Config.Auto_Init_Supported :=
- Boolean'Value (Get_Name_String
- (Attribute.Value.Value));
+ Boolean'Value (Get_Name_String (Attribute.Value.Value));
exception
when Constraint_Error =>
Error_Msg
(Project,
In_Tree,
- "invalid value """ &
- Get_Name_String (Attribute.Value.Value) &
- """ for Library_Auto_Init_Supported",
+ "invalid value """
+ & Get_Name_String (Attribute.Value.Value)
+ & """ for Library_Auto_Init_Supported",
Attribute.Value.Location);
end;
- elsif
- Attribute.Name = Name_Shared_Library_Minimum_Switches
- then
+ elsif Attribute.Name = Name_Shared_Library_Minimum_Switches then
List := Attribute.Value.Values;
if List /= Nil_String then
In_Tree => In_Tree);
end if;
- elsif
- Attribute.Name = Name_Library_Version_Switches
- then
+ elsif Attribute.Name = Name_Library_Version_Switches then
List := Attribute.Value.Values;
if List /= Nil_String then
Current_Array : Array_Data;
Element_Id : Array_Element_Id;
Element : Array_Element;
+ List : String_List_Id;
begin
-- Process the associative array attributes at project level
if Lang_Index /= No_Language_Index then
case Current_Array.Name is
+ when Name_Inherit_Source_Path =>
+ List := Element.Value.Values;
+
+ if List /= Nil_String then
+ Put
+ (Into_List =>
+ In_Tree.Languages_Data.Table (Lang_Index).
+ Config.Include_Compatible_Languages,
+ From_List => List,
+ In_Tree => In_Tree,
+ Lower_Case => True);
+ end if;
+
when Name_Toolchain_Description =>
-- Attribute Toolchain_Description (<language>)
end if;
end if;
+ -- A virtual project extending an externally built project is itself
+ -- externally built.
+
+ if Data.Virtual and then Data.Extends /= No_Project then
+ Data.Externally_Built :=
+ In_Tree.Projects.Table (Data.Extends).Externally_Built;
+ end if;
+
if Current_Verbosity = High then
Write_Str ("Project is ");
else
Error_Msg_Name_1 := Unit;
-
+ Error_Msg_Name_2 :=
+ In_Tree.Projects.Table (Other_Project).Name;
Error_Msg
(Project,
In_Tree,
- "unit%% cannot belong to two projects " &
- "simultaneously",
+ "%% is already a source of project %%",
Element.Value.Location);
end if;
end if;
Support_For_Libraries : Library_Support;
+ Library_Directory_Present : Boolean;
+
procedure Check_Library (Proj : Project_Id; Extends : Boolean);
-- Check if an imported or extended project if also a library project
procedure Check_Library (Proj : Project_Id; Extends : Boolean) is
Proj_Data : Project_Data;
+ Src_Id : Source_Id;
+ Src : Source_Data;
begin
if Proj /= No_Project then
Proj_Data := In_Tree.Projects.Table (Proj);
if not Proj_Data.Library then
+
-- The only not library projects that are OK are those that
- -- have no sources.
+ -- have no sources. However, header files from non-Ada
+ -- languages are OK, as there is nothing to compile.
+
+ Src_Id := Proj_Data.First_Source;
+ while Src_Id /= No_Source loop
+ Src := In_Tree.Sources.Table (Src_Id);
+
+ exit when Src.Lang_Kind /= File_Based
+ or else Src.Kind /= Spec;
- if Proj_Data.Source_Dirs /= Nil_String then
+ Src_Id := Src.Next_In_Project;
+ end loop;
+ if Src_Id /= No_Source then
Error_Msg_Name_1 := Data.Name;
Error_Msg_Name_2 := Proj_Data.Name;
-- Start of processing for Check_Library_Attributes
begin
+ Library_Directory_Present := Lib_Dir.Value /= Empty_String;
+
-- Special case of extending project
if Data.Extends /= No_Project then
-- directory is specified.
if Extended_Data.Library then
- if Lib_Name.Default then
- Data.Library_Name := Extended_Data.Library_Name;
- end if;
+ if Data.Qualifier = Standard then
+ Error_Msg
+ (Project, In_Tree,
+ "a standard project cannot extend a library project",
+ Data.Location);
- if Lib_Dir.Default then
- if not Data.Virtual then
- Error_Msg
- (Project, In_Tree,
- "a project extending a library project must " &
- "specify an attribute Library_Dir",
- Data.Location);
+ else
+ if Lib_Name.Default then
+ Data.Library_Name := Extended_Data.Library_Name;
+ end if;
+
+ if Lib_Dir.Default then
+ if not Data.Virtual then
+ Error_Msg
+ (Project, In_Tree,
+ "a project extending a library project must " &
+ "specify an attribute Library_Dir",
+ Data.Location);
+
+ else
+ -- For a virtual project extending a library project,
+ -- inherit library directory.
+
+ Data.Library_Dir := Extended_Data.Library_Dir;
+ Data.Display_Library_Dir :=
+ Extended_Data.Display_Library_Dir;
+ Library_Directory_Present := True;
+ end if;
end if;
end if;
end if;
pragma Assert (Lib_Dir.Kind = Single);
- if Lib_Dir.Value = Empty_String then
+ if not Library_Directory_Present then
if Current_Verbosity = High then
Write_Line ("No library directory");
end if;
else
- -- Find path name, check that it is a directory
+ -- Find path name (unless inherited), check that it is a directory
- Locate_Directory
- (Project,
- In_Tree,
- File_Name_Type (Lib_Dir.Value),
- Data.Display_Directory,
- Data.Library_Dir,
- Data.Display_Library_Dir,
- Create => "library",
- Current_Dir => Current_Dir,
- Location => Lib_Dir.Location);
+ if Data.Library_Dir = No_Path then
+ Locate_Directory
+ (Project,
+ In_Tree,
+ File_Name_Type (Lib_Dir.Value),
+ Data.Display_Directory,
+ Data.Library_Dir,
+ Data.Display_Library_Dir,
+ Create => "library",
+ Current_Dir => Current_Dir,
+ Location => Lib_Dir.Location);
+ end if;
if Data.Library_Dir = No_Path then
and then
Data.Library_Name /= No_Name;
+ if Data.Extends = No_Project then
+ case Data.Qualifier is
+ when Standard =>
+ if Data.Library then
+ Error_Msg
+ (Project, In_Tree,
+ "a standard project cannot be a library project",
+ Lib_Name.Location);
+ end if;
+
+ when Library =>
+ if not Data.Library then
+ Error_Msg
+ (Project, In_Tree,
+ "not a library project",
+ Data.Location);
+ end if;
+
+ when others =>
+ null;
+
+ end case;
+ end if;
+
if Data.Library then
if Get_Mode = Multi_Language then
Support_For_Libraries := Data.Config.Lib_Support;
if Current = Nil_String then
Data.Source_Dirs := Nil_String;
+ if Data.Qualifier = Standard then
+ Error_Msg
+ (Project,
+ In_Tree,
+ "a standard project cannot have no language declared",
+ Languages.Location);
+ end if;
+
else
-- Look through all the languages specified in attribute
-- Languages.
end if;
end if;
end if;
+
+ elsif Subdirs /= null then
+ Name_Len := 1;
+ Name_Buffer (1) := '.';
+ Locate_Directory
+ (Project,
+ In_Tree,
+ Name_Find,
+ Data.Display_Directory,
+ Data.Object_Directory,
+ Data.Display_Object_Dir,
+ Create => "object",
+ Location => Object_Dir.Location,
+ Current_Dir => Current_Dir);
end if;
if Current_Verbosity = High then
Exec_Dir.Location);
else
- -- We check that the specified object directory does exist
+ -- We check that the specified exec directory does exist
Locate_Directory
(Project,
then
Data.Source_Dirs := Nil_String;
+ if Data.Qualifier = Standard then
+ Error_Msg
+ (Project,
+ In_Tree,
+ "a standard project cannot have no sources",
+ Source_Files.Location);
+ end if;
+
if Data.Extends = No_Project
and then Data.Object_Directory = Data.Directory
then
end if;
elsif Source_Dirs.Values = Nil_String then
+ if Data.Qualifier = Standard then
+ Error_Msg
+ (Project,
+ In_Tree,
+ "a standard project cannot have no source directories",
+ Source_Dirs.Location);
+ end if;
-- If Source_Dirs is an empty string list, this means that this
-- project contains no source. For projects that don't extend other
Current_Dir : String;
Location : Source_Ptr := No_Location)
is
- The_Name : String := Get_Name_String (Name);
-
The_Parent : constant String :=
Get_Name_String (Parent) & Directory_Separator;
Full_Name : File_Name_Type;
+ The_Name : File_Name_Type;
+
begin
+ Get_Name_String (Name);
+
+ -- Add Subdirs.all if it is a directory that may be created and
+ -- Subdirs is not null;
+
+ if Create /= "" and then Subdirs /= null then
+ if Name_Buffer (Name_Len) /= Directory_Separator then
+ Add_Char_To_Name_Buffer (Directory_Separator);
+ end if;
+
+ Add_Str_To_Name_Buffer (Subdirs.all);
+ end if;
+
-- Convert '/' to directory separator (for Windows)
- for J in The_Name'Range loop
- if The_Name (J) = '/' then
- The_Name (J) := Directory_Separator;
+ for J in 1 .. Name_Len loop
+ if Name_Buffer (J) = '/' then
+ Name_Buffer (J) := Directory_Separator;
end if;
end loop;
+ The_Name := Name_Find;
+
if Current_Verbosity = High then
Write_Str ("Locate_Directory (""");
- Write_Str (The_Name);
+ Write_Str (Get_Name_String (The_Name));
Write_Str (""", """);
Write_Str (The_Parent);
Write_Line (""")");
Dir := No_Path;
Display := No_Path;
- if Is_Absolute_Path (The_Name) then
- Full_Name := Name;
+ if Is_Absolute_Path (Get_Name_String (The_Name)) then
+ Full_Name := The_Name;
else
Name_Len := 0;
Add_Str_To_Name_Buffer
(The_Parent (The_Parent'First .. The_Parent_Last));
- Add_Str_To_Name_Buffer (The_Name);
+ Add_Str_To_Name_Buffer (Get_Name_String (The_Name));
Full_Name := Name_Find;
end if;
Full_Path_Name : constant String := Get_Name_String (Full_Name);
begin
- if Setup_Projects and then Create'Length > 0
+ if (Setup_Projects or else Subdirs /= null)
+ and then Create'Length > 0
and then not Is_Directory (Full_Path_Name)
then
begin
and then Lang = Ada_Language_Index
and then Data.Extends = No_Project
then
- -- We should have found at least one source. If not, report an error.
+ -- We should have found at least one source, if not report an error
if Data.Ada_Sources = Nil_String then
Report_No_Sources
Kind => Kind);
if Language = No_Language_Index then
+
+ -- A file name in a list must be a source of a language
+
if Name_Loc.Found then
- -- A file name in a list must be a source of a language.
Error_Msg_File_1 := File_Name;
Error_Msg
(Project,
Error_Msg_Name_1 := Unit;
Error_Msg
(Project, In_Tree,
- "unit %% cannot belong to " &
- "several projects",
+ "unit %% cannot belong to several projects",
No_Location);
+
+ Error_Msg_Name_1 := In_Tree.Projects.Table (Project).Name;
+ Error_Msg_Name_2 := Name_Id (Display_Path_Id);
+ Error_Msg
+ (Project, In_Tree,
+ "\ project %%, %%",
+ No_Location);
+
+ Error_Msg_Name_1 :=
+ In_Tree.Projects.Table (Src_Data.Project).Name;
+ Error_Msg_Name_2 := Name_Id (Src_Data.Display_Path);
+ Error_Msg
+ (Project, In_Tree,
+ "\ project %%, %%",
+ No_Location);
+
Add_Src := False;
end if;
end if;
Err_Vars.Error_Msg_Name_1 := Unit_Name;
Error_Msg
- (Project, In_Tree, "duplicate source %%", The_Location);
+ (Project, In_Tree, "duplicate unit %%", The_Location);
Err_Vars.Error_Msg_Name_1 :=
In_Tree.Projects.Table
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Project_Comment_State : Tree.Comment_State;
+ Proj_Qualifier : Project_Qualifier := Unspecified;
+ Qualifier_Location : Source_Ptr;
+
begin
Extends_All := False;
Project_Stack.Table (Project_Stack.Last).Id := Project;
Set_Directory_Of (Project, In_Tree, Project_Directory);
Set_Path_Name_Of (Project, In_Tree, Normed_Path_Name);
- Set_Location_Of (Project, In_Tree, Token_Ptr);
Set_First_With_Clause_Of (Project, In_Tree, Imported_Projects);
+
+ -- Check if there is a qualifier before the reserved word "project"
+
+ Qualifier_Location := Token_Ptr;
+
+ if Token = Tok_Abstract then
+ Proj_Qualifier := Dry;
+ Scan (In_Tree);
+
+ elsif Token = Tok_Identifier then
+ case Token_Name is
+ when Snames.Name_Standard =>
+ Proj_Qualifier := Standard;
+ Scan (In_Tree);
+
+ when Snames.Name_Aggregate =>
+ Proj_Qualifier := Aggregate;
+ Scan (In_Tree);
+
+ if Token = Tok_Identifier and then
+ Token_Name = Snames.Name_Library
+ then
+ Proj_Qualifier := Aggregate_Library;
+ Scan (In_Tree);
+ end if;
+
+ when Snames.Name_Library =>
+ Proj_Qualifier := Library;
+ Scan (In_Tree);
+
+ when Snames.Name_Configuration =>
+ if not In_Configuration then
+ Error_Msg ("configuration projects cannot belong to a user" &
+ " project tree",
+ Token_Ptr);
+ end if;
+
+ Scan (In_Tree);
+
+ when others =>
+ null;
+ end case;
+ end if;
+
+ if Proj_Qualifier /= Unspecified then
+ if In_Configuration then
+ Error_Msg ("a configuration project cannot be qualified except " &
+ "as configuration project",
+ Qualifier_Location);
+ end if;
+
+ Set_Project_Qualifier_Of (Project, In_Tree, Proj_Qualifier);
+ end if;
+
+ Set_Location_Of (Project, In_Tree, Token_Ptr);
+
Expect (Tok_Project, "PROJECT");
-- Mark location of PROJECT token if present
begin
if Current_Verbosity = High then
Write_Str (" Trying ");
- Write_Str (Path);
+ Write_Line (Path);
end if;
return Locate_Regular_File
if Next_Element = No_Array_Element then
Array_Element_Table.Increment_Last
(In_Tree.Array_Elements);
- New_Element := Array_Element_Table.Last
- (In_Tree.Array_Elements);
+ New_Element :=
+ Array_Element_Table.Last
+ (In_Tree.Array_Elements);
+ In_Tree.Array_Elements.Table
+ (Prev_Element).Next := New_Element;
else
New_Element := Next_Element;
In_Tree.Array_Elements.Table
(New_Element) :=
- In_Tree.Array_Elements.Table
- (Orig_Element);
+ In_Tree.Array_Elements.Table (Orig_Element);
In_Tree.Array_Elements.Table
(New_Element).Value.Project := Project;
else
In_Tree.Variable_Elements.Table
- (The_Variable).Value :=
- New_Value;
-
+ (The_Variable).Value := New_Value;
end if;
-- Associative array attribute
Processed_Projects.Set (Name, Project);
Processed_Data.Name := Name;
+ Processed_Data.Qualifier :=
+ Project_Qualifier_Of (From_Project_Node, From_Project_Node_Tree);
In_Tree.Projects.Table (Project).Name := Name;
+ In_Tree.Projects.Table (Project).Qualifier :=
+ Processed_Data.Qualifier;
Get_Name_String (Name);
end if;
end if;
end;
+
+ In_Tree.Projects.Table (Project) := Processed_Data;
end if;
-- Process limited withed projects
In_Tree.Project_Nodes.Table
(Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
(Kind => N_Comment_Zones,
+ Qualifier => Unspecified,
Expr_Kind => Undefined,
Location => No_Location,
Directory => No_Path,
In_Tree.Project_Nodes.Table
(Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
(Kind => N_Comment,
+ Qualifier => Unspecified,
Expr_Kind => Undefined,
Flag1 => Comments.Table (J).Follows_Empty_Line,
Flag2 =>
Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
In_Tree.Project_Nodes.Table (Zone) :=
(Kind => N_Comment_Zones,
+ Qualifier => Unspecified,
Location => No_Location,
Directory => No_Path,
Expr_Kind => Undefined,
In_Tree.Project_Nodes.Table
(Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
(Kind => Of_Kind,
+ Qualifier => Unspecified,
Location => No_Location,
Directory => No_Path,
Expr_Kind => And_Expr_Kind,
In_Tree.Project_Nodes.Table
(Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
(Kind => N_Comment_Zones,
+ Qualifier => Unspecified,
Expr_Kind => Undefined,
Location => No_Location,
Directory => No_Path,
In_Tree.Project_Nodes.Table
(Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
(Kind => N_Comment,
+ Qualifier => Unspecified,
Expr_Kind => Undefined,
Flag1 => Comments.Table (J).Follows_Empty_Line,
Flag2 =>
return In_Tree.Project_Nodes.Table (Node).Field2;
end Project_Declaration_Of;
+ --------------------------
+ -- Project_Qualifier_Of --
+ --------------------------
+
+ function Project_Qualifier_Of
+ (Node : Project_Node_Id;
+ In_Tree : Project_Node_Tree_Ref) return Project_Qualifier
+ is
+ begin
+ pragma Assert
+ (Node /= Empty_Node
+ and then
+ In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+ return In_Tree.Project_Nodes.Table (Node).Qualifier;
+ end Project_Qualifier_Of;
+
-------------------------------------------
-- Project_File_Includes_Unkept_Comments --
-------------------------------------------
In_Tree.Project_Nodes.Table (Node).Field2 := To;
end Set_Project_Declaration_Of;
+ ------------------------------
+ -- Set_Project_Qualifier_Of --
+ ------------------------------
+
+ procedure Set_Project_Qualifier_Of
+ (Node : Project_Node_Id;
+ In_Tree : Project_Node_Tree_Ref;
+ To : Project_Qualifier)
+ is
+ begin
+ pragma Assert
+ (Node /= Empty_Node
+ and then In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+ In_Tree.Project_Nodes.Table (Node).Qualifier := To;
+ end Set_Project_Qualifier_Of;
+
-----------------------------------------------
-- Set_Project_File_Includes_Unkept_Comments --
-----------------------------------------------
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
pragma Inline (Project_Declaration_Of);
-- Only valid for N_Project nodes
+ function Project_Qualifier_Of
+ (Node : Project_Node_Id;
+ In_Tree : Project_Node_Tree_Ref) return Project_Qualifier;
+ pragma Inline (Project_Qualifier_Of);
+ -- Only valid for N_Project nodes
+
function Extending_Project_Of
(Node : Project_Node_Id;
In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
To : Project_Node_Id);
pragma Inline (Set_Project_Declaration_Of);
+ procedure Set_Project_Qualifier_Of
+ (Node : Project_Node_Id;
+ In_Tree : Project_Node_Tree_Ref;
+ To : Project_Qualifier);
+ pragma Inline (Set_Project_Qualifier_Of);
+
procedure Set_Extending_Project_Of
(Node : Project_Node_Id;
In_Tree : Project_Node_Tree_Ref;
Kind : Project_Node_Kind;
+ Qualifier : Project_Qualifier := Unspecified;
+
Location : Source_Ptr := No_Location;
Directory : Path_Name_Type := No_Path;
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Supp_Suffixes => No_Supp_Language_Index);
Project_Empty : constant Project_Data :=
- (Externally_Built => False,
- Config => Default_Project_Config,
- Languages => No_Name_List,
- First_Referred_By => No_Project,
- Name => No_Name,
- Display_Name => No_Name,
- Path_Name => No_Path,
- Display_Path_Name => No_Path,
- Virtual => False,
- Location => No_Location,
- Mains => Nil_String,
- Directory => No_Path,
- Display_Directory => No_Path,
- Dir_Path => null,
- Library => False,
- Library_Dir => No_Path,
- Display_Library_Dir => No_Path,
- Library_Src_Dir => No_Path,
- Display_Library_Src_Dir => No_Path,
- Library_ALI_Dir => No_Path,
- Display_Library_ALI_Dir => No_Path,
- Library_Name => No_Name,
- Library_Kind => Static,
- Lib_Internal_Name => No_Name,
- Standalone_Library => False,
- Lib_Interface_ALIs => Nil_String,
- Lib_Auto_Init => False,
- Libgnarl_Needed => Unknown,
- Symbol_Data => No_Symbols,
- Ada_Sources => Nil_String,
- Sources => Nil_String,
- First_Source => No_Source,
- Last_Source => No_Source,
- Unit_Based_Language_Name => No_Name,
- Unit_Based_Language_Index => No_Language_Index,
- Imported_Directories_Switches => null,
- Include_Path => null,
- Include_Data_Set => False,
- Include_Language => No_Language_Index,
- Source_Dirs => Nil_String,
- Known_Order_Of_Source_Dirs => True,
- Object_Directory => No_Path,
- Display_Object_Dir => No_Path,
- Library_TS => Empty_Time_Stamp,
- Exec_Directory => No_Path,
- Display_Exec_Dir => No_Path,
- Extends => No_Project,
- Extended_By => No_Project,
- Naming => Std_Naming_Data,
- First_Language_Processing => No_Language_Index,
- Decl => No_Declarations,
- Imported_Projects => Empty_Project_List,
- All_Imported_Projects => Empty_Project_List,
- Ada_Include_Path => null,
- Ada_Objects_Path => null,
- Objects_Path => null,
- Include_Path_File => No_Path,
- Objects_Path_File_With_Libs => No_Path,
- Objects_Path_File_Without_Libs => No_Path,
- Config_File_Name => No_Path,
- Config_File_Temp => False,
- Linker_Name => No_File,
- Linker_Path => No_Path,
- Minimum_Linker_Options => No_Name_List,
- Config_Checked => False,
- Checked => False,
- Seen => False,
- Need_To_Build_Lib => False,
- Depth => 0,
- Unkept_Comments => False,
- Langs => No_Languages,
- Supp_Languages => No_Supp_Language_Index,
- Ada_Sources_Present => True,
- Other_Sources_Present => True,
- First_Other_Source => No_Other_Source,
- Last_Other_Source => No_Other_Source,
- First_Lang_Processing => Default_First_Language_Processing_Data,
- Supp_Language_Processing => No_Supp_Language_Index);
+ (Qualifier => Unspecified,
+ Externally_Built => False,
+ Config => Default_Project_Config,
+ Languages => No_Name_List,
+ First_Referred_By => No_Project,
+ Name => No_Name,
+ Display_Name => No_Name,
+ Path_Name => No_Path,
+ Display_Path_Name => No_Path,
+ Virtual => False,
+ Location => No_Location,
+ Mains => Nil_String,
+ Directory => No_Path,
+ Display_Directory => No_Path,
+ Dir_Path => null,
+ Library => False,
+ Library_Dir => No_Path,
+ Display_Library_Dir => No_Path,
+ Library_Src_Dir => No_Path,
+ Display_Library_Src_Dir => No_Path,
+ Library_ALI_Dir => No_Path,
+ Display_Library_ALI_Dir => No_Path,
+ Library_Name => No_Name,
+ Library_Kind => Static,
+ Lib_Internal_Name => No_Name,
+ Standalone_Library => False,
+ Lib_Interface_ALIs => Nil_String,
+ Lib_Auto_Init => False,
+ Libgnarl_Needed => Unknown,
+ Symbol_Data => No_Symbols,
+ Ada_Sources => Nil_String,
+ Sources => Nil_String,
+ First_Source => No_Source,
+ Last_Source => No_Source,
+ Unit_Based_Language_Name => No_Name,
+ Unit_Based_Language_Index => No_Language_Index,
+ Imported_Directories_Switches => null,
+ Include_Path => null,
+ Include_Data_Set => False,
+ Include_Language => No_Language_Index,
+ Source_Dirs => Nil_String,
+ Known_Order_Of_Source_Dirs => True,
+ Object_Directory => No_Path,
+ Display_Object_Dir => No_Path,
+ Library_TS => Empty_Time_Stamp,
+ Exec_Directory => No_Path,
+ Display_Exec_Dir => No_Path,
+ Extends => No_Project,
+ Extended_By => No_Project,
+ Naming => Std_Naming_Data,
+ First_Language_Processing => No_Language_Index,
+ Decl => No_Declarations,
+ Imported_Projects => Empty_Project_List,
+ All_Imported_Projects => Empty_Project_List,
+ Ada_Include_Path => null,
+ Ada_Objects_Path => null,
+ Objects_Path => null,
+ Include_Path_File => No_Path,
+ Objects_Path_File_With_Libs => No_Path,
+ Objects_Path_File_Without_Libs => No_Path,
+ Config_File_Name => No_Path,
+ Config_File_Temp => False,
+ Linker_Name => No_File,
+ Linker_Path => No_Path,
+ Minimum_Linker_Options => No_Name_List,
+ Config_Checked => False,
+ Checked => False,
+ Seen => False,
+ Need_To_Build_Lib => False,
+ Depth => 0,
+ Unkept_Comments => False,
+ Langs => No_Languages,
+ Supp_Languages => No_Supp_Language_Index,
+ Ada_Sources_Present => True,
+ Other_Sources_Present => True,
+ First_Other_Source => No_Other_Source,
+ Last_Other_Source => No_Other_Source,
+ First_Lang_Processing =>
+ Default_First_Language_Processing_Data,
+ Supp_Language_Processing =>
+ No_Supp_Language_Index);
package Temp_Files is new Table.Table
(Table_Component_Type => Path_Name_Type,
Name_Len := 0;
The_Empty_String := Name_Find;
Empty_Name := The_Empty_String;
+ Empty_File_Name := File_Name_Type (The_Empty_String);
Name_Len := 4;
Name_Buffer (1 .. 4) := ".ads";
Default_Ada_Spec_Suffix_Id := Name_Find;
if Tree = No_Project_Tree then
Prj.Initialize (Tree => No_Project_Tree);
return Std_Naming_Data;
-
else
return Tree.Private_Part.Default_Naming;
end if;
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
package Prj is
+ Subdirs_Option : constant String := "--subdirs=";
+ -- Switch used to indicate that the real directories (object, exec,
+ -- library, ...) are subdirectories of what is indicated in the project
+ -- file.
+
+ Subdirs : String_Ptr := null;
+ -- The value after the equal sign in switch --subdirs=...
+ -- Contains the relative subdirectory.
+
type Library_Support is (None, Static_Only, Full);
-- Support for Library Project File.
-- - None: Library Project Files are not supported at all
-- Tri-state to decide if -lgnarl is needed when linking
type Mode is (Multi_Language, Ada_Only);
+ -- Ada_Only: mode for gnatmake, gnatname, the GNAT driver
+ -- Multi_Language: mode for gprbuild, gprclean
+
+ type Project_Qualifier is
+ (Unspecified,
+ Standard,
+ Library,
+ Dry,
+ Aggregate,
+ Aggregate_Library);
+ -- Qualifiers that can prefix the reserved word "project" in a project
+ -- file:
+ -- Standard: standard project ...
+ -- Library: library project is ...
+ -- Dry: abstract project is
+ -- Aggregate: aggregate project is
+ -- Aggregate_Library: aggregate library project is ...
function Get_Mode return Mode;
pragma Inline (Get_Mode);
Naming_Data : Lang_Naming_Data;
-- The naming data for the languages (prefixes, etc.)
+ Include_Compatible_Languages : Name_List_Index := No_Name_List;
+ -- The list of languages that are "include compatible" with this
+ -- language. A language B (for example "C") is "include compatible" with
+ -- a language A (for example "C++") if it is expected that sources of
+ -- language A may "include" header files from language B.
+
Compiler_Driver : File_Name_Type := No_File;
-- The name of the executable for the compiler of the language
-- Record describing the configuration of a language
No_Language_Config : constant Language_Config :=
- (Kind => File_Based,
- Naming_Data => No_Lang_Naming_Data,
- Compiler_Driver => No_File,
- Compiler_Driver_Path => null,
- Compiler_Required_Switches => No_Name_List,
- Compilation_PIC_Option => No_Name_List,
- Runtime_Library_Dir => No_Name,
- Mapping_File_Switches => No_Name_List,
- Mapping_Spec_Suffix => No_File,
- Mapping_Body_Suffix => No_File,
- Config_File_Switches => No_Name_List,
- Dependency_Kind => Makefile,
- Dependency_Option => No_Name_List,
- Compute_Dependency => No_Name_List,
- Include_Option => No_Name_List,
- Include_Path => No_Name,
- Include_Path_File => No_Name,
- Objects_Path => No_Name,
- Objects_Path_File => No_Name,
- Config_Body => No_Name,
- Config_Spec => No_Name,
- Config_Body_Pattern => No_Name,
- Config_Spec_Pattern => No_Name,
- Config_File_Unique => False,
- Binder_Driver => No_File,
- Binder_Driver_Path => No_Path,
- Binder_Required_Switches => No_Name_List,
- Binder_Prefix => No_Name,
- Toolchain_Version => No_Name,
- Toolchain_Description => No_Name,
- PIC_Option => No_Name,
- Objects_Generated => True);
+ (Kind => File_Based,
+ Naming_Data => No_Lang_Naming_Data,
+ Include_Compatible_Languages => No_Name_List,
+ Compiler_Driver => No_File,
+ Compiler_Driver_Path => null,
+ Compiler_Required_Switches => No_Name_List,
+ Compilation_PIC_Option => No_Name_List,
+ Runtime_Library_Dir => No_Name,
+ Mapping_File_Switches => No_Name_List,
+ Mapping_Spec_Suffix => No_File,
+ Mapping_Body_Suffix => No_File,
+ Config_File_Switches => No_Name_List,
+ Dependency_Kind => Makefile,
+ Dependency_Option => No_Name_List,
+ Compute_Dependency => No_Name_List,
+ Include_Option => No_Name_List,
+ Include_Path => No_Name,
+ Include_Path_File => No_Name,
+ Objects_Path => No_Name,
+ Objects_Path_File => No_Name,
+ Config_Body => No_Name,
+ Config_Spec => No_Name,
+ Config_Body_Pattern => No_Name,
+ Config_Spec_Pattern => No_Name,
+ Config_File_Unique => False,
+ Binder_Driver => No_File,
+ Binder_Driver_Path => No_Path,
+ Binder_Required_Switches => No_Name_List,
+ Binder_Prefix => No_Name,
+ Toolchain_Version => No_Name,
+ Toolchain_Description => No_Name,
+ PIC_Option => No_Name,
+ Objects_Generated => True);
type Language_Data is record
Name : Name_Id := No_Name;
Lang_Kind : Language_Kind := File_Based;
-- Kind of the language
+ Compiled : Boolean := True;
+ -- False when there is no compiler for the language
+
Alternate_Languages : Alternate_Language_Id := No_Alternate_Language;
-- List of languages a header file may also be, in addition of
-- language Language_Name.
Object_Path : Path_Name_Type := No_Path;
-- Object path of the real object file
- Object_TS : Time_Stamp_Type := Empty_Time_Stamp;
+ Object_TS : Time_Stamp_Type := Empty_Time_Stamp;
-- Object file time stamp
- Dep_Name : File_Name_Type := No_File;
+ Dep_Name : File_Name_Type := No_File;
-- Dependency file simple name
- Current_Dep_Path : Path_Name_Type := No_Path;
+ Current_Dep_Path : Path_Name_Type := No_Path;
-- Path name of an existing dependency file
- Dep_Path : Path_Name_Type := No_Path;
+ Dep_Path : Path_Name_Type := No_Path;
-- Path name of the real dependency file
- Dep_TS : Time_Stamp_Type := Empty_Time_Stamp;
+ Dep_TS : Time_Stamp_Type := Empty_Time_Stamp;
-- Dependency file time stamp
- Switches : File_Name_Type := No_File;
+ Switches : File_Name_Type := No_File;
-- File name of the switches file
- Switches_Path : Path_Name_Type := No_Path;
+ Switches_Path : Path_Name_Type := No_Path;
-- Path name of the switches file
- Switches_TS : Time_Stamp_Type := Empty_Time_Stamp;
+ Switches_TS : Time_Stamp_Type := Empty_Time_Stamp;
-- Switches file time stamp
- Naming_Exception : Boolean := False;
+ Naming_Exception : Boolean := False;
-- True if the source has an exceptional name
- Next_In_Sources : Source_Id := No_Source;
+ Next_In_Sources : Source_Id := No_Source;
-- Link to another source in the project tree
- Next_In_Project : Source_Id := No_Source;
+ Next_In_Project : Source_Id := No_Source;
-- Link to another source in the project
- Next_In_Lang : Source_Id := No_Source;
+ Next_In_Lang : Source_Id := No_Source;
-- Link to another source of the same language
end record;
Language_Name => No_Name,
Language => No_Language_Index,
Lang_Kind => File_Based,
+ Compiled => True,
Alternate_Languages => No_Alternate_Language,
Kind => Spec,
Dependency => None,
-- The name of the executable to build archives, with the minimum
-- switches. Specified in the configuration.
+ Archive_Builder_Append_Option : Name_List_Index := No_Name_List;
+ -- The options to append object files to an archive
+
Archive_Indexer : Name_List_Index := No_Name_List;
-- The name of the executable to index archives, with the minimum
-- switches. Specified in the configuration.
end record;
Default_Project_Config : constant Project_Configuration :=
- (Run_Path_Option => No_Name_List,
- Executable_Suffix => No_Name,
- Linker => No_Path,
- Minimum_Linker_Options => No_Name_List,
- Linker_Executable_Option => No_Name_List,
- Linker_Lib_Dir_Option => No_Name,
- Linker_Lib_Name_Option => No_Name,
- Library_Builder => No_Path,
- Lib_Support => None,
- Archive_Builder => No_Name_List,
- Archive_Indexer => No_Name_List,
- Archive_Suffix => No_File,
- Lib_Partial_Linker => No_Name_List,
- Shared_Lib_Prefix => No_File,
- Shared_Lib_Suffix => No_File,
- Shared_Lib_Min_Options => No_Name_List,
- Lib_Version_Options => No_Name_List,
- Symbolic_Link_Supported => False,
- Lib_Maj_Min_Id_Supported => False,
- Auto_Init_Supported => False);
+ (Run_Path_Option => No_Name_List,
+ Executable_Suffix => No_Name,
+ Linker => No_Path,
+ Minimum_Linker_Options => No_Name_List,
+ Linker_Executable_Option => No_Name_List,
+ Linker_Lib_Dir_Option => No_Name,
+ Linker_Lib_Name_Option => No_Name,
+ Library_Builder => No_Path,
+ Lib_Support => None,
+ Archive_Builder => No_Name_List,
+ Archive_Builder_Append_Option => No_Name_List,
+ Archive_Indexer => No_Name_List,
+ Archive_Suffix => No_File,
+ Lib_Partial_Linker => No_Name_List,
+ Shared_Lib_Prefix => No_File,
+ Shared_Lib_Suffix => No_File,
+ Shared_Lib_Min_Options => No_Name_List,
+ Lib_Version_Options => No_Name_List,
+ Symbolic_Link_Supported => False,
+ Lib_Maj_Min_Id_Supported => False,
+ Auto_Init_Supported => False);
-- The following record describes a project file representation
-- separator.
type Project_Data is record
+ Qualifier : Project_Qualifier := Unspecified;
+ -- The eventual qualifier for this project
+
Externally_Built : Boolean := False;
-- True if the project is externally built. In such case, the Project
-- Manager will not modify anything in this project.
Supp_Languages : Supp_Language_Index := No_Supp_Language_Index;
-- Indicate the different languages of the source of this project
- Ada_Sources_Present : Boolean := True;
+ Ada_Sources_Present : Boolean := True;
-- True if there are Ada sources in the project
- Other_Sources_Present : Boolean := True;
+ Other_Sources_Present : Boolean := True;
-- True if there are sources from languages other than Ada in the
-- project.
- First_Other_Source : Other_Source_Id := No_Other_Source;
+ First_Other_Source : Other_Source_Id := No_Other_Source;
-- First source of a language other than Ada
- Last_Other_Source : Other_Source_Id := No_Other_Source;
+ Last_Other_Source : Other_Source_Id := No_Other_Source;
-- Last source of a language other than Ada
- First_Lang_Processing : First_Language_Processing_Data :=
- Default_First_Language_Processing_Data;
+ First_Lang_Processing : First_Language_Processing_Data :=
+ Default_First_Language_Processing_Data;
Supp_Language_Processing : Supp_Language_Index :=
No_Supp_Language_Index;
-- Language configurations
-- normally forbidden for project names, there cannot be any name clash.
Empty_Name : Name_Id;
- -- Name_Id for an empty name (no characters). Initialized by the call
- -- to procedure Initialize.
+ -- Name_Id for an empty name (no characters). Initialized in procedure
+ -- Initialize.
+
+ Empty_File_Name : File_Name_Type;
+ -- Empty File_Name_Type (no characters). Initialized in procedure
+ -- Initialize.
procedure Add_To_Buffer
(S : String;
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Debug; use Debug;
with Osint; use Osint;
with Opt; use Opt;
+with Prj; use Prj;
with Prj.Ext; use Prj.Ext;
with Table;
when False =>
-- All switches that don't start with -gnat stay as is,
- -- except -v, -E and -pg
+ -- except -pg, -Wall, -k8, -w
- if Switch_Chars = "-pg" then
+ if Switch_Chars = "-pg" or else Switch_Chars = "-p" then
-- The gcc driver converts -pg to -p, so that is what
-- is stored in the ALI file.
Add_Switch_Component ("-p");
- -- Do not take into account switches that are not transmitted
- -- to gnat1 by the gcc driver.
+ elsif Switch_Chars = "-Wall" then
- elsif C /= 'v' and then C /= 'E' then
+ -- The gcc driver adds -gnatwa when -Wall is used
+
+ Add_Switch_Component ("-gnatwa");
+ Add_Switch_Component ("-Wall");
+
+ elsif Switch_Chars = "-k8" then
+
+ -- The gcc driver transforms -k8 into -gnatk8
+
+ Add_Switch_Component ("-gnatk8");
+
+ elsif Switch_Chars = "-w" then
+
+ -- The gcc driver adds -gnatws when -w is used
+
+ Add_Switch_Component ("-gnatws");
+ Add_Switch_Component ("-w");
+
+ elsif Switch_Chars'Length > 6
+ and then
+ Switch_Chars (Switch_Chars'First .. Switch_Chars'First + 5)
+ = "--RTS="
+ then
Add_Switch_Component (Switch_Chars);
+
+ -- When --RTS=mtp is used, the gcc driver adds -mrtp
+
+ if Switch_Chars = "--RTS=mtp" then
+ Add_Switch_Component ("-mrtp");
+ end if;
+
+ -- Take only into account switches that are transmitted to
+ -- gnat1 by the gcc driver and stored by gnat1 in the ALI file.
+
+ else
+ case C is
+ when 'O' | 'W' | 'w' | 'f' | 'd' | 'g' | 'm' =>
+ Add_Switch_Component (Switch_Chars);
+
+ when others =>
+ null;
+ end case;
end if;
return;
Ptr := Ptr + 1;
if Ptr <= Max
- and then Switch_Chars (Ptr) = 's' then
+ and then Switch_Chars (Ptr) = 's'
+ then
Last_Stored := Last_Stored + 1;
Storing (Last_Stored) := 's';
Ptr := Ptr + 1;
-- -gnatyMxxx
- if C = 'M' and then
- Storing (First_Stored) = 'y'
- then
+ if C = 'M' and then Storing (First_Stored) = 'y' then
Last_Stored := First_Stored + 1;
Storing (Last_Stored) := 'M';
-
while Ptr <= Max loop
C := Switch_Chars (Ptr);
exit when C not in '0' .. '9';
if Switch_Chars = "--create-missing-dirs" then
Setup_Projects := True;
- elsif Switch_Chars'Length > 3 and then
- Switch_Chars (Ptr .. Ptr + 1) = "aP"
+ elsif Switch_Chars'Length > Subdirs_Option'Length
+ and then
+ Switch_Chars
+ (Switch_Chars'First ..
+ Switch_Chars'First + Subdirs_Option'Length - 1) =
+ Subdirs_Option
+ then
+ Subdirs :=
+ new String'
+ (Switch_Chars
+ (Switch_Chars'First + Subdirs_Option'Length ..
+ Switch_Chars'Last));
+
+ elsif Switch_Chars (Ptr) = '-' then
+ Bad_Switch (Switch_Chars);
+
+ elsif Switch_Chars'Length > 3
+ and then Switch_Chars (Ptr .. Ptr + 1) = "aP"
then
Add_Search_Project_Directory
(Switch_Chars (Ptr + 2 .. Switch_Chars'Last));