Conditional properties working

This commit is contained in:
Alejandro R Mosteo
2018-03-01 19:27:58 +01:00
parent 46965aea00
commit 059b672a03
18 changed files with 250 additions and 350 deletions
+24 -1
View File
@@ -15,6 +15,29 @@ package Alire.Index.Alire is
Git (Repo, "e2dee2e147ae9e4d666567b53b108cbe61bc06e8"),
Depends_On =>
Within_Minor (Semantic_Versioning.V_0_1) and
Within_Major (Simple_Logging.V_1));
Within_Major (Simple_Logging.V_1)
);
Syntax_Example : constant Release :=
Register ("alire_example",
V ("1.0.0"),
"Release with all index syntax features",
Origins.New_Filesystem ("/fake"),
Properties =>
If_Platform
(System_Is (GNU_Linux),
Comment ("Long life the penguin")) and
If_Platform
(not Compiler_Is_At_Least (GNAT_Unknown),
Comment ("Never saw that compiler") and Comment ("But I would like to")) and
If_Platform
(Distribution_Is (Ubuntu_Artful),
When_True => Comment ("Living on the edge"),
When_False => Comment ("I am a rock")) and
Comment ("Tell me about your mother"),
Available_When => -- Impossible mix
(System_Is (Windows) and System_Is (GNU_Linux)) or
(Compiler_Is_At_Least (GNAT_Unknown) and not Compiler_Is_At_Least (GNAT_Unknown)));
end Alire.Index.Alire;
-232
View File
@@ -1,232 +0,0 @@
with Alire.Index.LibGNUTLS;
package Alire.Index.DAK is
-- Simple Components by Dmitry A. Kazakov
-- This library is a good challenge since it has many subprojects
-- It prompted the introduction of the GPR_File property
-- Since most project names are common words, I've taken the liberty to prefix them with dak_
-- but the original sources are unchanged.
Base : constant Project_Name := "dak_";
Repo : constant URL := "https://github.com/alire-project/dak_simple_components.git";
DAK_Author : constant String := "Dmitry A. Kazakov";
DAK_Website : constant String := "http://www.dmitry-kazakov.de/ada/components.htm";
Desc_Pre : constant String := "Simple Components ";
Desc_Post : constant String := " by Dmitry A. Kazakov";
Strings_Edit_V_4_27 : constant Release :=
Register (Base & "strings_edit",
V ("4.27"),
Desc_Pre & "(strings)" & Desc_Post,
Git (Repo, "44ac8e0c817558b8641f746ce225b3d2fa90b7a1"),
Properties =>
GPR_File ("strings_edit.gpr") and
GPR_File ("test_strings_edit" / "strings_edit-test.gpr") and
GPR_Scenario ("Legacy", "Ada95" or "Ada2005" or "Ada2012") and
GPR_Scenario ("Development", "Debug" or "Release") and
Executable ("test_base64") and
Executable ("test_strings_edit") and
Executable ("test_string_streams") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
Tables_V_4_27 : constant Release :=
Register (Base & "tables",
V ("4.27"),
Desc_Pre & "(tables)" & Desc_Post,
Git (Repo, "19205e4981d72242daf72da7d59c5faf2b4c91fd"),
Properties =>
GPR_File ("tables.gpr") and
GPR_File ("test_tables" / "tables-test.gpr") and
GPR_Scenario ("Legacy", "Ada95" or "Ada2005" or "Ada2012") and
GPR_Scenario ("Development", "Debug" or "Release") and
Executable ("test_tables") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
Components_V_4_27 : constant Release :=
Register (Base & "components",
V ("4.27"),
Desc_Pre & "(base components)" & Desc_Post,
Git (Repo, "542f02c9be86693f759fcb784a8462bc4b25f1f2"),
Depends_On =>
Within_Major (Strings_Edit_V_4_27) and
Within_Major (Tables_V_4_27),
Properties =>
GPR_File ("components.gpr") and
GPR_File ("test_components" / "components-tests.gpr") and
GPR_Scenario ("Atomic_Access", "Pragma-atomic" or "GCC-built-ins" or "GCC-long-offsets") and
GPR_Scenario ("Tasking", "Multiple" or "Single") and
GPR_Scenario ("Traced_objects", "Off" or "On") and
Executable ("test_approximations") and
Executable ("test_association") and
Executable ("test_blackboard") and
Executable ("test_blackboard_performance") and
Executable ("test_blocking_files") and
Executable ("test_block_streams") and
Executable ("test_b_trees") and
Executable ("test_cubic_spline") and
Executable ("test_dining_philosophers") and
Executable ("test_fifo") and
Executable ("test_generic_indefinite_sets") and
Executable ("test_generic_maps") and
Executable ("test_generic_sets") and
Executable ("test_graphs") and
Executable ("test_handles") and
Executable ("test_ieee_754") and
Executable ("test_linked_lists") and
Executable ("test_linked_lists_scheduler_test") and
Executable ("test_parser_stream_io") and
Executable ("test_persistent_memory_pool") and
Executable ("test_persistent_storage") and
Executable ("test_sequencer") and
Executable ("test_single_file_persistence") and
Executable ("test_stack") and
Executable ("test_storage_streams") and
Executable ("test_string_streams") and
Executable ("test_synchronization_events") and
Executable ("test_transactional_blocking_files") and
Executable ("test_utf8_tables") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website) and
Comment ("Tasking=Single seems to be broken at persistent-single_file-text_io.adb")
);
Components_NTP_V_4_27 : constant Release :=
Register (Base & "components_ntp",
V ("4.27"),
Desc_Pre & "(ntp)" & Desc_Post,
Git (Repo, "34fb305d6ef360cde5e272b51409097a5de72017"),
Depends_On =>
Within_Major (Components_V_4_27),
Properties =>
GPR_File ("components-ntp.gpr") and
GPR_File ("test_components" / "components-ntp-test_ntp.gpr") and
Executable ("test_ntp") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
Components_Sqlite_V_4_27 : constant Release :=
Register (Base & "components_sqlite",
V ("4.27"),
Desc_Pre & "(sqlite)" & Desc_Post,
Git (Repo, "6fda0f3f7494815c87b329f7411b9a49ff97b9ba"),
Depends_On =>
Within_Major (Components_V_4_27),
Properties =>
GPR_File ("components-sqlite.gpr") and
GPR_File ("test_components" / "components-sqlite-benchmark_tests.gpr") and
GPR_File ("test_components" / "components-sqlite-sqlite_persistence_tests.gpr") and
Executable ("test_sqlite_benchmark") and
Executable ("test_sqlite_persistence") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
Components_Connections_V_4_27 : constant Release :=
Register (Base & "components_connections",
V ("4.27"),
Desc_Pre & "(clients/servers)" & Desc_Post,
Git (Repo, "008935d5a89396cc0c39afb39f04bf6a89a92058"),
Depends_On =>
Within_Major (Components_V_4_27) and
Within_Major (Components_Sqlite_V_4_27),
Properties =>
-- Main projects
GPR_File ("components-connections_server.gpr") and
GPR_File ("components-connections_server-elv_max_cube.gpr") and
GPR_File ("components-connections_server-http_server.gpr") and
GPR_File ("components-connections_server-http_server-sqlite_browser.gpr") and
GPR_File ("components-connections_server-modbus.gpr") and
GPR_File ("components-connections_server-mqtt.gpr") and
GPR_File ("components-connections_server-smtp.gpr") and
-- Test projects
GPR_File ("test_components" / "components-connections_server-elv_max_cube-test_elv_max_cube_client.gpr") and
GPR_File ("test_components" / "components-connections_server-http_server-test_http_server.gpr") and
GPR_File ("test_components" / "components-connections_server-modbus-test_modbus_client.gpr") and
GPR_File ("test_components" / "components-connections_server-mqtt-test_mqtt.gpr") and
GPR_File ("test_components" / "components-connections_server-test_data_server.gpr") and
GPR_File ("test_components" / "components-connections_server-test_echo_client_async.gpr") and
GPR_File ("test_components" / "components-connections_server-test_echo_client.gpr") and
GPR_File ("test_components" / "components-connections_server-test_echo_server.gpr") and
GPR_File ("test_components" / "components-connections_server-test_websockets_mqtt.gpr") and
GPR_File ("test_components" / "components-test_sqlite_browser.gpr") and
Executable ("test_data_server") and
Executable ("test_echo_client") and
Executable ("test_echo_client_async") and
Executable ("test_echo_server") and
Executable ("test_elv_max_cube_client") and
Executable ("test_http_client") and
Executable ("test_http_continuous_server") and
Executable ("test_http_server") and
Executable ("test_http_sqlite_browser") and
Executable ("test_infinity_server") and
Executable ("test_modbus_client") and
Executable ("test_mqtt_client") and
Executable ("test_mqtt_server") and
Executable ("test_mqtt_webserver") and
Executable ("test_websocket_duplex_server") and
Executable ("test_websocket_server") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
Components_Connections_Secure_V_4_27 : constant Release :=
Register (Base & "components_connections_secure",
V ("4.27"),
Desc_Pre & "(client/servers over TLS)" & Desc_Post,
Git (Repo, "ca72cf4150ae14ba6d40c3d2dd92c7846cb4cb5d"),
Depends_On =>
Within_Major (Components_Connections_V_4_27) and
Within_Major (LibGNUTLS.V_3_5_8),
Properties =>
GPR_File ("components-connections_server-secure.gpr") and
GPR_File ("components-gnutls.gpr") and
GPR_File ("test_components" / "components-connections_server-http_server-test_https_server.gpr") and
GPR_File ("test_components" / "components-connections_server-smtp-test_smtp.gpr") and
Executable ("test_https_client") and
Executable ("test_https_server") and
Executable ("test_smtp_client") and
License (GMGPL_2_0) and
Author (DAK_Author) and
Website (DAK_Website)
);
end Alire.Index.DAK;
@@ -1,14 +0,0 @@
with Alire.Origins;
package Alire.Index.Example_Dependencies is
V_1_0_0 : constant Release :=
Register ("alr_example_dependencies",
V ("1.0.0"),
"Release with assorted advanced dependency conditions",
Origins.New_Filesystem ("/fake"),
Available_When => -- Impossible mix
(System_Is (Windows) and System_Is (GNU_Linux)) or
(Compiler_Is_At_Least (GNAT_Unknown) and not Compiler_Is_At_Least (GNAT_Unknown)));
end Alire.Index.Example_Dependencies;
-40
View File
@@ -1,40 +0,0 @@
package Alire.Index.PragmARC is
Name : constant Project_Name := "pragmarc";
Repo : constant URL := "https://github.com/alire-project/PragmARC.git";
Desc : constant Project_Description :=
"PragmAda Reusable Components (PragmARCs), ";
Auth : constant String := "Jeffrey R. Carter";
Web1 : constant String := "https://github.com/jrcarter/PragmARC";
Web2 : constant String := "https://pragmada.x10hosting.com/";
V_2017 : constant Release := -- Experimental '07 version
Register (Name,
V ("2017.2007.0"),
Desc & "ISO/IEC 8652:2007 version",
Git (Repo, "db6c1730fe825f8303c60b48f82db08bd408588d"),
Properties =>
Executable ("compile_all") and
License (GMGPL_2_0) and
Author (Auth) and
Website (Web1) and
Website (Web2)
);
V_2011 : constant Release := -- Pure Ada95 version
Register (Name,
V ("2011.1995.0"),
Desc & "Ada 95 version",
Git (Repo, "34b0e12b5f9aea63408c94cc48ba7a16687c8d76"),
Properties =>
Executable ("compile_all") and
License (GMGPL_2_0) and
Author (Auth) and
Website (Web1) and
Website (Web2)
);
end Alire.Index.PragmARC;
-24
View File
@@ -1,24 +0,0 @@
package Alire.Index.RxAda is
Name : constant Project_Name := "rxada";
Repo : constant URL := "https://bitbucket.org/amosteo/rxada";
Desc : constant Project_Description := "RxAda port of the Rx framework";
V_0_1_0 : constant Release :=
Register (Name,
V ("0.1.0"),
Desc,
Hg (Repo, "361d4e2ab20a7dcca007e31bf7094d57b13fee6b"),
Properties =>
Executable ("rx-examples-basic") and
Executable ("rx-examples-minimal") and
Executable ("rx-examples-tests") and
Executable ("rx-examples-threading") and
License (LGPL_3_0) and
Maintainer ("alejandro@mosteo.com") and
Website (Repo));
end Alire.Index.RxAda;
+42
View File
@@ -0,0 +1,42 @@
package body Alire.Conditional.Vectors is
----------------
-- All_Values --
----------------
function All_Values (V : Vector) return Values is
begin
return Result : Values do
for Cond of V loop
Result := Result & Cond.Then_Value & Cond.Else_Value;
end loop;
end return;
end All_Values;
--------------
-- Evaluate --
--------------
function Evaluate (V : Vector; On : Properties.Vector) return Values is
begin
return Result : Values do
for Cond of V loop
Result := Result & Cond.Evaluate (On);
end loop;
end return;
end Evaluate;
--------------
-- Evaluate --
--------------
function Evaluate (V : Vector; On : Properties.Vector) return Vector is
begin
return Result : Vector do
for Cond of V loop
Result.Append (Conditional_Value'(New_Inconditional (Values'(Cond.Evaluate (On)))));
end loop;
end return;
end Evaluate;
end Alire.Conditional.Vectors;
+30
View File
@@ -0,0 +1,30 @@
with Ada.Containers.Indefinite_Vectors;
generic
package Alire.Conditional.Vectors with Preelaborate is
package Condition_Vectors is new Ada.Containers.Indefinite_Vectors (Positive, Conditional_Value);
type Vector is new Condition_Vectors.Vector with null record;
function All_Values (V : Vector) return Values;
function Evaluate (V : Vector; On : Properties.Vector) return Values;
-- Return the values that pass evaluation
function Evaluate (V : Vector; On : Properties.Vector) return Vector;
-- Take the values that pass evaluation and make a vector of inconditionals
function New_Conditional (If_X : Requisites.Tree;
Then_X : Values;
Else_X : Values) return Vector is
(To_Vector (New_Conditional (If_X, Then_X, Else_X), 1));
function New_Inconditional (V : Values) return Vector is (To_Vector (New_Inconditional (V), 1));
function "+" (V : Conditional_Value) return Vector is (To_Vector (V, 1));
function "and" (L, R : Vector) return Vector is (L & R);
Empty_Vector : constant Vector := (Condition_Vectors.Empty_Vector with null record);
end Alire.Conditional.Vectors;
+26 -1
View File
@@ -3,7 +3,9 @@ with Alire.Requisites;
generic
type Values is private;
package Alire.Conditional is
with function "&" (L, R : Values) return Values with Unreferenced; -- used in child vectors
-- FIXME: we'll have to keep an eye on the overhead of this (append to be considered)
package Alire.Conditional with Preelaborate is
type Conditional_Value (<>) is tagged private;
@@ -11,8 +13,18 @@ package Alire.Conditional is
Then_X : Values;
Else_X : Values) return Conditional_Value;
function New_Inconditional (V : Values) return Conditional_Value;
function Evaluate (This : Conditional_Value; Against : Properties.Vector) return Values;
function Condition (This : Conditional_Value) return Requisites.Tree;
function Is_Inconditional (This : Conditional_Value) return Boolean;
function True_Value (This : Conditional_Value) return Values;
function False_Value (This : Conditional_Value) return Values;
private
type Conditional_Value is tagged record
@@ -33,4 +45,17 @@ private
Then_Value => Then_X,
Else_Value => Else_X);
function New_Inconditional (V : Values) return Conditional_Value is
(Condition => Requisites.No_Requisites,
Then_Value => V,
Else_Value => <>);
function Condition (This : Conditional_Value) return Requisites.Tree is (This.Condition);
function Is_Inconditional (This : Conditional_Value) return Boolean is (This.Condition.Is_Empty);
function True_Value (This : Conditional_Value) return Values is (This.Then_Value);
function False_Value (This : Conditional_Value) return Values is (This.Else_Value);
end Alire.Conditional;
+12
View File
@@ -0,0 +1,12 @@
with Alire.Conditional;
with Alire.Conditional.Vectors;
with Alire.Properties;
with Alire.Requisites;
package Alire.Conditions with Preelaborate is
package For_Properties is new Conditional (Properties.Vector,
Properties."and");
package Properties is new For_Properties.Vectors; -- Conditional properties declared therein
end Alire.Conditions;
+1 -3
View File
@@ -42,8 +42,7 @@ package body Alire.Index is
Description : Project_Description;
Origin : Origins.Origin;
Depends_On : Dependencies := No_Dependencies;
Properties : Alire.Properties.Vector := No_Properties;
Requisites : Alire.Requisites.Tree := No_Requisites;
Properties : Release_Properties := No_Properties;
Available_When : Alire.Requisites.Tree := No_Requisites) return Release
is
begin
@@ -54,7 +53,6 @@ package body Alire.Index is
Origin,
Depends_On,
Properties => Properties,
Requisites => Requisites,
Available => Available_When)
do
if Releases.Contains (Rel) then
+19 -8
View File
@@ -2,6 +2,7 @@ private with Alire_Early_Elaboration; pragma Unreferenced (Alire_Early_Elaborati
with Ada.Directories;
with Alire.Conditions;
with Alire.Containers;
with Alire.Dependencies.Vectors;
with Alire.GPR;
@@ -22,11 +23,13 @@ with Semantic_Versioning;
package Alire.Index is
Releases : Containers.Release_Set;
subtype Release_Properties is Conditions.Properties.Vector;
subtype Dependencies is Alire.Dependencies.Vectors.Vector;
No_Dependencies : constant Dependencies := Alire.Dependencies.Vectors.No_Dependencies;
No_Properties : constant Properties.Vector := Properties.No_Properties;
No_Properties : constant Release_Properties := Conditions.Properties.Empty_Vector;
No_Requisites : constant Requisites.Tree := Requisites.Trees.Empty_Tree;
subtype Release is Alire.Releases.Release;
@@ -38,8 +41,7 @@ package Alire.Index is
Origin : Origins.Origin;
-- Optional
Depends_On : Dependencies := No_Dependencies;
Properties : Alire.Properties.Vector := No_Properties;
Requisites : Alire.Requisites.Tree := No_Requisites;
Properties : Release_Properties := No_Properties;
Available_When : Alire.Requisites.Tree := No_Requisites) return Release;
-- Properties are of the Release
-- Requisites are properties that dependencies have to fulfill, not used yet.
@@ -113,13 +115,20 @@ package Alire.Index is
use all type Platforms.Distributions;
use all type Platforms.Operating_Systems;
use all type Properties.Property'Class;
use all type Release_Properties;
use all type Requisites.Requisite'Class;
use all type Requisites.Tree;
-- These "use all" are useful for alire-index-* packages, but not for project_alr metadata files
-- Function for introducing conditional properties
function If_Platform (Condition : Requisites.Tree;
When_True : Properties.Vector;
When_False : Properties.Vector := Properties.No_Properties) return Release_Properties;
-- "Typed" attributes (named pairs of label-value)
function Author is new Properties.Labeled.Generic_New_Label (Properties.Labeled.Author);
function Comment is new Properties.Labeled.Generic_New_Label (Properties.Labeled.Comment);
function Comment is new Properties.Labeled.Inconditional_New_Label (Properties.Labeled.Comment);
function Executable is new Properties.Labeled.Generic_New_Label (Properties.Labeled.Executable);
function GPR_File is new Properties.Labeled.Generic_New_Label (Properties.Labeled.GPR_File);
function GPR_Free_Scenario (Name : String) return Properties.Vector;
@@ -129,8 +138,6 @@ package Alire.Index is
function License (L : Licensing.Licenses) return Properties.Vector is
(+Properties.Licenses.Values.New_Property (L));
Default_Properties : constant Properties.Vector := No_Properties;
function "and" (Dep1, Dep2 : Dependencies) return Dependencies renames Alire.Dependencies.Vectors."and";
function "and" (P1, P2 : Properties.Vector) return Properties.Vector renames Alire.Properties."and";
@@ -164,8 +171,7 @@ package Alire.Index is
function Set_Root_Project (Project : Alire.Project_Name;
Version : Semantic_Versioning.Version;
Depends_On : Alire.Index.Dependencies := Alire.Index.No_Dependencies;
Properties : Alire.Properties.Vector := No_Properties)
Depends_On : Alire.Index.Dependencies := Alire.Index.No_Dependencies)
return Release renames Root_Project.Set;
-- This function must be called in the working project alire file.
-- Otherwise alr does not know what's the current project, and its version and dependencies
@@ -242,6 +248,11 @@ private
(+Properties.Scenarios.New_Variable (GPR.Free_Variable (Name)));
function GPR_Scenario (Name : String; Values : GPR.Value_Vector) return Properties.Vector is
(+Properties.Scenarios.New_Variable (GPR.Enum_Variable (Name, Values)));
(+Properties.Scenarios.New_Variable (GPR.Enum_Variable (Name, Values)));
function If_Platform (Condition : Requisites.Tree;
When_True : Properties.Vector;
When_False : Properties.Vector := Properties.No_Properties) return Release_Properties is
(Conditions.Properties.New_Conditional (Condition, When_True, When_False));
end Alire.Index;
+9
View File
@@ -1,3 +1,5 @@
with Alire.Conditions;
private with Alire.Utils;
package Alire.Properties.Labeled with Preelaborate is
@@ -27,6 +29,10 @@ package Alire.Properties.Labeled with Preelaborate is
function Generic_New_Label (Value : String) return Properties.Vector;
-- Returns a vector so its directly usable during indexing
generic
Name : Labels;
function Inconditional_New_Label (Value : String) return Conditions.Properties.Vector;
private
type Label (Length : Natural) is new Properties.Property with record
@@ -44,6 +50,9 @@ private
function Generic_New_Label (Value : String) return Properties.Vector is
(To_Vector (New_Label (Name, Value), 1));
function Inconditional_New_Label (Value : String) return Conditions.Properties.Vector is
(Conditions.Properties.New_Inconditional (+New_Label (Name, Value)));
overriding function Image (L : Label) return String is (Utils.To_Mixed_Case (L.Name'Img) & ": " & L.Value);
end Alire.Properties.Labeled;
+16
View File
@@ -0,0 +1,16 @@
with GNAT.IO;
package body Alire.Properties is
-----------
-- Print --
-----------
procedure Print (V : Vector; Prefix : String := "") is
begin
for Prop of V loop
GNAT.IO.Put_Line (Prefix & Prop.Image);
end loop;
end Print;
end Alire.Properties;
+6
View File
@@ -20,6 +20,10 @@ package Alire.Properties with Preelaborate is
No_Properties : constant Vector;
procedure Print (V : Vector; Prefix : String := "");
function Empty_Properties return Vector;
-- function "and" (L, R : Property'Class) return Vector;
-- function "and" (L : Vector; R : Property'Class) return Vector;
function "and" (L, R : Vector) return Vector;
@@ -57,6 +61,8 @@ private
No_Properties : constant Vector := (Vectors.Empty_Vector with null record);
function Empty_Properties return Vector is (No_Properties);
function "and" (L, R : Vector) return Vector is (L & R);
function "+" (P : Property'Class) return Vector is (To_Vector (P, 1));
+50 -12
View File
@@ -32,7 +32,7 @@ package body Alire.Releases is
function Executables (R : Release) return Utils.String_Vector is
begin
return Exes : Utils.String_Vector := Values (R.Props, Executable) do
return Exes : Utils.String_Vector := Values (R.Properties.All_Values, Executable) do
if OS_Lib.Exe_Suffix /= "" then
for I in Exes.Iterate loop
Exes (I) := Exes (I) & OS_Lib.Exe_Suffix;
@@ -47,13 +47,37 @@ package body Alire.Releases is
function GPR_Files (R : Release) return Utils.String_Vector is
begin
return Files : Utils.String_Vector := Values (R.Props, GPR_File) do
return Files : Utils.String_Vector := Values (R.Properties.All_Values, GPR_File) do
if Files.Is_Empty then
Files.Append (R.Project & ".gpr");
end if;
end return;
end GPR_Files;
--------------------------------
-- Print_Conditional_Property --
--------------------------------
procedure Print_Conditional_Property (Cond : Conditions.For_Properties.Conditional_Value) is
use GNAT.IO;
begin
if Cond.Is_Inconditional then
Cond.True_Value.Print (Prefix => " ");
else
if Cond.True_Value.Is_Empty then
Put_Line (" when not (" & Cond.Condition.Image & "):");
Cond.False_Value.Print (Prefix => " ");
else
Put_Line (" when " & Cond.Condition.Image & ":");
Cond.True_Value.Print (Prefix => " ");
if not Cond.False_Value.Is_Empty then
Put_Line (" else:");
Cond.False_Value.Print (Prefix => " ");
end if;
end if;
end if;
end Print_Conditional_Property;
-----------
-- Print --
-----------
@@ -72,17 +96,11 @@ package body Alire.Releases is
Put_Line ("Available when: " & R.Available.Image);
end if;
-- REQUISITES
if not R.Reqs.Is_Empty then
Put ("Requisites: ");
R.Reqs.Print_Skeleton;
end if;
-- PROPERTIES
if not R.Props.Is_Empty then
if not R.Properties.Is_Empty then
Put_Line ("Properties:");
for Prop of R.Props loop
Put_Line (" " & Prop.Image);
for Cond of R.Properties loop
Print_Conditional_Property (Cond);
end loop;
end if;
@@ -104,7 +122,7 @@ package body Alire.Releases is
Search : constant String := To_Lower_Case (Str);
begin
for P of R.Props loop
for P of R.Properties.All_Values loop
declare
Text : constant String :=
To_Lower_Case
@@ -121,4 +139,24 @@ package body Alire.Releases is
return False;
end Property_Contains;
--------------
-- Whenever --
--------------
function Whenever (R : Release; P : Properties.Vector) return Release is
begin
return Solid : constant Release (R.Name_Len, R.Descr_Len) :=
(R.Name_Len, R.Descr_Len,
R.Name,
R.Description,
R.Version,
R.Origin,
R.Depends_On,
R.Properties.Evaluate (P),
R.Available)
do
null;
end return;
end Whenever;
end Alire.Releases;
+11 -8
View File
@@ -1,3 +1,4 @@
with Alire.Conditions;
with Alire.Dependencies.Vectors;
with Alire.Milestones;
with Alire.Origins;
@@ -21,11 +22,13 @@ package Alire.Releases with Preelaborate is
Version : Semantic_Versioning.Version;
Origin : Origins.Origin;
Depends_On : Dependencies;
Properties : Alire.Properties.Vector;
Requisites : Alire.Requisites.Tree;
Properties : Conditions.Properties.Vector;
Available : Alire.Requisites.Tree) return Release;
function "<" (L, R : Release) return Boolean;
function Whenever (R : Release; P : Properties.Vector) return Release;
-- Materialize conditions in a Release once the system/whatever properties are known
function Project (R : Release) return Project_Name;
function Description (R : Release) return Project_Description;
@@ -68,18 +71,19 @@ private
Version : Semantic_Versioning.Version;
Origin : Origins.Origin;
Depends_On : Dependencies;
Props : Properties.Vector;
Reqs : Requisites.Tree;
Properties : Conditions.Properties.Vector;
-- Reqs : Requisites.Tree;
Available : Requisites.Tree;
end record;
use Conditions.Properties;
function New_Release (Name : Project_Name;
Description : Project_Description;
Version : Semantic_Versioning.Version;
Origin : Origins.Origin;
Depends_On : Dependencies;
Properties : Alire.Properties.Vector;
Requisites : Alire.Requisites.Tree;
Properties : Conditions.Properties.Vector;
Available : Alire.Requisites.Tree) return Release is
(Name'Length, Description'Length,
Name,
@@ -87,8 +91,7 @@ private
Version,
Origin,
Depends_On,
Properties and Describe (Description),
Requisites,
+Conditions.For_Properties.New_Inconditional (Describe (Description)) and Properties,
Available);
use Semantic_Versioning;
+3 -4
View File
@@ -1,6 +1,7 @@
with Ada.Directories;
with Alire.Conditions;
with Alire.Containers;
with Alire.Index;
with Alire.Origins;
@@ -32,8 +33,7 @@ package body Alire.Root_Project is
function Set (Project : Alire.Project_Name;
Version : Semantic_Versioning.Version;
Depends_On : Alire.Dependencies.Vectors.Vector := Alire.Dependencies.Vectors.No_Dependencies;
Properties : Alire.Properties.Vector := Alire.Properties.No_Properties)
Depends_On : Alire.Dependencies.Vectors.Vector := Alire.Dependencies.Vectors.No_Dependencies)
return Releases.Release
is
use Origins;
@@ -46,8 +46,7 @@ package body Alire.Root_Project is
Version,
New_Filesystem (Ada.Directories.Current_Directory),
Depends_On,
Properties => Properties,
Requisites => Requisites.No_Requisites,
Properties => Conditions.Properties.Empty_Vector,
Available => Requisites.No_Requisites);
begin
if Index.Exists (Project, Version) then
+1 -3
View File
@@ -1,5 +1,4 @@
with Alire.Dependencies.Vectors;
with Alire.Properties;
with Alire.Releases;
with Semantic_Versioning;
@@ -12,8 +11,7 @@ package Alire.Root_Project is
function Set (Project : Alire.Project_Name;
Version : Semantic_Versioning.Version;
Depends_On : Alire.Dependencies.Vectors.Vector := Alire.Dependencies.Vectors.No_Dependencies;
Properties : Alire.Properties.Vector := Alire.Properties.No_Properties)
Depends_On : Alire.Dependencies.Vectors.Vector := Alire.Dependencies.Vectors.No_Dependencies)
return Releases.Release;
-- This function must be called in the working project alire file.
-- Otherwise alr does not know what's the current project, and its version and dependencies