diff --git a/index/alire-index-alire.ads b/index/alire-index-alire.ads index 49a26978..8e56807b 100644 --- a/index/alire-index-alire.ads +++ b/index/alire-index-alire.ads @@ -24,6 +24,15 @@ package Alire.Index.Alire is V ("1.0.0"), "Release with all index syntax features", Origins.New_Filesystem ("/fake"), + + Depends_On => + Current ("half_life_3") and -- unconditional + If_Platform -- conditional + (System_Is (GNU_Linux), + When_True => At_Least ("elite_horizons", "2.0") and + At_Least ("star_citizen", "3.0"), -- Wish... + When_False => At_Least ("windows_100", "1.0")), + Properties => GPR_Scenario ("Build", "Debug" or "Release") and GPR_Free_Scenario ("Path_To_Something") and @@ -43,6 +52,7 @@ package Alire.Index.Alire is When_False => Comment ("I am a rock")) and Comment ("Tell me about your mother") and Website ("http://www.www.www"), + 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))); diff --git a/src/alire-conditional.ads b/src/alire-conditional.ads index dd0ef238..44657211 100644 --- a/src/alire-conditional.ads +++ b/src/alire-conditional.ads @@ -4,7 +4,7 @@ with Alire.Requisites; generic type Values is private; 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) + -- FIXME: we'll have to keep an eye on the overhead of this (append to be considered instead) package Alire.Conditional with Preelaborate is type Conditional_Value (<>) is tagged private; diff --git a/src/alire-conditions.ads b/src/alire-conditions.ads index 008169d0..8acffc6f 100644 --- a/src/alire-conditions.ads +++ b/src/alire-conditions.ads @@ -4,6 +4,8 @@ with Alire.Dependencies.Vectors; with Alire.Properties; with Alire.Requisites; +private with Semantic_Versioning; + package Alire.Conditions with Preelaborate is package For_Dependencies is new Conditional (Dependencies.Vectors.Vector, diff --git a/src/alire-index.ads b/src/alire-index.ads index 06f520ea..7b247f51 100644 --- a/src/alire-index.ads +++ b/src/alire-index.ads @@ -22,7 +22,7 @@ with Semantic_Versioning; package Alire.Index is - Releases : Containers.Release_Set; + Catalog : Containers.Release_Set; subtype Release_Dependencies is Conditions.Dependencies.Vector; subtype Release_Properties is Conditions.Properties.Vector; @@ -76,64 +76,52 @@ package Alire.Index is function V (Semantic_Version : String) return Semver.Version renames Semver.New_Version; - function On (Name : Project_Name; Versions : Semver.Version_Set) - return Conditions.Dependencies.Vector is - (Conditions.Dependencies.New_Unconditional - (Dependencies.Vectors.New_Dependency (Name, Versions))); - -- This shortcut is mostly for use here, since version sets will usually be - -- constructed directly with a project, using one of the following + function On (Name : Project_Name; + Versions : Semver.Version_Set) + return Conditions.Dependencies.Vector renames Releases.On; -- We provide two easy shortcut forms: -- One, using another release, from which we'll take name and version - -- The advantage is that strong typing is used - -- Two, using a name plus a textual version - -- Simpler if there's no exact release matching the versions we want to say - -- Also needed for the generated _alr files which don't know package names + -- The advantage is that strong typing is used + -- Two, using textual name plus version + -- Simpler if there's no exact release matching the versions we want to say + -- Also needed for the generated _alr files which don't know about package names function Current (R : Release) return Release_Dependencies is - (On (R.Project, - Semver.Within_Major (Semver.New_Version (Semver.Major (R.Version))))); + (On (R.Project, Semver.Within_Major (Semver.New_Version (Semver.Major (R.Version))))); -- Within the major of R, -- it will accept the newest/oldest version according to the resolution policy (by default, newest) -- Note: it might be older than R itself - generic - with function Condition (V : Semver.Version) return Semver.Version_Set; - function From_Release (R : Release) return Release_Dependencies; - -- Just another shortcut for the following declarations - - function Within_Major is new From_Release (Semver.Within_Major); - function Within_Minor is new From_Release (Semver.Within_Minor); - - function Within_Major (R : Release) return Release_Dependencies is - (On (R.Project, Semver.Within_Major (R.Version))); - function Within_Minor (R : Release) return Release_Dependencies is - (On (R.Project, Semver.Within_Minor (R.Version))); - - function At_Least (R : Release) return Dependencies; - function At_Most (R : Release) return Dependencies; - function Less_Than (R : Release) return Dependencies; - function More_Than (R : Release) return Dependencies; - function Exactly (R : Release) return Dependencies; - function Except (R : Release) return Dependencies; + -- These take a release and use its name and version to derive a dependency + function Within_Major is new Releases.From_Release (Semver.Within_Major); + function Within_Minor is new Releases.From_Release (Semver.Within_Minor); + function At_Least is new Releases.From_Release (Semver.At_Least); + function At_Most is new Releases.From_Release (Semver.At_Most); + function Less_Than is new Releases.From_Release (Semver.Less_Than); + function More_Than is new Releases.From_Release (Semver.More_Than); + function Exactly is new Releases.From_Release (Semver.Exactly); + function Except is new Releases.From_Release (Semver.Except); subtype Version is Semantic_Versioning.Version; subtype Version_Set is Semantic_Versioning.Version_Set; - function Current (P : Project_Name) return Dependencies; - -- Will accept the newest/oldest version according to the resolution policy (by default, newest) + function Current (P : Project_Name) return Release_Dependencies is (On (P, Semver.Any)); + + -- These take a project name and a version string + function Within_Major is new Releases.From_Names (Semver.Within_Major); + function Within_Minor is new Releases.From_Names (Semver.Within_Minor); + function At_Least is new Releases.From_Names (Semver.At_Least); + function At_Most is new Releases.From_Names (Semver.At_Most); + function Less_Than is new Releases.From_Names (Semver.Less_Than); + function More_Than is new Releases.From_Names (Semver.More_Than); + function Exactly is new Releases.From_Names (Semver.Exactly); + function Except is new Releases.From_Names (Semver.Except); - function Within_Major (P : Project_Name; V : Version) return Dependencies; - function Within_Minor (P : Project_Name; V : Version) return Dependencies; - - function At_Least (P : Project_Name; V : Version) return Dependencies; - function At_Most (P : Project_Name; V : Version) return Dependencies; - function Less_Than (P : Project_Name; V : Version) return Dependencies; - function More_Than (P : Project_Name; V : Version) return Dependencies; - function Exactly (P : Project_Name; V : Version) return Dependencies; - function Except (P : Project_Name; V : Version) return Dependencies; - - -- Shortcuts for properties/requisites: + ------------------ + -- PROPERTIES -- + ------------------ + -- (as vectors of conditionals) -- use all type Alire.Dependencies.Vectors.Vector; use all type GPR.Value; @@ -143,13 +131,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_Dependencies; use all type Release_Properties; use all type Requisites.Tree; - -- Function for introducing conditional properties + -- Function for introducing conditional properties depending on platform conditions + function If_Platform (Condition : Requisites.Tree; + When_True : Dependencies.Vector; + When_False : Dependencies.Vector := Dependencies.Vectors.No_Dependencies) + return Release_Dependencies; + function If_Platform (Condition : Requisites.Tree; When_True : Properties.Vector; - When_False : Properties.Vector := Properties.No_Properties) return Release_Properties; + When_False : Properties.Vector := Properties.No_Properties) + return Release_Properties; -- Attributes (named pairs of label-value) -- We need them as Properties.Vector (inside conditionals) but also as @@ -173,16 +168,19 @@ package Alire.Index is function Website is new PL.Generic_New_Label (Properties.Labeled.Website); function Website is new PL.Unconditional_New_Label (Properties.Labeled.Website); + + function U (Prop : Properties.Vector) return Conditions.Properties.Vector + renames Conditions.Properties.New_Unconditional; -- Non-label attributes require a custom builder function function GPR_Free_Scenario (Name : String) return Properties.Vector is (+Properties.Scenarios.New_Variable (GPR.Free_Variable (Name))); - function GPR_Free_Scenario (Name : String) return Conditions.Properties.Vector is (Conditions.Properties.New_Unconditional (GPR_Free_Scenario (Name))); + function GPR_Free_Scenario (Name : String) return Conditions.Properties.Vector is (U (GPR_Free_Scenario (Name))); function GPR_Scenario (Name : String; Values : GPR.Value_Vector) return Properties.Vector is (+Properties.Scenarios.New_Variable (GPR.Enum_Variable (Name, Values))); - function GPR_Scenario (Name : String; Values : GPR.Value_Vector) return Conditions.Properties.Vector is (Conditions.Properties.New_Unconditional (GPR_Scenario (Name, Values))); + function GPR_Scenario (Name : String; Values : GPR.Value_Vector) return Conditions.Properties.Vector is (U (GPR_Scenario (Name, Values))); function License (L : Licensing.Licenses) return Properties.Vector is (+Properties.Licenses.Values.New_Property (L)); - function License (L : Licensing.Licenses) return Conditions.Properties.Vector is (Conditions.Properties.New_Unconditional (License (L))); + function License (L : Licensing.Licenses) return Conditions.Properties.Vector is (U (License (L))); function "and" (D1, D2 : Dependencies.Vector) return Dependencies.Vector renames Alire.Dependencies.Vectors."and"; function "and" (P1, P2 : Properties.Vector) return Properties.Vector renames Alire.Properties."and"; @@ -193,7 +191,9 @@ package Alire.Index is -- function Requires (R : Requisites.Requisite'Class) return Requisites.Tree; -- function "+" (R : Requisites.Requisite'Class) return Requisites.Tree renames Requires; - -- Specific shortcuts: + ------------------ + -- REQUISITES -- + ------------------ function Compiler_Is_At_Least (V : Platforms.Compilers) return Requisites.Tree renames Requisites.Platform.Compiler_Is_At_Least; @@ -225,77 +225,22 @@ package Alire.Index is private - function From_Release (R : Release) return Release_Dependencies is - (On (R.Project, Condition (R.Version))); - -- Body for the generic above +-- function Verifies (P : Properties.Property'Class) return Properties.Vector is +-- (Properties.To_Vector (P, 1)); +-- +-- function Requires (R : Requisites.Requisite'Class) return Requisites.Tree is +-- (Requisites.Trees.Leaf (R)); - use Semantic_Versioning; - - function Current (R : Release) return Dependencies is - (New_Dependency (R.Project, Within_Major (New_Version (Major (R.Version))))); - - function Within_Major (R : Release) return Dependencies is - (New_Dependency (R.Project, Within_Major (R.Version))); - - function Within_Minor (R : Release) return Dependencies is - (New_Dependency (R.Project, Within_Minor (R.Version))); - - function At_Least (R : Release) return Dependencies is - (New_Dependency (R.Project, At_Least (R.Version))); - - function At_Most (R : Release) return Dependencies is - (New_Dependency (R.Project, At_Most (R.Version))); - - function Less_Than (R : Release) return Dependencies is - (New_Dependency (R.Project, Less_Than (R.Version))); - - function More_Than (R : Release) return Dependencies is - (New_Dependency (R.Project, More_Than (R.Version))); - - function Exactly (R : Release) return Dependencies is - (New_Dependency (R.Project, Exactly (R.Version))); - - function Except (R : Release) return Dependencies is - (New_Dependency (R.Project, Except (R.Version))); - - - function Current (P : Project_Name) return Dependencies is - (New_Dependency (P, At_Least (V ("0.0.0")))); - - function Within_Major (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, Within_Major (V))); - - function Within_Minor (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, Within_Minor (V))); - - function At_Least (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, At_Least (V))); - - function At_Most (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, At_Most (V))); - - function Less_Than (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, Less_Than (V))); - - function More_Than (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, More_Than (V))); - - function Exactly (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, Exactly (V))); - - function Except (P : Project_Name; V : Version) return Dependencies is - (New_Dependency (P, Except (V))); - - - function Verifies (P : Properties.Property'Class) return Properties.Vector is - (Properties.To_Vector (P, 1)); - - function Requires (R : Requisites.Requisite'Class) return Requisites.Tree is - (Requisites.Trees.Leaf (R)); + function If_Platform (Condition : Requisites.Tree; + When_True : Dependencies.Vector; + When_False : Dependencies.Vector := Dependencies.Vectors.No_Dependencies) + return Release_Dependencies is + (Conditions.Dependencies.New_Conditional (Condition, When_True, When_False)); function If_Platform (Condition : Requisites.Tree; When_True : Properties.Vector; - When_False : Properties.Vector := Properties.No_Properties) return Release_Properties is + When_False : Properties.Vector := Properties.No_Properties) + return Release_Properties is (Conditions.Properties.New_Conditional (Condition, When_True, When_False)); end Alire.Index; diff --git a/src/alire-releases.ads b/src/alire-releases.ads index af7ef476..90c76cd1 100644 --- a/src/alire-releases.ads +++ b/src/alire-releases.ads @@ -1,5 +1,6 @@ with Alire.Conditions; with Alire.Dependencies; +with Alire.Dependencies.Vectors; with Alire.Milestones; with Alire.Origins; with Alire.Properties; @@ -60,6 +61,21 @@ package Alire.Releases with Preelaborate is function Property_Contains (R : Release; Str : String) return Boolean; -- True if some property contains the given string + + -- Dependency generation helpers + + function On (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) + return Conditions.Dependencies.Vector; + + generic + with function Condition (V : Semantic_Versioning.Version) return Semantic_Versioning.Version_Set; + function From_Release (R : Release) return Conditions.Dependencies.Vector; + + generic + with function Condition (V : Semantic_Versioning.Version) return Semantic_Versioning.Version_Set; + function From_Names (P : Project_Name; + V : Semantic_Versioning.Version_String) return Conditions.Dependencies.Vector; private @@ -125,5 +141,20 @@ private Image (R.Version) & "_" & (if R.Origin.Id'Length <= 8 then R.Origin.Id else R.Origin.Id (R.Origin.Id'First .. R.Origin.Id'First + 7))); + + -- Dependency helpers + + function On (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) + return Conditions.Dependencies.Vector is + (Conditions.Dependencies.New_Unconditional -- A conditional (without condition) dependency vector + (Dependencies.Vectors.New_Dependency (Name, Versions))); -- A dependency vector + + function From_Release (R : Release) return Conditions.Dependencies.Vector is + (On (R.Project, Condition (R.Version))); + + function From_Names (P : Project_Name; + V : Semantic_Versioning.Version_String) return Conditions.Dependencies.Vector is + (On (P, Condition (Semantic_Versioning.New_Version (V)))); end Alire.Releases;