diff options
Diffstat (limited to 'gcc-4.3.1/gcc/ada/prj.ads')
-rw-r--r-- | gcc-4.3.1/gcc/ada/prj.ads | 1796 |
1 files changed, 1796 insertions, 0 deletions
diff --git a/gcc-4.3.1/gcc/ada/prj.ads b/gcc-4.3.1/gcc/ada/prj.ads new file mode 100644 index 000000000..b242c2cea --- /dev/null +++ b/gcc-4.3.1/gcc/ada/prj.ads @@ -0,0 +1,1796 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- P R J -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 2001-2007, 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 3, 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 COPYING3. If not, go to -- +-- http://www.gnu.org/licenses for a complete copy of the license. -- +-- -- +-- 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 Namet; use Namet; +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 + + type Library_Support is (None, Static_Only, Full); + -- Support for Library Project File. + -- - None: Library Project Files are not supported at all + -- - Static_Only: Library Project Files are only supported for static + -- libraries. + -- - Full: Library Project Files are supported for static and dynamic + -- (shared) libraries. + + type Yes_No_Unknown is (Yes, No, Unknown); + -- Tri-state to decide if -lgnarl is needed when linking + + type Mode is (Multi_Language, Ada_Only); + + function Get_Mode return Mode; + pragma Inline (Get_Mode); + + procedure Set_Mode (New_Mode : Mode); + pragma Inline (Set_Mode); + + Default_Language_Is_Ada : Boolean := True; + -- If no language was defined in the project or the configuration file, it + -- is an error, unless this variable is True, in which case it defaults to + -- Ada. Calling Set_Mode will reset this variable, default is for Ada_Only. + + Must_Check_Configuration : Boolean := False; + -- Whether the contents of the configuration file must be checked. This is + -- in general only needed by gprbuild itself, since other applications can + -- ignore such errors when they don't need to build directly. Calling + -- Set_Mode will reset this variable, default is for Ada_Only. + + function In_Configuration return Boolean; + pragma Inline (In_Configuration); + + procedure Set_In_Configuration (Value : Boolean); + pragma Inline (Set_In_Configuration); + + 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 File_Name_Type; + pragma Inline (Default_Ada_Spec_Suffix); + -- The name for the standard GNAT suffix for Ada spec source file name + -- ".ads". Initialized by Prj.Initialize. + + function Default_Ada_Body_Suffix return File_Name_Type; + pragma Inline (Default_Ada_Body_Suffix); + -- The name for the standard GNAT suffix for Ada body source file name + -- ".adb". Initialized by Prj.Initialize. + + function Slash return Path_Name_Type; + pragma Inline (Slash); + -- "/", used as the path of locally removed files + + Config_Project_File_Extension : String := ".cgpr"; + Project_File_Extension : String := ".gpr"; + -- The standard config and user project file name extensions. They are not + -- constants, because Canonical_Case_File_Name is called on these variables + -- 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 + + function Empty_File return File_Name_Type; + function Empty_String return Name_Id; + -- Return the 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 + + type Language_Index is new Nat; + -- Index of language data + + No_Language_Index : constant Language_Index := 0; + -- Constant indicating that there is no language data + + procedure Display_Language_Name + (In_Tree : Project_Tree_Ref; + Language : Language_Index); + -- Output the name of a language + + type Header_Num is range 0 .. 6150; + -- Size for hash table below. The upper bound is an arbitrary value, the + -- value here was chosen after testing to determine a good compromise + -- between speed of access and memory usage. + + function Hash (Name : Name_Id) return Header_Num; + function Hash (Name : File_Name_Type) return Header_Num; + function Hash (Name : Path_Name_Type) return Header_Num; + -- Used for computing hash values for names put into above hash table + + type Language_Kind is (File_Based, Unit_Based); + -- Type for the kind of language. All languages are file based, except Ada + -- which is unit based. + + type Dependency_File_Kind is (None, Makefile, ALI_File); + -- Type of dependency to be checked: no dependency file, Makefile fragment + -- or ALI file (for Ada). + + Makefile_Dependency_Suffix : constant String := ".d"; + ALI_Dependency_Suffix : constant String := ".ali"; + + Switches_Dependency_Suffix : constant String := ".cswi"; + + Binder_Exchange_Suffix : constant String := ".bexch"; + -- Suffix for binder exchange files + + Library_Exchange_Suffix : constant String := ".lexch"; + -- Suffix for library exchange files + + 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 + + package Mapping_Files_Htable is new Simple_HTable + (Header_Num => Header_Num, + Element => Path_Name_Type, + No_Element => No_Path, + Key => Path_Name_Type, + Hash => Hash, + Equal => "="); + -- A hash table to store the mapping files that are not used + + type Lang_Naming_Data is record + Dot_Replacement : File_Name_Type := No_File; + -- The string to replace '.' in the source file name (for Ada) + + Casing : Casing_Type := All_Lower_Case; + -- The casing of the source file name (for Ada) + + Separate_Suffix : File_Name_Type := No_File; + -- String to append to unit name for source file name of an Ada subunit + + Spec_Suffix : File_Name_Type := No_File; + -- The string to append to the unit name for the + -- source file name of a spec. + + Body_Suffix : File_Name_Type := No_File; + -- The string to append to the unit name for the + -- source file name of a body. + end record; + + No_Lang_Naming_Data : constant Lang_Naming_Data := + (Dot_Replacement => No_File, + Casing => All_Lower_Case, + Separate_Suffix => No_File, + Spec_Suffix => No_File, + Body_Suffix => No_File); + + type Source_Id is new Nat; + + No_Source : constant Source_Id := 0; + + type Language_Config is record + Kind : Language_Kind := File_Based; + -- Kind of language. All languages are file based, except Ada which is + -- unit based. + + Naming_Data : Lang_Naming_Data; + -- The naming data for the languages (prefixs, etc) + + Compiler_Driver : File_Name_Type := No_File; + -- The name of the executable for the compiler of the language + + Compiler_Driver_Path : String_Access := null; + -- The path name of the executable for the compiler of the language + + Compiler_Required_Switches : Name_List_Index := No_Name_List; + -- The list of switches that are required as a minimum to invoke the + -- compiler driver. + + Compilation_PIC_Option : Name_List_Index := No_Name_List; + -- The option(s) to compile a source in Position Independent Code for + -- shared libraries. Specified in the configuration. When not specified, + -- there is no need for such switch. + + Runtime_Library_Dir : Name_Id := No_Name; + -- Path name of the runtime library directory, if any + + Mapping_File_Switches : Name_List_Index := No_Name_List; + -- The option(s) to provide a mapping file to the compiler. Specified in + -- the configuration. When value is No_Name_List, there is no mapping + -- file. + + Mapping_Spec_Suffix : File_Name_Type := No_File; + -- Placeholder representing the spec suffix in a mapping file + + Mapping_Body_Suffix : File_Name_Type := No_File; + -- Placeholder representing the body suffix in a mapping file + + Config_File_Switches : Name_List_Index := No_Name_List; + -- The option(s) to provide a config file to the compiler. Specified in + -- the configuration. When value is No_Name_List, there is no config + -- file. + + Dependency_Kind : Dependency_File_Kind := None; + -- The kind of dependency to be checked: none, Makefile fragment or + -- ALI file (for Ada). + + Dependency_Option : Name_List_Index := No_Name_List; + -- The option(s) to be used to create the dependency file. When value is + -- No_Name_List, there is not such option(s). + + Compute_Dependency : Name_List_Index := No_Name_List; + -- Hold the value of attribute Dependency_Driver, if declared for the + -- language. + + Include_Option : Name_List_Index := No_Name_List; + -- Hold the value of attribute Include_Switches, if declared for the + -- language. + + Include_Path : Name_Id := No_Name; + -- Name of environment variable declared by attribute Include_Path for + -- the language. + + Include_Path_File : Name_Id := No_Name; + -- Name of environment variable declared by attribute Include_Path_File + -- for the language. + + Objects_Path : Name_Id := No_Name; + -- Name of environment variable declared by attribute Objects_Path for + -- the language. + + Objects_Path_File : Name_Id := No_Name; + -- Name of environment variable declared by attribute Objects_Path_File + -- for the language. + + Config_Body : Name_Id := No_Name; + -- The template for a pragma Source_File_Name(_Project) for a specific + -- file name of a body. + + Config_Spec : Name_Id := No_Name; + -- The template for a pragma Source_File_Name(_Project) for a specific + -- file name of a spec. + + Config_Body_Pattern : Name_Id := No_Name; + -- The template for a pragma Source_File_Name(_Project) for a naming + -- body pattern. + + Config_Spec_Pattern : Name_Id := No_Name; + -- The template for a pragma Source_File_Name(_Project) for a naming + -- spec pattern. + + Config_File_Unique : Boolean := False; + -- Indicate if the config file specified to the compiler needs to be + -- unique. If it is unique, then all config files are concatenated into + -- a temp config file. + + Binder_Driver : File_Name_Type := No_File; + -- The name of the binder driver for the language, if any + + Binder_Driver_Path : Path_Name_Type := No_Path; + -- The path name of the binder driver + + Binder_Required_Switches : Name_List_Index := No_Name_List; + -- Hold the value of attribute Binder'Required_Switches for the language + + Binder_Prefix : Name_Id := No_Name; + -- Hold the value of attribute Binder'Prefixthe language + + Toolchain_Version : Name_Id := No_Name; + -- Hold the value of attribute Toolchain_Version for the language + + Toolchain_Description : Name_Id := No_Name; + -- Hold the value of attribute Toolchain_Description for the language + + PIC_Option : Name_Id := No_Name; + -- Hold the value of attribute Compiler'PIC_Option for the language + + Objects_Generated : Boolean := True; + -- Indicates if objects are generated for the language + + end record; + -- 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); + + type Language_Data is record + Name : Name_Id := No_Name; + Display_Name : Name_Id := No_Name; + Config : Language_Config := No_Language_Config; + First_Source : Source_Id := No_Source; + Mapping_Files : Mapping_Files_Htable.Instance := + Mapping_Files_Htable.Nil; + Next : Language_Index := No_Language_Index; + end record; + + No_Language_Data : constant Language_Data := + (Name => No_Name, + Display_Name => No_Name, + Config => No_Language_Config, + First_Source => No_Source, + Mapping_Files => Mapping_Files_Htable.Nil, + Next => No_Language_Index); + + package Language_Data_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Language_Data, + Table_Index_Type => Language_Index, + Table_Low_Bound => 1, + Table_Initial => 10, + Table_Increment => 100); + -- The table for lists of names used in package Language_Processing + + type Alternate_Language_Id is new Nat; + + No_Alternate_Language : constant Alternate_Language_Id := 0; + + type Alternate_Language_Data is record + Language : Language_Index := No_Language_Index; + Next : Alternate_Language_Id := No_Alternate_Language; + end record; + + package Alternate_Language_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Alternate_Language_Data, + Table_Index_Type => Alternate_Language_Id, + Table_Low_Bound => 1, + Table_Initial => 10, + Table_Increment => 100); + -- The table for storing the alternate languages of a header file that + -- is used for several languages. + + type Source_Kind is (Spec, Impl, Sep); + + type Source_Data is record + Project : Project_Id := No_Project; + -- Project of the source + + Language_Name : Name_Id := No_Name; + -- Name of the language of the source + + Language : Language_Index := No_Language_Index; + -- Index of the language + + Lang_Kind : Language_Kind := File_Based; + -- Kind of 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. + + Kind : Source_Kind := Spec; + -- Kind of the source: spec, body or subunit + + Dependency : Dependency_File_Kind := None; + -- Kind of dependency: none, Makefile fragment or ALI file + + Other_Part : Source_Id := No_Source; + -- Source ID for the other part, if any: for a spec, indicates its body; + -- for a body, indicates its spec. + + Unit : Name_Id := No_Name; + -- Name of the unit, if language is unit based + + Index : Int := 0; + -- Index of the source in a multi unit source file + + Locally_Removed : Boolean := False; + -- True if the source has been "excluded" + + Get_Object : Boolean := False; + -- Indicates that the object of the source should be put in the global + -- archive. This is for Ada, when only the closure of a main needs to + -- be compiled/recompiled. + + Replaced_By : Source_Id := No_Source; + + File : File_Name_Type := No_File; + -- Canonical file name of the source + + Display_File : File_Name_Type := No_File; + -- File name of the source, for display purposes + + Path : Path_Name_Type := No_Path; + -- Canonical path name of the source + + Display_Path : Path_Name_Type := No_Path; + -- Path name of the source, for display purposes + + Source_TS : Time_Stamp_Type := Empty_Time_Stamp; + -- Time stamp of the source file + + Object_Project : Project_Id := No_Project; + -- Project where the object file is + + Object_Exists : Boolean := True; + -- True if an object file exists + + Object : File_Name_Type := No_File; + -- File name of the object file + + Current_Object_Path : Path_Name_Type := No_Path; + -- Object path of an existing object file + + Object_Path : Path_Name_Type := No_Path; + -- Object path of the real object file + + Object_TS : Time_Stamp_Type := Empty_Time_Stamp; + -- Object file time stamp + + Dep_Name : File_Name_Type := No_File; + -- Dependency file simple name + + Current_Dep_Path : Path_Name_Type := No_Path; + -- Path name of an existing dependency file + + Dep_Path : Path_Name_Type := No_Path; + -- Path name of the real dependency file + + Dep_TS : Time_Stamp_Type := Empty_Time_Stamp; + -- Dependency file time stamp + + Switches : File_Name_Type := No_File; + -- File name of the switches file + + Switches_Path : Path_Name_Type := No_Path; + -- Path name of the switches file + + Switches_TS : Time_Stamp_Type := Empty_Time_Stamp; + -- Switches file time stamp + + Naming_Exception : Boolean := False; + -- True if the source has an exceptional name + + Next_In_Sources : Source_Id := No_Source; + -- Link to another source in the project tree + + Next_In_Project : Source_Id := No_Source; + -- Link to another source in the project + + Next_In_Lang : Source_Id := No_Source; + -- Link to another source of the same language + end record; + + No_Source_Data : constant Source_Data := + (Project => No_Project, + Language_Name => No_Name, + Language => No_Language_Index, + Lang_Kind => File_Based, + Alternate_Languages => No_Alternate_Language, + Kind => Spec, + Dependency => None, + Other_Part => No_Source, + Unit => No_Name, + Index => 0, + Locally_Removed => False, + Get_Object => False, + Replaced_By => No_Source, + File => No_File, + Display_File => No_File, + Path => No_Path, + Display_Path => No_Path, + Source_TS => Empty_Time_Stamp, + Object_Project => No_Project, + Object_Exists => True, + Object => No_File, + Current_Object_Path => No_Path, + Object_Path => No_Path, + Object_TS => Empty_Time_Stamp, + Dep_Name => No_File, + Current_Dep_Path => No_Path, + Dep_Path => No_Path, + Dep_TS => Empty_Time_Stamp, + Switches => No_File, + Switches_Path => No_Path, + Switches_TS => Empty_Time_Stamp, + Naming_Exception => False, + Next_In_Sources => No_Source, + Next_In_Project => No_Source, + Next_In_Lang => No_Source); + + package Source_Data_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Source_Data, + Table_Index_Type => Source_Id, + Table_Low_Bound => 1, + Table_Initial => 1000, + Table_Increment => 100); + -- The table for the sources + + package Source_Paths_Htable is new Simple_HTable + (Header_Num => Header_Num, + Element => Source_Id, + No_Element => No_Source, + Key => Path_Name_Type, + Hash => Hash, + Equal => "="); + -- Mapping of source paths to source ids + + 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, Direct); + -- 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 + -- Direct: The symbol file is used as is + + type Symbol_Record is record + Symbol_File : Path_Name_Type := No_Path; + Reference : Path_Name_Type := No_Path; + 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_Path, + Reference => No_Path, + Symbol_Policy => Autonomous); + -- The default value of the symbol data + + 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. + + -- Declarations for gprmake: + + 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; + + 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 File_Name_Type; + -- Suffixes for the non spec sources of the different supported languages + -- in a project. + + No_Impl_Suffixes : constant Impl_Suffix_Array := (others => No_File); + -- A default value for the non spec source suffixes + + type Supp_Suffix is record + Index : Language_Index := No_Language_Index; + Suffix : File_Name_Type := No_File; + 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 Lang_Kind is (GNU, Other); + + type Language_Processing_Data is record + Compiler_Drivers : Name_List_Index := No_Name_List; + Compiler_Paths : Name_Id := No_Name; + Compiler_Kinds : Lang_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 : File_Name_Type; -- source file simple name + Path_Name : Path_Name_Type; -- source full path name + Source_TS : Time_Stamp_Type; -- source file time stamp + Object_Name : File_Name_Type; -- object file simple name + Object_Path : Path_Name_Type; -- object full path name + Object_TS : Time_Stamp_Type; -- object file time stamp + Dep_Name : File_Name_Type; -- dependency file simple name + Dep_Path : Path_Name_Type; -- 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 + + -- The following record contains data for a naming scheme + + type Naming_Data is record + + Dot_Replacement : File_Name_Type := No_File; + -- The string to replace '.' in the source file name (for Ada) + + Dot_Repl_Loc : Source_Ptr := No_Location; + + 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_Loc : Source_Ptr := No_Location; + + 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_Loc : Source_Ptr := No_Location; + + Separate_Suffix : File_Name_Type := No_File; + -- 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. + + -- For gprmake: + + Impl_Suffixes : Impl_Suffix_Array := No_Impl_Suffixes; + Supp_Suffixes : Supp_Language_Index := No_Supp_Language_Index; + end record; + + function Spec_Suffix_Of + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : Naming_Data) return String; + + function Spec_Suffix_Id_Of + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : Naming_Data) return File_Name_Type; + + function Spec_Suffix_Id_Of + (In_Tree : Project_Tree_Ref; + Language_Id : Name_Id; + Naming : Naming_Data) return File_Name_Type; + + procedure Set_Spec_Suffix + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : in out Naming_Data; + Suffix : File_Name_Type); + + function Body_Suffix_Id_Of + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : Naming_Data) return File_Name_Type; + + function Body_Suffix_Id_Of + (In_Tree : Project_Tree_Ref; + Language_Id : Name_Id; + Naming : Naming_Data) return File_Name_Type; + + function Body_Suffix_Of + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : Naming_Data) return String; + + procedure Set_Body_Suffix + (In_Tree : Project_Tree_Ref; + Language : String; + Naming : in out Naming_Data; + Suffix : File_Name_Type); + + function Objects_Exist_For + (Language : String; + In_Tree : Project_Tree_Ref) return Boolean; + + 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 + + type Project_Configuration is record + Run_Path_Option : Name_List_Index := No_Name_List; + -- The option to use when linking to specify the path where to look + -- for libraries. + + Executable_Suffix : Name_Id := No_Name; + -- The suffix of executables, when specified in the configuration or + -- in package Builder of the main project. When this is not + -- specified, the executable suffix is the default for the platform. + + -- Linking + + Linker : Path_Name_Type := No_Path; + -- Path name of the linker driver; specified in the configuration + -- or in the package Builder of the main project. + + Minimum_Linker_Options : Name_List_Index := No_Name_List; + -- The minimum options for the linker driver; specified in the + -- configuration. + + Linker_Executable_Option : Name_List_Index := No_Name_List; + -- The option(s) to indicate the name of the executable in the + -- linker command. Specified in the configuration. When not + -- specified, default to -o <executable name>. + + Linker_Lib_Dir_Option : Name_Id := No_Name; + -- The option to specify where to find a library for linking. + -- Specified in the configuration. When not specified, defaults to + -- "-L". + + Linker_Lib_Name_Option : Name_Id := No_Name; + -- The option to specify the name of a library for linking. + -- Specified in the configuration. When not specified, defaults to + -- "-l". + + -- Libraries + + Library_Builder : Path_Name_Type := No_Path; + -- The executable to build library. Specified in the configuration. + + Lib_Support : Library_Support := None; + -- The level of library support. Specified in the configuration. + -- Support is none, static libraries only or both static and shared + -- libraries. + + -- Archives + + Archive_Builder : Name_List_Index := No_Name_List; + -- The name of the executable to build archives, with the minimum + -- switches. Specified in the configuration. + + Archive_Indexer : Name_List_Index := No_Name_List; + -- The name of the executable to index archives, with the minimum + -- switches. Specified in the configuration. + + Archive_Suffix : File_Name_Type := No_File; + -- The suffix of archives. Specified in the configuration. When not + -- specified, defaults to ".a". + + Lib_Partial_Linker : Name_List_Index := No_Name_List; + + -- Shared libraries + + Shared_Lib_Prefix : File_Name_Type := No_File; + -- Part of a shared library file name that precedes the name of the + -- library. Specified in the configuration. When not specified, + -- defaults to "lib". + + Shared_Lib_Suffix : File_Name_Type := No_File; + -- Suffix of shared libraries, after the library name in the shared + -- library name. Specified in the configuration. When not specified, + -- default to ".so". + + Shared_Lib_Min_Options : Name_List_Index := No_Name_List; + -- + + Lib_Version_Options : Name_List_Index := No_Name_List; + -- + + Symbolic_Link_Supported : Boolean := False; + -- + + Lib_Maj_Min_Id_Supported : Boolean := False; + -- + + Auto_Init_Supported : Boolean := False; + -- + 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); + + -- The following record describes a project file representation + + -- Note that it is not specified if the path names of directories (source, + -- object, library or exec directories) end with or without a directory + -- separator. + + type Project_Data is record + Externally_Built : Boolean := False; + -- True if the project is externally built. In such case, the Project + -- Manager will not modify anything in this project. + + Languages : Name_List_Index := No_Name_List; + -- The list of languages of the sources of this project + + Config : Project_Configuration; + + First_Referred_By : Project_Id := No_Project; + -- The project, if any, that was the first to be known as importing or + -- extending this project + + Name : Name_Id := No_Name; + -- The name of the project + + Display_Name : Name_Id := No_Name; + -- The name of the project with the spelling of its declaration + + Path_Name : Path_Name_Type := No_Path; + -- The path name of the project file + + Display_Path_Name : Path_Name_Type := No_Path; + -- 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 + + Mains : String_List_Id := Nil_String; + -- List of mains specified by attribute Main + + Directory : Path_Name_Type := No_Path; + -- Path name of the directory where the project file resides + + Display_Directory : Path_Name_Type := No_Path; + -- The path name of the project directory, for display purposes. May be + -- different from Directory for platforms where the file names are + -- case-insensitive. + + Dir_Path : String_Access; + -- Same as Directory, but as an access to String + + Library : Boolean := False; + -- True if this is a library project + + Library_Dir : Path_Name_Type := No_Path; + -- If a library project, path name of the directory where the library + -- resides. + + Display_Library_Dir : Path_Name_Type := No_Path; + -- The path 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 + + Library_Src_Dir : Path_Name_Type := No_Path; + -- If a Stand-Alone Library project, path name of the 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. + + Display_Library_Src_Dir : Path_Name_Type := No_Path; + -- The path 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 : Path_Name_Type := No_Path; + -- In a library project, path name of the directory where the ALI files + -- are copied. If attribute Library_ALI_Dir is not specified, ALI files + -- are copied in the Library_Dir. + + Display_Library_ALI_Dir : Path_Name_Type := No_Path; + -- The path 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 + + Library_Kind : Lib_Kind := Static; + -- If a library project, kind of library + + Lib_Internal_Name : Name_Id := No_Name; + -- If a library project, internal name store inside the library + + Standalone_Library : Boolean := False; + -- Indicate that this is a Standalone Library Project File + + Lib_Interface_ALIs : String_List_Id := Nil_String; + -- For Standalone Library Project Files, indicate the list of Interface + -- ALI files. + + Lib_Auto_Init : Boolean := False; + -- For non static Stand-Alone Library Project Files, indicate if + -- the library initialisation should be automatic. + + Libgnarl_Needed : Yes_No_Unknown := Unknown; + -- Set to True when libgnarl is needed to link + + Symbol_Data : Symbol_Record := No_Symbols; + -- Symbol file name, reference symbol file name, symbol policy + + Ada_Sources : String_List_Id := Nil_String; + -- The list of all the Ada source file names (gnatmake only). + + Sources : String_List_Id := Nil_String; + -- Identical to Ada_Sources. For upward compatibility of GPS. + + First_Source : Source_Id := No_Source; + Last_Source : Source_Id := No_Source; + -- Head and tail of the list of sources + + Unit_Based_Language_Name : Name_Id := No_Name; + Unit_Based_Language_Index : Language_Index := No_Language_Index; + -- The name and index, if any, of the unit-based language of some + -- sources of the project. There may be only one unit-based language + -- in one project. + + Imported_Directories_Switches : Argument_List_Access := null; + -- List of the source search switches (-I<source dir>) to be used when + -- compiling. + + Include_Path : String_Access := null; + -- Value of the environment variable to indicate the source search path, + -- instead of a list of switches (Imported_Directories_Switches). + + Include_Path_File : Path_Name_Type := No_Path; + -- The path name of the of the source search directory file + + Include_Data_Set : Boolean := False; + -- Set True when Imported_Directories_Switches or Include_Path are set + + Include_Language : Language_Index := No_Language_Index; + + Source_Dirs : String_List_Id := Nil_String; + -- The list of all the source directories + + 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 : Path_Name_Type := No_Path; + -- The path name of the object directory of this project file + + Display_Object_Dir : Path_Name_Type := No_Path; + -- The path 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 : Path_Name_Type := No_Path; + -- The path name of the exec directory of this project file. Default is + -- equal to Object_Directory. + + Display_Exec_Dir : Path_Name_Type := No_Path; + -- The path 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. + + Extended_By : Project_Id := No_Project; + -- The reference of the project file, if any, that extends this project + -- file. + + Naming : Naming_Data := Standard_Naming_Data; + -- The naming scheme of this project file + + First_Language_Processing : Language_Index := No_Language_Index; + -- First index of the language data in the project + + Decl : Declarations := No_Declarations; + -- The declarations (variables, attributes and packages) of this project + -- file. + + Imported_Projects : Project_List := Empty_Project_List; + -- The list of all directly imported projects, if any + + All_Imported_Projects : Project_List := Empty_Project_List; + -- The list of all projects imported directly or indirectly, if any + + 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. + + 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. + + Objects_Path : String_Access := null; + -- The cached value of the object dir path, used during the binding + -- phase of gprbuild. + + Objects_Path_File_With_Libs : Path_Name_Type := No_Path; + -- The cached value of the object path temp file (including library + -- dirs) for this project file. + + Objects_Path_File_Without_Libs : Path_Name_Type := No_Path; + -- The cached value of the object path temp file (excluding library + -- dirs) for this project file. + + Config_File_Name : Path_Name_Type := No_Path; + -- The path name of the configuration pragmas file, if any + + Config_File_Temp : Boolean := False; + -- An indication that the configuration pragmas file is a temporary file + -- that must be deleted at the end. + + Linker_Name : File_Name_Type := No_File; + -- Value of attribute Language_Processing'Linker in the project file + + Linker_Path : Path_Name_Type := No_Path; + -- Path of linker when attribute Language_Processing'Linker is specified + + Minimum_Linker_Options : Name_List_Index := No_Name_List; + -- List of options specified in attribute + -- Language_Processing'Minimum_Linker_Options. + + Config_Checked : Boolean := False; + -- A flag to avoid checking repetitively the configuration pragmas file + + Checked : Boolean := False; + -- A flag to avoid checking repetitively the naming scheme of this + -- project file. + + 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. + + ------------------ + -- For gprmake -- + ------------------ + + Langs : Languages_In_Project := No_Languages; + Supp_Languages : Supp_Language_Index := No_Supp_Language_Index; + -- Indicate the different languages of the source of this project + + Ada_Sources_Present : Boolean := True; + -- True if there are Ada sources in the project + + 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 source of a language other than Ada + + 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; + Supp_Language_Processing : Supp_Language_Index := + No_Supp_Language_Index; + -- Language configurations + 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. + + function Is_Extending + (Extending : Project_Id; + Extended : Project_Id; + In_Tree : Project_Tree_Ref) return Boolean; + + function Is_A_Language + (Tree : Project_Tree_Ref; + Data : Project_Data; + Language_Name : Name_Id) return Boolean; + -- Whether Language_Name is one of the languages used for the project. + -- Language_Name must be lower cased. + + function There_Are_Ada_Sources + (In_Tree : Project_Tree_Ref; + Project : Project_Id) return Boolean; + + 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 : File_Name_Type := No_File; + Index : Int := 0; + Display_Name : File_Name_Type := No_File; + Path : Path_Name_Type := No_Path; + Display_Path : Path_Name_Type := No_Path; + 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_Index is new Nat; + No_Unit_Index : constant Unit_Index := 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_Index, + 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_Index, + No_Element => No_Unit_Index, + Key => Name_Id, + Hash => Hash, + Equal => "="); + -- Mapping of unit names to indexes in the Units table + + type Unit_Project is record + Unit : Unit_Index := No_Unit_Index; + Project : Project_Id := No_Project; + end record; + + No_Unit_Project : constant Unit_Project := (No_Unit_Index, No_Project); + + package Files_Htable is new Simple_HTable + (Header_Num => Header_Num, + Element => Unit_Project, + No_Element => No_Unit_Project, + Key => File_Name_Type, + 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 + -- Languages and sources of the project + + First_Language : Language_Index := No_Language_Index; + -- + + First_Source : Source_Id := No_Source; + -- + + -- Tables + + Languages_Data : Language_Data_Table.Instance; + Name_Lists : Name_List_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; + Sources : Source_Data_Table.Instance; + Alt_Langs : Alternate_Language_Table.Instance; + Units : Unit_Table.Instance; + Units_HT : Units_Htable.Instance; + Files_HT : Files_Htable.Instance; + Source_Paths_HT : Source_Paths_Htable.Instance; + + -- For gprmake: + + Present_Languages : Present_Language_Table.Instance; + Supp_Suffixes : Supp_Suffix_Table.Instance; + Supp_Languages : Supp_Language_Table.Instance; + Other_Sources : Other_Source_Table.Instance; + + -- Private part + + 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 : File_Name_Type; + Default_Body_Suffix : File_Name_Type; + 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. + + function Extend_Name + (File : File_Name_Type; + With_Suffix : String) return File_Name_Type; + -- Replace the extension of File with With_Suffix + + function Object_Name + (Source_File_Name : File_Name_Type) return File_Name_Type; + -- Returns the object file name corresponding to a source file name + + function Dependency_Name + (Source_File_Name : File_Name_Type; + Dependency : Dependency_File_Kind) return File_Name_Type; + -- Returns the dependency file name corresponding to a source file name + + function Switches_Name + (Source_File_Name : File_Name_Type) return File_Name_Type; + -- Returns the switches file name corresponding to a source file name + + -- For gprmake + + function Body_Suffix_Of + (Language : Language_Index; + In_Project : Project_Data; + In_Tree : Project_Tree_Ref) return String; + -- Returns the suffix of sources of language Language in project In_Project + -- in project tree In_Tree. + + 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 File_Name_Type; + -- Return the suffix for language Language in project In_Project. Return + -- No_Name when no suffix is defined for the language. + + procedure Set + (Suffix : File_Name_Type; + 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 + + ---------------- + -- Temp Files -- + ---------------- + + procedure Record_Temp_File (Path : Path_Name_Type); + -- Record the path of a newly created temporary file, so that it can be + -- deleted later. + + procedure Delete_All_Temp_Files; + -- Delete all recorded temporary files + +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); + -- Table storing the naming data for gnatmake/gprmake + + package Path_File_Table is new GNAT.Dynamic_Tables + (Table_Component_Type => Path_Name_Type, + Table_Index_Type => Natural, + Table_Low_Bound => 1, + Table_Initial => 50, + Table_Increment => 100); + -- 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 => 100); + -- 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 => Path_Name_Type, + Table_Index_Type => Natural, + Table_Low_Bound => 1, + Table_Initial => 50, + Table_Increment => 100); + -- 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; + -- Type to represent the part of a project tree which is private to the + -- Project Manager. + +end Prj; |