Concepts
The GPR2 library uses different types of objects to access project files data.
Types used when loading a project into a GPR2.Project.Tree.Object
GPR2.Path_Name.ObjectHandle filesystem paths.
GPR2.Path_Namepackage contains conversions from and toGNATCOLL.VFS.Virtual_Filetype.
GPR2.Path_Name.Set.ObjectHandle a set of paths.
GPR2.Project.Tree.ObjectHandle a project tree. Project file used to load project tree is available as
Tree.Root_Project.
GPR2.Project.Tree.View_Builder.ObjectUsed to load a project as a project file path alternative. Attributes (for example
Source_Dirs) can be defined for this object before it is used to load a project tree.
GPR2.Context.ObjectContext objects are used to pass scenario variables to a tree. A context is provided when loading a tree. It can then be changed calling
GPR2.Project.Tree.Set_Context.
GPR2.Environment.ObjectEnvironment object provided at load time is used by GPR2 to access the environment when needed.
GPR2.Log.ObjectUsed to store the log messages (error/warning/information) coming from the parser.
GPR2.Message.ObjectBase object to report information at the end user level.
Types used to handle loaded gpr files. A loaded gpr project is stored in a tree containing views. The tree contains root, imported, extended, aggregated, configuration and runtime views.
GPR2.Project.View.ObjectHandle a gpr project file. Used to handle root project and any referenced (imported, extended, aggregated) project.
GPR2.Project.View.Set.ObjectHandle a set of view objects.
GPR2.Project.Configuration.ObjectHandle the configuration object for a project tree.
Types used to handle types, variables, attributes and packages.
GPR2.Project.Typ.ObjectHandle a variable type definition.
GPR2.Project.Typ.Set.ObjectHandle a set of variable types.
GPR2.Project.Variable.ObjectHandle a variable defined in a project or in a project’s package.
GPR2.Project.Variable.Set.ObjectHandle a set of variables
GPR2.Project.Attribute.ObjectHandle project view attributes.
GPR2.Project.Attribute.Set.ObjectHandle a set of attributes.
GPR2.Project.Pack.ObjectHandle a project’s package which is a set of attributes and variables.
Types used to handle project sources
GPR2.Project.Source.ObjectHandle a project’s source file.
GPR2.Project.Source.Set.ObjectHandle a set of project’s source files.
Types used to handle project units
GPR2.Project.Unit_Info.ObjectHandle a view’s unit.
GPR2.Project.Unit_Info.Set.ObjectHandle a set of view’s units.
Type used to handle standard gpr tools switches.
GPR2.Options.ObjectHandle loading a project using common GPR tools switches (
-aP,--autoconf,--config,--db,--db-,--implicit-with,--no-project,-P,--relocate-build-tree,--root-dir,--RTS,--src-subdirs,-subdirs,--target,--unchecked-shared-lib-imports,-X).
Memory management of GPR2 objects is easy as all references are using reference counting.
API proper use is ensured using precondition aspect.
These checks are activated using debug or release_checks values for
GPR2_BUILD scenario variable. Usually object’s function calls should be
protected by a corresponding Has_XXX or Is_XXX check.
Some object’s function calls are using a
function Check_XXX (Object, out Result) return Boolean; pattern.
function Has_Runtime_Project (Self : Object) return Boolean;
-- Returns True if a runtime project is loaded on this tree
function Runtime_Project (Self : Object) return View.Object
with Pre => Self.Is_Defined and then Self.Has_Runtime_Project;
-- Returns the runtime project for the given tree
function Is_Extended (Self : Object) return Boolean
with Pre => Self.Is_Defined;
-- Returns True if the view is extended by another project
function Extending (Self : Object) return Object
with Pre => Self.Is_Defined and then Self.Is_Extended,
Post => Extending'Result.Is_Extending;
-- Return the extending view
function Check_Source
(Self : Object;
Filename : GPR2.Simple_Name;
Result : in out Project.Source.Object) return Boolean
with Pre => Self.Is_Defined;
All sets handled by the GPR2 library can be easily iterated.
They are returned as iterable objects (GPR2.Path_Name.Set.Object,
GPR2.Project.View.Set.Object, and any GPR2.<child_name>.Set.Object)
or they define a Iterate API.
function Iterate
(Self : GPR2.Log.Object;
Information : Boolean := True;
Warning : Boolean := True;
Error : Boolean := True;
Lint : Boolean := False;
Read : Boolean := True;
Unread : Boolean := True)
return Log_Iterator.Forward_Iterator'Class;
function Iterate
(Self : GPR2.Project.Tree.Object;
Kind : Iterator_Control := Default_Iterator;
Filter : Filter_Control := Default_Filter;
Status : Status_Control := Default_Status)
return Project_Iterator.Forward_Iterator'Class;
function Iterate
(Self : GPR2.Unit.List.Object)
return Unit_Iterator.Forward_Iterator'Class;
GPR2.Path_Name.Object - Files and directories
Files and directories are handled in GPR2 using Object type defined in
GPR2.Path_Name package.
Objects can be created directly using Create_File or Create_Directory
API, or from an existing Object using Compose API.
An API is provided to easily interface these objects with Filesystem_String
and Virtual_File types defined in GNATCOLL.VFS.
A complete API is provided to manipulate files and directories.
GPR2.Project.Configuration.Object - Configuration
Configuration files (.cgpr files) generated usually by gprconfig and
provided using --config switch, can be loaded using
GPR2.Project.Configuration.Load function. These objects are then used at
project file tree load time.
GPR2.Project.Tree.Object - Loaded project tree
Handling a project file using GPR2 starts loading a
GPR2.Project.Tree.Object. All dependency projects (imported, extended,
aggregated), selected Ada runtime and used configuration project will be
loaded as well.
GPR2.Options package provides a Load_Project function.
declare
Options : GPR2.Options.Object;
Tree : GPR2.Project.Tree.Object;
Loaded : Boolean;
begin
Options.Add_Switch (GPR2.Options.P, "test");
Options.Finalize;
Loaded := Options.Load_Project (Tree);
end;
Tree can also be loaded using Load and Load_Autoconf primitives
located in GPR2.Project.Tree package.
with Ada.Text_IO; use Ada.Text_IO;
with GPR2.Context;
with GPR2.Log;
with GPR2.Path_Name;
with GPR2.Project.Tree;
with GPR2.Project.Configuration;
procedure Test_Project is
Project_File : constant GPR2.Path_Name.Object :=
GPR2.Project.Create ("path_to_project.gpr");
Config_Project : constant GPR2.Path_Name.Object :=
GPR2.Project.Create ("project.cgpr");
Tree : GPR2.Project.Tree.Object;
begin
-- Load path_to_project.gpr & create project.cgpr file
Tree.Load_Autoconf
(Filename => Project_File,
Context => GPR2.Context.Empty,
Config_Project => Config_Project);
-- Load path_to_project.gpr using a configuration file.
Tree.Load
(Filename => Project_File,
Context => GPR2.Context.Empty,
Config => GPR2.Project.Configuration.Load (Config_Project),
Build_Path => GPR2.Project.Create ("build_path"),
Subdirs => "subdirs");
-- Display object directory taking into account build tree & subdirs
Put_Line (Tree.Root_Project.Object_Directory.Value);
exception
when GPR2.Project_Error =>
GPR2.Log.Output_Messages (Tree.Log_Messages.all);
end Test_Project;
Tree can also be loaded from GPR2.Project.Tree.View_Builder.Object
instead of GPR2.Path_Name.Object. This feature is useful when you need to
load a Tree but no project file is available.
declare
Root : GPR2.Project.Tree.View_Builder.Object :=
GPR2.Project.Tree.View_Builder.Create
(GPR2.Path_Name.Create_Directory ("demo"), "Custom_Project");
Src_Dirs : GPR2.Containers.Value_List;
Tree : GPR2.Project.Tree.Object;
package PRA renames GPR2.Project.Registry.Attribute;
begin
Src_Dirs.Append ("src1");
Src_Dirs.Append ("src2");
Root.Set_Attribute (PRA.Source_Dirs, Src_Dirs);
Root.Set_Attribute (PRA.Object_Dir, "obj");
GPR2.Project.Tree.View_Builder.Load_Autoconf (Tree, Root, GPR2.Context.Empty);
end;
GPR2.Context.Object - Scenario variables
Scenario variables are defined using GPR2.Context.Object.
Key/Value are added or update using Include primitive.
A loaded Tree can be updated calling Set_Context primitive when scenario
variables need to be changed.
Tree : GPR2.Project.Tree.Object;
Context : GPR2.Context.Object;
-- Change Context and update Tree
Context.Include ("KEY", "value");
Tree.Set_Context (Context);
GPR2.Log.Object - Messages
GPR2 is reporting project and configuration file messages through
GPR2.Log.Object.
GPR2.Log package provides an configurable iterator to list selected
messages. Output_Messages primitive is provided to print filtered
messages.
A message contains the following properties.
Level, can beInformation,Warning,ErrororLint.
Status, can beReadorUnread.
Messagetext.
Sloc, defining where Filename:Line:Column the message was issued.
GPR2.Project.View.Object - Project file
Any project file (root, imported, extended, etc…) parsed during Load or
Load_Autoconf execution is reported as GPR2.Project.View.Object.
A View object contains attributes, types, variables, sources, units and any extra data defined in project file.
When sources files are added/deleted, Tree.Invalidate_Sources (View);
should be used to update sources related data. Calling
Tree.Invalidate_Sources; updates all sources for all views in the Tree.
GPR2.Project.Attribute.Object - Attributes
View’s attributes can be accessed using a name, an index and a position. A name is mandatory.
Name parameter uses GPR2.Q_Attribute_Id type.
Predefined Q_Attribute_Id values can be found in
GPR2.Project.Registry.Attribute package.
Q_Attribute_Id value for Source_Dirs is attribute is
GPR2.Project.Registry.Attribute.Source_Dirs.
Q_Attribute_Id value for Builder’Executable attribute is
GPR2.Project.Registry.Attribute.Builder.Executable.
New Q_Attribute_Id values (for external tools) can be defined/registered
as follows:
use GPR2;
Tool_Id : constant GPR2.Package_Id := +"tool";
Attribute_A : constant GPR2.Q_Attribute_Id := (Tool_Id, +"attribute_a");
-- new packages and attributes should be registered during initialization.
GPR2.Project.Registry.Pack.Add (Tool_Id, GPR2.Project.Registry.Pack.Everywhere);
GPR2.Project.Registry.Attribute.Add
(Name => Attribute_A,
Index_Type => GPR2.Project.Registry.Attribute.No_Index,
Value => GPR2.Project.Registry.Attribute.Single,
Value_Case_Sensitive => False,
Is_Allowed_In => GPR2.Project.Registry.Attribute.Everywhere);
Registered Q_Attribute_Id packages/attributes can be exported/imported using JSON files through GPR2.Project.Registry.Exchange package API.
Index are created using GPR2.Project.Attribute_Index.Create primitives.
As an example to get Builder’Executable (“mains.adb” at 2) attribute use:
Executable : constant GPR2.Project.Attribute.Object :=
Tree.Root_Project.Attribute
(Name => GPR2.Project.Registry.Attribute.Builder.Executable,
Index => GPR2.Project.Attribute_Index.Create ("mains.adb"),
At_Pos => 2);
GPR2.Project.Variable.Object - Variables
Variables defined in a gpr file can be accessed using Variables and
Variable primitives of GPR2.Project.View.Object.
Variables function returns the variables set in
GPR2.Project.Variable.Set.Object. Variable function returns the
requested variable.
As usual, requests should be protected by corresponding Has_XXX requests.
If a variable has a type, its type can be stored in a
GPR2.Project.Typ.Object.
type Build_Type is ("debug", "release", "release_checks", "gnatcov");
Build : Build_Type := external ("GPR2_BUILD", "debug");
The following code show how a variable and its type can be accessed.
declare
Name : constant GPR2.Name_Type := "Build";
View : GPR2.Project.View.Object := Tree.Root_Project;
Variable : GPR2.Project.Variable.Object;
Variable_Type : GPR2.Project.Typ.Object;
begin
if View.Has_Variables (Name) then
Variable := View.Variable (Name);
Ada.Text_IO.Put_Line (Variable.Value.Text);
if Variable.Has_Type then
Variable_Type := Variable.Typ;
Ada.Text_IO.Put (String (Variable_Type.Name.Text) & " : ");
for V of Variable_Type.Values loop
Ada.Text_IO.Put (V.Text & ",");
end loop;
Ada.Text_IO.Put_Line ("");
end if;
end if;
end;
GPR2.Project.Source.Object - Sources
Sources of a project file are handled by GPR2.Project.Source.Object type.
They can be accessed through View.Sources or View.Source (Path_Name)
functions.
GPR2 parses the source file using libadalang or the corresponding ALI file generated previously by gnat to report contained unit(s) or dependencies list.
GPR2.Project.Unit_Info.Object - Units
Units of a project file are handled by GPR2.Project.Unit_Info.Object type.
They can be accessed through View.Units or View.Unit (Unit_Name)
functions.
Note that the list of units is populated only when
Tree.Update_Sources, View_Has_Sources or View.Sources is called.
As a performance optimization, if you don’t care about units and source dependencies, don’t forget when updating sources to explicitly ask for using no backends. (all backends are used as default)
Tree.Update_Sources (Backends => GPR2.Source_Info.No_Backends);
GPR2.Options.Object - GPR tools common switches support
Using this GPR2.Options.Object, normalize & simplify GPR tools common
switches support (development & maintenance)
The following code show how this object is used.
declare
Options : GPR2.Options.Object;
Tree : GPR2.Project.Tree.Object;
Loaded : Boolean;
begin
Options.Add_Switch (GPR2.Options.AP, "added-path");
Options.Add_Switch (GPR2.Options.P, "test");
Options.Add_Switch (GPR2.Options.Autoconf, "autoconf.cgpr");
Options.Add_Switch (GPR2.Options.X, "BUILD=Debug");
Options.Finalize;
Loaded := Options.Load_Project (Tree);
end;
GPR tools common supported switches are:
-aP<dir>(GPR2.Options.AP)-aP<dir> or -aP <dir> Add directory dir to project search path
--autoconf=<file.cgpr>(GPR2.Options.Autoconf)Specify/create the main config project file name
--config=<file.cgpr>(GPR2.Options.Config)Specify the configuration project file name
--db <dir>(GPR2.Options.Db)Parse dir as an additional knowledge base
--db-(GPR2.Options.Db_Minus)Do not load the standard knowledge base
--implicit-with(GPR2.Options.Implicit_With)Add the given projects as a dependency on all loaded projects
--no-project(GPR2.Options.No_Project)Do not use project file
-P<proj[.gpr]>(GPR2.Options.P)Use Project File <proj>
--relocate-build-tree[=dir](GPR2.Options.Relocate_Build_Tree)Root obj/lib/exec dirs are current-directory or dir
--root-dir(GPR2.Options.Root_Dir)Root directory of obj/lib/exec to relocate
--RTS[:lang]=<runtime>(GPR2.Options.RTS)Use runtime <runtime> for language Ada or for language <lang>
--src-subdirs=<dir>(GPR2.Options.Src_Subdirs)Prepend <obj>/dir to the list of source dirs for each project
-subdirs=<dir>(GPR2.Options.Subdirs)Use dir as suffix to obj/lib/exec directories
--target=<targetname>(GPR2.Options.Target)Specify a target for cross platforms
--unchecked-shared-lib-imports(GPR2.Options.Unchecked_Shared_Lib_Imports)Shared lib projects may import any project
-X<nm>=<val>(GPR2.Options.X)Specify a value for an external reference for project files