Patchwork [Ada] New environmment variable GPR_PROJECT_PATH_FILE for project path

login
register
mail settings
Submitter Arnaud Charlet
Date April 11, 2013, 1:34 p.m.
Message ID <20130411133425.GA29418@adacore.com>
Download mbox | patch
Permalink /patch/235747/
State New
Headers show

Comments

Arnaud Charlet - April 11, 2013, 1:34 p.m.
A new environment variable GPR_PROJECT_PATH_FILE is used by the Project
Manager to set up the project path. When defined, GPR_PROJECT_PATH_FILE
indicates the path of a text file that contains directories to be added
to the project path. GPR_PROJECT_PATH_FILE is taken into account before
GPR_PROJECT_PATH.
The test for this is to create a text file containing the path names
of project directories, to define GPR_PROJECT_PATH_FILE with the path
name of this file and to invoke gnatmake with project files that need
to have the project path correctly defined.

Tested on x86_64-pc-linux-gnu, committed on trunk

2013-04-11  Vincent Celier  <celier@adacore.com>

	* prj-env.adb (Initialize_Default_Project_Path): Take
	into account a project path file, specified by environment
	variable GPR_PROJECT_PATH_FILE, before taking into account
	GPR_PROJECT_PATH.
	* projects.texi: Add documentation for GPR_PROJECT_PATH_FILE

Patch

Index: prj-env.adb
===================================================================
--- prj-env.adb	(revision 197743)
+++ prj-env.adb	(working copy)
@@ -23,6 +23,8 @@ 
 --                                                                          --
 ------------------------------------------------------------------------------
 
+with Ada.Text_IO; use Ada.Text_IO;
+
 with Fmap;
 with Hostparm;
 with Makeutl;  use Makeutl;
@@ -1895,14 +1897,17 @@ 
       New_Len         : Positive;
       New_Last        : Positive;
 
-      Ada_Project_Path : constant String := "ADA_PROJECT_PATH";
-      Gpr_Project_Path : constant String := "GPR_PROJECT_PATH";
-      --  Name of alternate env. variable that contain path name(s) of
-      --  directories where project files may reside. GPR_PROJECT_PATH has
-      --  precedence over ADA_PROJECT_PATH.
+      Ada_Project_Path      : constant String := "ADA_PROJECT_PATH";
+      Gpr_Project_Path      : constant String := "GPR_PROJECT_PATH";
+      Gpr_Project_Path_File : constant String := "GPR_PROJECT_PATH_FILE";
+      --  Names of alternate env. variable that contain path name(s) of
+      --  directories where project files may reside. They are taken into
+      --  account in this order: GPR_PROJECT_PATH_FILE, GPR_PROJECT_PATH,
+      --  ADA_PROJECT_PATH.
 
-      Gpr_Prj_Path : String_Access;
-      Ada_Prj_Path : String_Access;
+      Gpr_Prj_Path_File : String_Access;
+      Gpr_Prj_Path      : String_Access;
+      Ada_Prj_Path      : String_Access;
       --  The path name(s) of directories where project files may reside.
       --  May be empty.
 
@@ -1926,9 +1931,51 @@ 
 
       --  If environment variables are defined and not empty, add their content
 
-      Gpr_Prj_Path := Getenv (Gpr_Project_Path);
-      Ada_Prj_Path := Getenv (Ada_Project_Path);
+      Gpr_Prj_Path_File := Getenv (Gpr_Project_Path_File);
+      Gpr_Prj_Path      := Getenv (Gpr_Project_Path);
+      Ada_Prj_Path      := Getenv (Ada_Project_Path);
 
+      if Gpr_Prj_Path_File.all /= "" then
+         declare
+            File : Ada.Text_IO.File_Type;
+            Line : String (1 .. 10_000);
+            Last : Natural;
+
+            Tmp : String_Access;
+
+         begin
+            Open (File, In_File, Gpr_Prj_Path_File.all);
+
+            while not End_Of_File (File) loop
+               Get_Line (File, Line, Last);
+
+               if Last /= 0
+                 and then (Last = 1 or else Line (1 .. 2) /= "--")
+               then
+                  Tmp := Self.Path;
+                  Self.Path :=
+                    new String'
+                      (Tmp.all & Path_Separator & Line (1 .. Last));
+                  Free (Tmp);
+               end if;
+
+               if Current_Verbosity = High then
+                  Debug_Output ("Adding directory to Project_Path: """
+                                & Line (1 .. Last) & '"');
+               end if;
+            end loop;
+
+            Close (File);
+
+         exception
+            when others =>
+               Write_Str ("warning: could not read project path file """);
+               Write_Str (Gpr_Prj_Path_File.all);
+               Write_Line ("""");
+         end;
+
+      end if;
+
       if Gpr_Prj_Path.all /= "" then
          Add_Directories (Self, Gpr_Prj_Path.all);
       end if;
Index: projects.texi
===================================================================
--- projects.texi	(revision 197784)
+++ projects.texi	(working copy)
@@ -1209,12 +1209,18 @@ 
   current project file.
 
 @item
+@cindex @code{GPR_PROJECT_PATH_FILE}
+@cindex @code{GPR_PROJECT_PATH}
 @cindex @code{ADA_PROJECT_PATH}
-@cindex @code{GPR_PROJECT_PATH}
   Then it is searched relative to all the directories specified in the
-  ^environment variables^logical names^ @b{GPR_PROJECT_PATH} and
-  @b{ADA_PROJECT_PATH} (in that order) if they exist. The former is
-  recommended, the latter is kept for backward compatibility.
+  ^environment variables^logical names^ @b{GPR_PROJECT_PATH_FILE},
+  @b{GPR_PROJECT_PATH} and @b{ADA_PROJECT_PATH} (in that order) if they exist.
+  The value of @b{GPR_PROJECT_PATH_FILE}, when defined, is the path name of
+  a text file that contains project directory path names, one per line.
+  @b{GPR_PROJECT_PATH} and @b{ADA_PROJECT_PATH}, when defined, contain
+  project directory path names separated by directory separators.
+  @b{ADA_PROJECT_PATH} is used for compatibility, it is recommended to
+  use @b{GPR_PROJECT_PATH_FILE} or @b{GPR_PROJECT_PATH}.
 
 @item Finally, it is searched relative to the default project directories.
   Such directories depends on the tool used. The different locations searched