Ver Fonte

* Added ability to generate target-dependencies

git-svn-id: trunk@20579 -
joost há 13 anos atrás
pai
commit
ae5c440864
2 ficheiros alterados com 61 adições e 2 exclusões
  1. 10 0
      utils/fpgmake/fpmakecreatefile.pas
  2. 51 2
      utils/fpgmake/fpmakeparsejson.pas

+ 10 - 0
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;';

+ 51 - 2
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}