diff options
author | Jing Yu <jingyu@google.com> | 2009-11-05 15:11:04 -0800 |
---|---|---|
committer | Jing Yu <jingyu@google.com> | 2009-11-05 15:11:04 -0800 |
commit | df62c1c110e8532b995b23540b7e3695729c0779 (patch) | |
tree | dbbd4cbdb50ac38011e058a2533ee4c3168b0205 /gcc-4.2.1/gcc/ada/prj.ads | |
parent | 8d401cf711539af5a2f78d12447341d774892618 (diff) | |
download | toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.tar.gz toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.tar.bz2 toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.zip |
Check in gcc sources for prebuilt toolchains in Eclair.
Diffstat (limited to 'gcc-4.2.1/gcc/ada/prj.ads')
-rw-r--r-- | gcc-4.2.1/gcc/ada/prj.ads | 1088 |
1 files changed, 1088 insertions, 0 deletions
diff --git a/gcc-4.2.1/gcc/ada/prj.ads b/gcc-4.2.1/gcc/ada/prj.ads new file mode 100644 index 000000000..474920460 --- /dev/null +++ b/gcc-4.2.1/gcc/ada/prj.ads @@ -0,0 +1,1088 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- P R J -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 2001-2005, 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- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- +-- Boston, MA 02110-1301, USA. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- The following package declares the data types for GNAT project. +-- These data types may be used by GNAT Project-aware tools. + +-- Children of these package implements various services on these data types. +-- See in particular Prj.Pars and Prj.Env. + +with Casing; use Casing; +with Scans; use Scans; +with Table; +with Types; use Types; + +with GNAT.Dynamic_HTables; use GNAT.Dynamic_HTables; +with GNAT.Dynamic_Tables; +with GNAT.OS_Lib; use GNAT.OS_Lib; + +with System.HTable; + +package Prj is + + All_Packages : constant String_List_Access; + -- Default value of parameter Packages of procedures Parse, in Prj.Pars and + -- Prj.Part, indicating that all packages should be checked. + + type Project_Tree_Data; + type Project_Tree_Ref is access all Project_Tree_Data; + -- Reference to a project tree. + -- Several project trees may exist in memory at the same time. + + No_Project_Tree : constant Project_Tree_Ref; + + function Default_Ada_Spec_Suffix return Name_Id; + pragma Inline (Default_Ada_Spec_Suffix); + -- The Name_Id for the standard GNAT suffix for Ada spec source file + -- name ".ads". Initialized by Prj.Initialize. + + function Default_Ada_Body_Suffix return Name_Id; + pragma Inline (Default_Ada_Body_Suffix); + -- The Name_Id for the standard GNAT suffix for Ada body source file + -- name ".adb". Initialized by Prj.Initialize. + + function Slash return Name_Id; + pragma Inline (Slash); + -- "/", used as the path of locally removed files + + Project_File_Extension : String := ".gpr"; + -- The standard project file name extension. It is not a constant, because + -- Canonical_Case_File_Name is called on this variable in the body of Prj. + + type Error_Warning is (Silent, Warning, Error); + -- Severity of some situations, such as: no Ada sources in a project where + -- Ada is one of the language. + -- + -- When the situation occurs, the behaviour depends on the setting: + -- + -- - Silent: no action + -- - Warning: issue a warning, does not cause the tool to fail + -- - Error: issue an error, causes the tool to fail + + ----------------------------------------------------- + -- Multi-language Stuff That Will be Modified Soon -- + ----------------------------------------------------- + + -- Still should be properly commented ??? + + type Language_Index is new Nat; + + No_Language_Index : constant Language_Index := 0; + First_Language_Index : constant Language_Index := 1; + First_Language_Indexes_Last : constant Language_Index := 5; + + Ada_Language_Index : constant Language_Index := + First_Language_Index; + C_Language_Index : constant Language_Index := + Ada_Language_Index + 1; + C_Plus_Plus_Language_Index : constant Language_Index := + C_Language_Index + 1; + + Last_Language_Index : Language_Index := No_Language_Index; + + subtype First_Language_Indexes is Language_Index + range First_Language_Index .. First_Language_Indexes_Last; + + type Header_Num is range 0 .. 2047; + + function Hash is new System.HTable.Hash (Header_Num => Header_Num); + + function Hash (Name : Name_Id) return Header_Num; + + package Language_Indexes is new System.HTable.Simple_HTable + (Header_Num => Header_Num, + Element => Language_Index, + No_Element => No_Language_Index, + Key => Name_Id, + Hash => Hash, + Equal => "="); + -- Mapping of language names to language indexes + + package Language_Names is new Table.Table + (Table_Component_Type => Name_Id, + Table_Index_Type => Language_Index, + Table_Low_Bound => 1, + Table_Initial => 4, + Table_Increment => 100, + Table_Name => "Prj.Language_Names"); + -- The table for the name of programming languages + + procedure Add_Language_Name (Name : Name_Id); + + procedure Display_Language_Name (Language : Language_Index); + + type Languages_In_Project is array (First_Language_Indexes) of Boolean; + -- Set of supported languages used in a project + + No_Languages : constant Languages_In_Project := (others => False); + -- No supported languages are used + + type Supp_Language_Index is new Nat; + No_Supp_Language_Index : constant Supp_Language_Index := 0; + + type Supp_Language is record + Index : Language_Index := No_Language_Index; + Present : Boolean := False; + Next : Supp_Language_Index := No_Supp_Language_Index; + end record; + + package Present_Language_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Supp_Language, + Table_Index_Type => Supp_Language_Index, + Table_Low_Bound => 1, + Table_Initial => 4, + Table_Increment => 100); + -- The table for the presence of languages with an index that is outside + -- of First_Language_Indexes. + + type Impl_Suffix_Array is array (First_Language_Indexes) of Name_Id; + -- Suffixes for the non spec sources of the different supported languages + -- in a project. + + No_Impl_Suffixes : constant Impl_Suffix_Array := (others => No_Name); + -- A default value for the non spec source suffixes + + type Supp_Suffix is record + Index : Language_Index := No_Language_Index; + Suffix : Name_Id := No_Name; + Next : Supp_Language_Index := No_Supp_Language_Index; + end record; + + package Supp_Suffix_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Supp_Suffix, + Table_Index_Type => Supp_Language_Index, + Table_Low_Bound => 1, + Table_Initial => 4, + Table_Increment => 100); + -- The table for the presence of languages with an index that is outside + -- of First_Language_Indexes. + + type Language_Kind is (GNU, other); + + type Name_List_Index is new Nat; + No_Name_List : constant Name_List_Index := 0; + + type Name_Node is record + Name : Name_Id := No_Name; + Next : Name_List_Index := No_Name_List; + end record; + + package Name_List_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Name_Node, + Table_Index_Type => Name_List_Index, + Table_Low_Bound => 1, + Table_Initial => 10, + Table_Increment => 100); + -- The table for lists of names used in package Language_Processing + + type Language_Processing_Data is record + Compiler_Drivers : Name_List_Index := No_Name_List; + Compiler_Paths : Name_Id := No_Name; + Compiler_Kinds : Language_Kind := GNU; + Dependency_Options : Name_List_Index := No_Name_List; + Compute_Dependencies : Name_List_Index := No_Name_List; + Include_Options : Name_List_Index := No_Name_List; + Binder_Drivers : Name_Id := No_Name; + Binder_Driver_Paths : Name_Id := No_Name; + end record; + + Default_Language_Processing_Data : + constant Language_Processing_Data := + (Compiler_Drivers => No_Name_List, + Compiler_Paths => No_Name, + Compiler_Kinds => GNU, + Dependency_Options => No_Name_List, + Compute_Dependencies => No_Name_List, + Include_Options => No_Name_List, + Binder_Drivers => No_Name, + Binder_Driver_Paths => No_Name); + + type First_Language_Processing_Data is + array (First_Language_Indexes) of Language_Processing_Data; + + Default_First_Language_Processing_Data : + constant First_Language_Processing_Data := + (others => Default_Language_Processing_Data); + + type Supp_Language_Data is record + Index : Language_Index := No_Language_Index; + Data : Language_Processing_Data := Default_Language_Processing_Data; + Next : Supp_Language_Index := No_Supp_Language_Index; + end record; + + package Supp_Language_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Supp_Language_Data, + Table_Index_Type => Supp_Language_Index, + Table_Low_Bound => 1, + Table_Initial => 4, + Table_Increment => 100); + -- The table for language data when there are more languages than + -- in First_Language_Indexes. + + type Other_Source_Id is new Nat; + No_Other_Source : constant Other_Source_Id := 0; + + type Other_Source is record + Language : Language_Index; -- language of the source + File_Name : Name_Id; -- source file simple name + Path_Name : Name_Id; -- source full path name + Source_TS : Time_Stamp_Type; -- source file time stamp + Object_Name : Name_Id; -- object file simple name + Object_Path : Name_Id; -- object full path name + Object_TS : Time_Stamp_Type; -- object file time stamp + Dep_Name : Name_Id; -- dependency file simple name + Dep_Path : Name_Id; -- dependency full path name + Dep_TS : Time_Stamp_Type; -- dependency file time stamp + Naming_Exception : Boolean := False; -- True if a naming exception + Next : Other_Source_Id := No_Other_Source; + end record; + -- Data for a source in a language other than Ada + + package Other_Source_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Other_Source, + Table_Index_Type => Other_Source_Id, + Table_Low_Bound => 1, + Table_Initial => 200, + Table_Increment => 100); + -- The table for sources of languages other than Ada + + ---------------------------------- + -- End of multi-language stuff -- + ---------------------------------- + + type Verbosity is (Default, Medium, High); + -- Verbosity when parsing GNAT Project Files + -- Default is default (very quiet, if no errors). + -- Medium is more verbose. + -- High is extremely verbose. + + Current_Verbosity : Verbosity := Default; + -- The current value of the verbosity the project files are parsed with + + type Lib_Kind is (Static, Dynamic, Relocatable); + type Policy is (Autonomous, Compliant, Controlled, Restricted); + -- Type to specify the symbol policy, when symbol control is supported. + -- See full explanation about this type in package Symbols. + -- Autonomous: Create a symbol file without considering any reference + -- Compliant: Try to be as compatible as possible with an existing ref + -- Controlled: Fail if symbols are not the same as those in the reference + -- Restricted: Restrict the symbols to those in the symbol file + + type Symbol_Record is record + Symbol_File : Name_Id := No_Name; + Reference : Name_Id := No_Name; + Symbol_Policy : Policy := Autonomous; + end record; + -- Type to keep the symbol data to be used when building a shared library + + No_Symbols : constant Symbol_Record := + (Symbol_File => No_Name, + Reference => No_Name, + Symbol_Policy => Autonomous); + -- The default value of the symbol data + + function Empty_String return Name_Id; + -- Return the Name_Id for an empty string "" + + type Project_Id is new Nat; + No_Project : constant Project_Id := 0; + -- Id of a Project File + + type String_List_Id is new Nat; + Nil_String : constant String_List_Id := 0; + type String_Element is record + Value : Name_Id := No_Name; + Index : Int := 0; + Display_Value : Name_Id := No_Name; + Location : Source_Ptr := No_Location; + Flag : Boolean := False; + Next : String_List_Id := Nil_String; + end record; + -- To hold values for string list variables and array elements. + -- Component Flag may be used for various purposes. For source + -- directories, it indicates if the directory contains Ada source(s). + + package String_Element_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => String_Element, + Table_Index_Type => String_List_Id, + Table_Low_Bound => 1, + Table_Initial => 200, + Table_Increment => 100); + -- The table for string elements in string lists + + type Variable_Kind is (Undefined, List, Single); + -- Different kinds of variables + + subtype Defined_Variable_Kind is Variable_Kind range List .. Single; + -- The defined kinds of variables + + Ignored : constant Variable_Kind; + -- Used to indicate that a package declaration must be ignored + -- while processing the project tree (unknown package name). + + type Variable_Value (Kind : Variable_Kind := Undefined) is record + Project : Project_Id := No_Project; + Location : Source_Ptr := No_Location; + Default : Boolean := False; + case Kind is + when Undefined => + null; + when List => + Values : String_List_Id := Nil_String; + when Single => + Value : Name_Id := No_Name; + Index : Int := 0; + end case; + end record; + -- Values for variables and array elements. Default is True if the + -- current value is the default one for the variable + + Nil_Variable_Value : constant Variable_Value; + -- Value of a non existing variable or array element + + type Variable_Id is new Nat; + No_Variable : constant Variable_Id := 0; + type Variable is record + Next : Variable_Id := No_Variable; + Name : Name_Id; + Value : Variable_Value; + end record; + -- To hold the list of variables in a project file and in packages + + package Variable_Element_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Variable, + Table_Index_Type => Variable_Id, + Table_Low_Bound => 1, + Table_Initial => 200, + Table_Increment => 100); + -- The table of variable in list of variables + + type Array_Element_Id is new Nat; + No_Array_Element : constant Array_Element_Id := 0; + type Array_Element is record + Index : Name_Id; + Src_Index : Int := 0; + Index_Case_Sensitive : Boolean := True; + Value : Variable_Value; + Next : Array_Element_Id := No_Array_Element; + end record; + -- Each Array_Element represents an array element and is linked (Next) + -- to the next array element, if any, in the array. + + package Array_Element_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Array_Element, + Table_Index_Type => Array_Element_Id, + Table_Low_Bound => 1, + Table_Initial => 200, + Table_Increment => 100); + -- The table that contains all array elements + + type Array_Id is new Nat; + No_Array : constant Array_Id := 0; + type Array_Data is record + Name : Name_Id := No_Name; + Value : Array_Element_Id := No_Array_Element; + Next : Array_Id := No_Array; + end record; + -- Each Array_Data value represents an array. + -- Value is the id of the first element. + -- Next is the id of the next array in the project file or package. + + package Array_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Array_Data, + Table_Index_Type => Array_Id, + Table_Low_Bound => 1, + Table_Initial => 200, + Table_Increment => 100); + -- The table that contains all arrays + + type Package_Id is new Nat; + No_Package : constant Package_Id := 0; + type Declarations is record + Variables : Variable_Id := No_Variable; + Attributes : Variable_Id := No_Variable; + Arrays : Array_Id := No_Array; + Packages : Package_Id := No_Package; + end record; + -- Contains the declarations (variables, single and array attributes, + -- packages) for a project or a package in a project. + + No_Declarations : constant Declarations := + (Variables => No_Variable, + Attributes => No_Variable, + Arrays => No_Array, + Packages => No_Package); + -- Default value of Declarations: indicates that there is no declarations + + type Package_Element is record + Name : Name_Id := No_Name; + Decl : Declarations := No_Declarations; + Parent : Package_Id := No_Package; + Next : Package_Id := No_Package; + end record; + -- A package (includes declarations that may include other packages) + + package Package_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Package_Element, + Table_Index_Type => Package_Id, + Table_Low_Bound => 1, + Table_Initial => 100, + Table_Increment => 100); + -- The table that contains all packages + + function Image (Casing : Casing_Type) return String; + -- Similar to 'Image (but avoid use of this attribute in compiler) + + function Value (Image : String) return Casing_Type; + -- Similar to 'Value (but avoid use of this attribute in compiler) + -- Raises Constraint_Error if not a Casing_Type image. + + -- The following record contains data for a naming scheme + + type Naming_Data is record + + Dot_Replacement : Name_Id := No_Name; + -- The string to replace '.' in the source file name (for Ada) + + Dot_Repl_Loc : Source_Ptr := No_Location; + -- The position in the project file source where Dot_Replacement is + -- defined. + + Casing : Casing_Type := All_Lower_Case; + -- The casing of the source file name (for Ada) + + Spec_Suffix : Array_Element_Id := No_Array_Element; + -- The string to append to the unit name for the + -- source file name of a spec. + -- Indexed by the programming language. + + Ada_Spec_Suffix : Name_Id := No_Name; + -- The suffix of the Ada spec sources + + Spec_Suffix_Loc : Source_Ptr := No_Location; + -- The position in the project file source where + -- Ada_Spec_Suffix is defined. + + Impl_Suffixes : Impl_Suffix_Array := No_Impl_Suffixes; + Supp_Suffixes : Supp_Language_Index := No_Supp_Language_Index; + -- The source suffixes of the different languages + + Body_Suffix : Array_Element_Id := No_Array_Element; + -- The string to append to the unit name for the + -- source file name of a body. + -- Indexed by the programming language. + + Ada_Body_Suffix : Name_Id := No_Name; + -- The suffix of the Ada body sources + + Body_Suffix_Loc : Source_Ptr := No_Location; + -- The position in the project file source where + -- Ada_Body_Suffix is defined. + + Separate_Suffix : Name_Id := No_Name; + -- String to append to unit name for source file name of an Ada subunit + + Sep_Suffix_Loc : Source_Ptr := No_Location; + -- Position in the project file source where Separate_Suffix is defined + + Specs : Array_Element_Id := No_Array_Element; + -- An associative array mapping individual specs to source file names + -- This is specific to Ada. + + Bodies : Array_Element_Id := No_Array_Element; + -- An associative array mapping individual bodies to source file names + -- This is specific to Ada. + + Specification_Exceptions : Array_Element_Id := No_Array_Element; + -- An associative array listing spec file names that do not have the + -- spec suffix. Not used by Ada. Indexed by programming language name. + + Implementation_Exceptions : Array_Element_Id := No_Array_Element; + -- An associative array listing body file names that do not have the + -- body suffix. Not used by Ada. Indexed by programming language name. + + end record; + + function Standard_Naming_Data + (Tree : Project_Tree_Ref := No_Project_Tree) return Naming_Data; + pragma Inline (Standard_Naming_Data); + -- The standard GNAT naming scheme when Tree is No_Project_Tree. + -- Otherwise, return the default naming scheme for the project tree Tree, + -- which must have been Initialized. + + function Same_Naming_Scheme + (Left, Right : Naming_Data) return Boolean; + -- Returns True if Left and Right are the same naming scheme + -- not considering Specs and Bodies. + + type Project_List is new Nat; + Empty_Project_List : constant Project_List := 0; + -- A list of project files + + type Project_Element is record + Project : Project_Id := No_Project; + Next : Project_List := Empty_Project_List; + end record; + -- Element in a list of project files. Next is the id of the next + -- project file in the list. + + package Project_List_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Project_Element, + Table_Index_Type => Project_List, + Table_Low_Bound => 1, + Table_Initial => 100, + Table_Increment => 100); + -- The table that contains the lists of project files + + -- The following record describes a project file representation + + type Project_Data is record + Externally_Built : Boolean := False; + + Languages : Languages_In_Project := No_Languages; + Supp_Languages : Supp_Language_Index := No_Supp_Language_Index; + -- Indicate the different languages of the source of this project + + First_Referred_By : Project_Id := No_Project; + -- The project, if any, that was the first to be known as importing or + -- extending this project. Set by Prj.Proc.Process. + + Name : Name_Id := No_Name; + -- The name of the project. Set by Prj.Proc.Process + + Display_Name : Name_Id := No_Name; + -- The name of the project with the spelling of its declaration. + -- Set by Prj.Proc.Process. + + Path_Name : Name_Id := No_Name; + -- The path name of the project file. Set by Prj.Proc.Process + + Display_Path_Name : Name_Id := No_Name; + -- The path name used for display purposes. May be different from + -- Path_Name for platforms where the file names are case-insensitive. + + Virtual : Boolean := False; + -- True for virtual extending projects + + Location : Source_Ptr := No_Location; + -- The location in the project file source of the reserved word + -- project. Set by Prj.Proc.Process. + + Mains : String_List_Id := Nil_String; + -- List of mains specified by attribute Main. Set by Prj.Nmsc.Check + + Directory : Name_Id := No_Name; + -- Directory where the project file resides. Set by Prj.Proc.Process + + Display_Directory : Name_Id := No_Name; + -- comment ??? + + Dir_Path : String_Access; + -- Same as Directory, but as an access to String. Set by + -- Make.Compile_Sources.Collect_Arguments_And_Compile. + + Library : Boolean := False; + -- True if this is a library project. Set by + -- Prj.Nmsc.Language_Independent_Check. + + Library_Dir : Name_Id := No_Name; + -- If a library project, directory where resides the library Set by + -- Prj.Nmsc.Language_Independent_Check. + + Display_Library_Dir : Name_Id := No_Name; + -- The name of the library directory, for display purposes. May be + -- different from Library_Dir for platforms where the file names are + -- case-insensitive. + + Library_TS : Time_Stamp_Type := Empty_Time_Stamp; + -- The timestamp of a library file in a library project. + -- Set by MLib.Prj.Check_Library. + + Library_Src_Dir : Name_Id := No_Name; + -- If a Stand-Alone Library project, directory where the sources + -- of the interfaces of the library are copied. By default, if + -- attribute Library_Src_Dir is not specified, sources of the interfaces + -- are not copied anywhere. Set by Prj.Nmsc.Check_Stand_Alone_Library. + + Display_Library_Src_Dir : Name_Id := No_Name; + -- The name of the library source directory, for display purposes. + -- May be different from Library_Src_Dir for platforms where the file + -- names are case-insensitive. + + Library_ALI_Dir : Name_Id := No_Name; + -- In a library project, directory where the ALI files are copied. + -- If attribute Library_ALI_Dir is not specified, ALI files are + -- copied in the Library_Dir. Set by Prj.Nmsc.Check_Library_Attributes. + + Display_Library_ALI_Dir : Name_Id := No_Name; + -- The name of the library ALI directory, for display purposes. May be + -- different from Library_ALI_Dir for platforms where the file names are + -- case-insensitive. + + Library_Name : Name_Id := No_Name; + -- If a library project, name of the library + -- Set by Prj.Nmsc.Language_Independent_Check. + + Library_Kind : Lib_Kind := Static; + -- If a library project, kind of library + -- Set by Prj.Nmsc.Language_Independent_Check. + + Lib_Internal_Name : Name_Id := No_Name; + -- If a library project, internal name store inside the library Set by + -- Prj.Nmsc.Language_Independent_Check. + + Standalone_Library : Boolean := False; + -- Indicate that this is a Standalone Library Project File. Set by + -- Prj.Nmsc.Check. + + Lib_Interface_ALIs : String_List_Id := Nil_String; + -- For Standalone Library Project Files, indicate the list of Interface + -- ALI files. Set by Prj.Nmsc.Check. + + Lib_Auto_Init : Boolean := False; + -- For non static Standalone Library Project Files, indicate if + -- the library initialisation should be automatic. + + Symbol_Data : Symbol_Record := No_Symbols; + -- Symbol file name, reference symbol file name, symbol policy + + Ada_Sources_Present : Boolean := True; + -- A flag that indicates if there are Ada sources in this project file. + -- There are no sources if any of the following is true: + -- 1) Source_Dirs is specified as an empty list + -- 2) Source_Files is specified as an empty list + -- 3) Ada is not in the list of the specified Languages + + Other_Sources_Present : Boolean := True; + -- A flag that indicates that there are non-Ada sources in this project + + Sources : String_List_Id := Nil_String; + -- The list of all the source file names. + -- Set by Prj.Nmsc.Check_Ada_Naming_Scheme. + + First_Other_Source : Other_Source_Id := No_Other_Source; + Last_Other_Source : Other_Source_Id := No_Other_Source; + -- Head and tail of the list of sources of languages other than Ada + + Imported_Directories_Switches : Argument_List_Access := null; + -- List of the -I switches to be used when compiling sources of + -- languages other than Ada. + + Include_Path : String_Access := null; + -- Value to be used as CPATH, when using a GCC, instead of a list of + -- -I switches. + + Include_Data_Set : Boolean := False; + -- Set True when Imported_Directories_Switches or Include_Path are set + + Source_Dirs : String_List_Id := Nil_String; + -- The list of all the source directories. + -- Set by Prj.Nmsc.Language_Independent_Check. + + Known_Order_Of_Source_Dirs : Boolean := True; + -- False, if there is any /** in the Source_Dirs, because in this case + -- the ordering of the source subdirs depend on the OS. If True, + -- duplicate file names in the same project file are allowed. + + Object_Directory : Name_Id := No_Name; + -- The object directory of this project file. + -- Set by Prj.Nmsc.Language_Independent_Check. + + Display_Object_Dir : Name_Id := No_Name; + -- The name of the object directory, for display purposes. + -- May be different from Object_Directory for platforms where the file + -- names are case-insensitive. + + Exec_Directory : Name_Id := No_Name; + -- The exec directory of this project file. Default is equal to + -- Object_Directory. Set by Prj.Nmsc.Language_Independent_Check. + + Display_Exec_Dir : Name_Id := No_Name; + -- The name of the exec directory, for display purposes. May be + -- different from Exec_Directory for platforms where the file names are + -- case-insensitive. + + Extends : Project_Id := No_Project; + -- The reference of the project file, if any, that this project file + -- extends. Set by Prj.Proc.Process. + + Extended_By : Project_Id := No_Project; + -- The reference of the project file, if any, that extends this project + -- file. Set by Prj.Proc.Process. + + Naming : Naming_Data := Standard_Naming_Data; + -- The naming scheme of this project file. + -- Set by Prj.Nmsc.Check_Naming_Scheme. + + First_Language_Processing : First_Language_Processing_Data := + Default_First_Language_Processing_Data; + -- Comment needed ??? + + Supp_Language_Processing : Supp_Language_Index := No_Supp_Language_Index; + -- Comment needed + + Default_Linker : Name_Id := No_Name; + Default_Linker_Path : Name_Id := No_Name; + + Decl : Declarations := No_Declarations; + -- The declarations (variables, attributes and packages) of this + -- project file. Set by Prj.Proc.Process. + + Imported_Projects : Project_List := Empty_Project_List; + -- The list of all directly imported projects, if any. Set by + -- Prj.Proc.Process. + + All_Imported_Projects : Project_List := Empty_Project_List; + -- The list of all projects imported directly or indirectly, if any. + -- Set by Make.Initialize. + + Ada_Include_Path : String_Access := null; + -- The cached value of ADA_INCLUDE_PATH for this project file. Do not + -- use this field directly outside of the compiler, use + -- Prj.Env.Ada_Include_Path instead. Set by Prj.Env.Ada_Include_Path. + + 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. Set by Prj.Env.Ada_Objects_Path + + Include_Path_File : Name_Id := No_Name; + -- The cached value of the source path temp file for this project file. + -- Set by gnatmake (Prj.Env.Set_Ada_Paths). + + Objects_Path_File_With_Libs : Name_Id := No_Name; + -- The cached value of the object path temp file (including library + -- dirs) for this project file. Set by gnatmake (Prj.Env.Set_Ada_Paths). + + Objects_Path_File_Without_Libs : Name_Id := No_Name; + -- The cached value of the object path temp file (excluding library + -- dirs) for this project file. Set by gnatmake (Prj.Env.Set_Ada_Paths). + + Config_File_Name : Name_Id := No_Name; + -- The name of the configuration pragmas file, if any. + -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File). + + Config_File_Temp : Boolean := False; + -- An indication that the configuration pragmas file is + -- a temporary file that must be deleted at the end. + -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File). + + Config_Checked : Boolean := False; + -- A flag to avoid checking repetitively the configuration pragmas file. + -- Set by gnatmake (Prj.Env.Create_Config_Pragmas_File). + + Language_Independent_Checked : Boolean := False; + -- A flag that indicates that the project file has been checked + -- for language independent features: Object_Directory, + -- Source_Directories, Library, non empty Naming Suffixes. + + Checked : Boolean := False; + -- A flag to avoid checking repetitively the naming scheme of + -- this project file. Set by Prj.Nmsc.Check_Ada_Naming_Scheme. + + Seen : Boolean := False; + -- A flag to mark a project as "visited" to avoid processing the same + -- project several time. + + Need_To_Build_Lib : Boolean := False; + -- Indicates that the library of a Library Project needs to be built or + -- rebuilt. + + Depth : Natural := 0; + -- The maximum depth of a project in the project graph. + -- Depth of main project is 0. + + Unkept_Comments : Boolean := False; + -- True if there are comments in the project sources that cannot + -- be kept in the project tree. + + end record; + + function Empty_Project (Tree : Project_Tree_Ref) return Project_Data; + -- Return the representation of an empty project in project Tree tree. + -- The project tree Tree must have been Initialized and/or Reset. + + Project_Error : exception; + -- Raised by some subprograms in Prj.Attr + + package Project_Table is new GNAT.Dynamic_Tables ( + Table_Component_Type => Project_Data, + Table_Index_Type => Project_Id, + Table_Low_Bound => 1, + Table_Initial => 100, + Table_Increment => 100); + -- The set of all project files + + type Spec_Or_Body is + (Specification, Body_Part); + + type File_Name_Data is record + Name : Name_Id := No_Name; + Index : Int := 0; + Display_Name : Name_Id := No_Name; + Path : Name_Id := No_Name; + Display_Path : Name_Id := No_Name; + Project : Project_Id := No_Project; + Needs_Pragma : Boolean := False; + end record; + -- File and Path name of a spec or body + + type File_Names_Data is array (Spec_Or_Body) of File_Name_Data; + + type Unit_Id is new Nat; + No_Unit : constant Unit_Id := 0; + type Unit_Data is record + Name : Name_Id := No_Name; + File_Names : File_Names_Data; + end record; + -- Name and File and Path names of a unit, with a reference to its + -- GNAT Project File(s). + + package Unit_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Unit_Data, + Table_Index_Type => Unit_Id, + Table_Low_Bound => 1, + Table_Initial => 100, + Table_Increment => 100); + -- Table of all units in a project tree + + package Units_Htable is new Simple_HTable + (Header_Num => Header_Num, + Element => Unit_Id, + No_Element => No_Unit, + Key => Name_Id, + Hash => Hash, + Equal => "="); + -- Mapping of unit names to indexes in the Units table + + type Unit_Project is record + Unit : Unit_Id := No_Unit; + Project : Project_Id := No_Project; + end record; + + No_Unit_Project : constant Unit_Project := (No_Unit, No_Project); + + package Files_Htable is new Simple_HTable + (Header_Num => Header_Num, + Element => Unit_Project, + No_Element => No_Unit_Project, + Key => Name_Id, + Hash => Hash, + Equal => "="); + -- Mapping of file names to indexes in the Units table + + type Private_Project_Tree_Data is private; + -- Data for a project tree that is used only by the Project Manager + + type Project_Tree_Data is + record + Present_Languages : Present_Language_Table.Instance; + Supp_Suffixes : Supp_Suffix_Table.Instance; + Name_Lists : Name_List_Table.Instance; + Supp_Languages : Supp_Language_Table.Instance; + Other_Sources : Other_Source_Table.Instance; + String_Elements : String_Element_Table.Instance; + Variable_Elements : Variable_Element_Table.Instance; + Array_Elements : Array_Element_Table.Instance; + Arrays : Array_Table.Instance; + Packages : Package_Table.Instance; + Project_Lists : Project_List_Table.Instance; + Projects : Project_Table.Instance; + Units : Unit_Table.Instance; + Units_HT : Units_Htable.Instance; + Files_HT : Files_Htable.Instance; + Private_Part : Private_Project_Tree_Data; + end record; + -- Data for a project tree + + type Put_Line_Access is access procedure + (Line : String; + Project : Project_Id; + In_Tree : Project_Tree_Ref); + -- Use to customize error reporting in Prj.Proc and Prj.Nmsc + + procedure Expect (The_Token : Token_Type; Token_Image : String); + -- Check that the current token is The_Token. If it is not, then + -- output an error message. + + procedure Initialize (Tree : Project_Tree_Ref); + -- This procedure must be called before using any services from the Prj + -- hierarchy. Namet.Initialize must be called before Prj.Initialize. + + procedure Reset (Tree : Project_Tree_Ref); + -- This procedure resets all the tables that are used when processing a + -- project file tree. Initialize must be called before the call to Reset. + + procedure Register_Default_Naming_Scheme + (Language : Name_Id; + Default_Spec_Suffix : Name_Id; + Default_Body_Suffix : Name_Id; + In_Tree : Project_Tree_Ref); + -- Register the default suffixes for a given language. These extensions + -- will be ignored if the user has specified a new naming scheme in a + -- project file. + -- + -- Otherwise, this information will be automatically added to Naming_Data + -- when a project is processed, in the lists Spec_Suffix and Body_Suffix. + + generic + type State is limited private; + with procedure Action + (Project : Project_Id; + With_State : in out State); + procedure For_Every_Project_Imported + (By : Project_Id; + In_Tree : Project_Tree_Ref; + With_State : in out State); + -- Call Action for each project imported directly or indirectly by project + -- By. Action is called according to the order of importation: if A + -- imports B, directly or indirectly, Action will be called for A before + -- it is called for B. If two projects import each other directly or + -- indirectly (using at least one "limited with"), it is not specified + -- for which of these two projects Action will be called first. Projects + -- that are extended by other projects are not considered. With_State may + -- be used by Action to choose a behavior or to report some global result. + + ---------------------------------------------------------- + -- Other multi-language stuff that may be modified soon -- + ---------------------------------------------------------- + + function Is_Present + (Language : Language_Index; + In_Project : Project_Data; + In_Tree : Project_Tree_Ref) return Boolean; + -- Return True when Language is one of the languages used in + -- project In_Project. + + procedure Set + (Language : Language_Index; + Present : Boolean; + In_Project : in out Project_Data; + In_Tree : Project_Tree_Ref); + -- Indicate if Language is or not a language used in project In_Project + + function Language_Processing_Data_Of + (Language : Language_Index; + In_Project : Project_Data; + In_Tree : Project_Tree_Ref) return Language_Processing_Data; + -- Return the Language_Processing_Data for language Language in project + -- In_Project. Return the default when no Language_Processing_Data are + -- defined for the language. + + procedure Set + (Language_Processing : Language_Processing_Data; + For_Language : Language_Index; + In_Project : in out Project_Data; + In_Tree : Project_Tree_Ref); + -- Set the Language_Processing_Data for language Language in project + -- In_Project. + + function Suffix_Of + (Language : Language_Index; + In_Project : Project_Data; + In_Tree : Project_Tree_Ref) return Name_Id; + -- Return the suffix for language Language in project In_Project. Return + -- No_Name when no suffix is defined for the language. + + procedure Set + (Suffix : Name_Id; + For_Language : Language_Index; + In_Project : in out Project_Data; + In_Tree : Project_Tree_Ref); + -- Set the suffix for language Language in project In_Project + +private + + All_Packages : constant String_List_Access := null; + + No_Project_Tree : constant Project_Tree_Ref := null; + + Ignored : constant Variable_Kind := Single; + + Nil_Variable_Value : constant Variable_Value := + (Project => No_Project, + Kind => Undefined, + Location => No_Location, + Default => False); + + Virtual_Prefix : constant String := "v$"; + -- The prefix for virtual extending projects. Because of the '$', which is + -- 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. + + procedure Add_To_Buffer + (S : String; + To : in out String_Access; + Last : in out Natural); + -- Append a String to the Buffer + + type Naming_Id is new Nat; + + package Naming_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Naming_Data, + Table_Index_Type => Naming_Id, + Table_Low_Bound => 1, + Table_Initial => 5, + Table_Increment => 100); + -- Comment ??? + + package Path_File_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Name_Id, + Table_Index_Type => Natural, + Table_Low_Bound => 1, + Table_Initial => 50, + Table_Increment => 50); + -- Table storing all the temp path file names. + -- Used by Delete_All_Path_Files. + + package Source_Path_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Name_Id, + Table_Index_Type => Natural, + Table_Low_Bound => 1, + Table_Initial => 50, + Table_Increment => 50); + -- A table to store the source dirs before creating the source path file + + package Object_Path_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Name_Id, + Table_Index_Type => Natural, + Table_Low_Bound => 1, + Table_Initial => 50, + Table_Increment => 50); + -- A table to store the object dirs, before creating the object path file + + type Private_Project_Tree_Data is record + Namings : Naming_Table.Instance; + Path_Files : Path_File_Table.Instance; + Source_Paths : Source_Path_Table.Instance; + Object_Paths : Object_Path_Table.Instance; + Default_Naming : Naming_Data; + end record; + -- Comment ??? +end Prj; |