From ae5c44086407b92f8f483afe1b70c068e1457d4f Mon Sep 17 00:00:00 2001 From: joost Date: Thu, 22 Mar 2012 16:40:58 +0000 Subject: [PATCH] * Added ability to generate target-dependencies git-svn-id: trunk@20579 - --- utils/fpgmake/fpmakecreatefile.pas | 10 ++++++ utils/fpgmake/fpmakeparsejson.pas | 53 ++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/utils/fpgmake/fpmakecreatefile.pas b/utils/fpgmake/fpmakecreatefile.pas index c9298446ab..97bd47d062 100644 --- a/utils/fpgmake/fpmakecreatefile.pas +++ b/utils/fpgmake/fpmakecreatefile.pas @@ -89,6 +89,7 @@ function GetTargetsMacro(aTargets: TTargets): string; var ATarget: TTarget; i: Integer; + d: integer; begin if aTargets.Count=0 then Exit; @@ -100,6 +101,15 @@ begin result := result + GetConditionalAdd(ATarget.Name + ATarget.Extension, ATarget.CPUs, ATarget.OSes,' T := AddUnit'); if atarget.ResourceStrings then result := result + ' T.Resourcestrings := True;'+LineEnding; + for d := 0 to aTarget.Dependencies.Count-1 do + begin + if ATarget.Dependencies[d].DependencyType=depInclude then + result := result + ' T.Dependencies.AddInclude('''+ATarget.Dependencies[d].Value+''');'+LineEnding + else if ATarget.Dependencies[d].DependencyType=depUnit then + result := result + ' T.Dependencies.AddUnit('''+ATarget.Dependencies[d].Value+''');'+LineEnding + else + result := result + ' T.Dependencies.Add('''+ATarget.Dependencies[d].Value+''');'+LineEnding; + end; end; result := result + ' end;'; diff --git a/utils/fpgmake/fpmakeparsejson.pas b/utils/fpgmake/fpmakeparsejson.pas index bce8709643..a0172fd544 100644 --- a/utils/fpgmake/fpmakeparsejson.pas +++ b/utils/fpgmake/fpmakeparsejson.pas @@ -108,13 +108,13 @@ begin else if AJsonObject.Names[m] = ValueCaption then ADependency.Value := AJsonObject.Items[m].AsString else - raise Exception.CreateFmt('Unknown dependency property ''%s''.',[AJsonObject.Names[m]]); + raise Exception.CreateFmt('Unknown conditional property ''%s''.',[AJsonObject.Names[m]]); end {case} end; end else - raise Exception.CreateFmt('Invalid dependency. (%s)',[AJsonData.AsString]); + raise Exception.CreateFmt('Invalid conditional. (%s)',[AJsonData.AsString]); end; procedure ParseConditionalArray(ACondStrings: TConditionalStrings; AJsonData: TJSonData; ValueCaption: string); @@ -132,6 +132,54 @@ begin ParseConditionalString(ACondStrings.add(''), AJsonData, ValueCaption); end; +procedure ParseDependenciesArray(ACondStrings: TDependencies; AJsonData: TJSonData; ValueCaption: string; aDepType: TDependencyType); +var + AJSonArray: TJSONArray; + n: Integer; + + function GetDep: TDependency; + begin + if aDepType=depInclude then + result := ACondStrings.AddInclude('') + else if aDepType=depUnit then + result := ACondStrings.AddUnit('') + else + result := ACondStrings.Add(''); + end; + +begin + if AJsonData.JSONType = jtArray then + begin + AJSonArray := AJsonData as TJSONArray; + for n := 0 to AJSonArray.Count-1 do + ParseConditionalString(GetDep, AJSonArray.Items[n], ValueCaption); + end + else + ParseConditionalString(GetDep, AJsonData, ValueCaption); +end; + +procedure ParseDependencies(aDependencies: TDependencies; aJSONData: TJSONData); +var + AJsonObject: TJSONObject; + m: Integer; +begin + if aJSONData.JSONType<>jtObject then + raise exception.create('A target''s dependency has to be an object which encapsulated the different types of dependencies.') + else + begin + AJsonObject := aJSONData as TJSONObject; + for m := 0 to AJsonObject.Count-1 do + begin + case AJsonObject.Names[m] of + 'includefiles' : ParseDependenciesArray(aDependencies, AJsonObject.items[m],'filename', depInclude); + 'units' : ParseDependenciesArray(aDependencies, AJsonObject.items[m],'filename', depUnit); + else + raise Exception.CreateFmt('Unknown dependency property ''%s''.',[AJsonObject.Names[m]]); + end {case} + end; + end +end; + procedure ParseUnitTarget(aTarget: TTarget; aJSONData: TJSONData); var AJsonObject: TJSONObject; @@ -149,6 +197,7 @@ begin 'resourcestrings' : atarget.ResourceStrings := (AJsonObject.items[m] as TJSONBoolean).AsBoolean; 'oses' : aTarget.OSes := ExtStringToOSes(AJsonObject.Items[m].AsString); 'cpus' : aTarget.cpus := ExtStringToCPUs(AJsonObject.Items[m].AsString); + 'dependencies' : ParseDependencies(aTarget.Dependencies, AJsonObject.Items[m]); else raise Exception.CreateFmt('Unknown targets property ''%s''.',[AJsonObject.Names[m]]); end {case}