Browse Source

* Added ability to build fpmakes with multiple packages

git-svn-id: trunk@29349 -
joost 10 years ago
parent
commit
164d5a4f38
2 changed files with 94 additions and 45 deletions
  1. 68 38
      packages/fppkg/src/pkgcommands.pp
  2. 26 7
      packages/fppkg/src/pkgfpmake.pp

+ 68 - 38
packages/fppkg/src/pkgcommands.pp

@@ -16,6 +16,7 @@ uses
   pkgoptions,
   pkgdownload,
   pkgrepos,
+  fpxmlrep,
   fprepos;
 
 type
@@ -392,65 +393,94 @@ var
   P,
   InstalledP,
   AvailP : TFPPackage;
+  PackNr: integer;
+  ManifestPackages : TFPPackages;
+  X : TFPXMLRepositoryHandler;
   L : TStringList;
   status : string;
-  FreeManifest : boolean;
 begin
   if PackageName='' then
     Error(SErrNoPackageSpecified);
-  FreeManifest:=false;
+  ManifestPackages:=nil;
   // Load dependencies for local packages
   if (PackageName=CmdLinePackageName) or (PackageName=CurrentDirPackageName) then
     begin
       ExecuteAction(PackageName,'fpmakemanifest');
-      P:=LoadManifestFromFile(ManifestFileName);
-      FreeManifest:=true;
+      ManifestPackages:=TFPPackages.Create(TFPPackage);
+      X:=TFPXMLRepositoryHandler.Create;
+      try
+        X.LoadFromXml(ManifestPackages,ManifestFileName);
+      finally
+        X.Free;
+      end;
+      if ManifestPackages.Count>0 then
+        begin
+          PackNr:=0;
+          P := ManifestPackages[PackNr];
+        end
+      else
+        begin
+          ManifestPackages.Free;
+          Error(SErrManifestNoSinglePackage,[ManifestFileName]);
+        end;
     end
   else
     P:=AvailableRepository.PackageByName(PackageName);
-  // Find and List dependencies
+
   MissingDependency:=nil;
-  L:=TStringList.Create;
-  for i:=0 to P.Dependencies.Count-1 do
+  while assigned(P) do
     begin
-      D:=P.Dependencies[i];
-      if (CompilerOptions.CompilerOS in D.OSes) and
-         (CompilerOptions.CompilerCPU in D.CPUs) then
+      // Find and List dependencies
+      L:=TStringList.Create;
+      for i:=0 to P.Dependencies.Count-1 do
         begin
-          InstalledP:=InstalledRepository.FindPackage(D.PackageName);
-          // Need installation?
-          if not assigned(InstalledP) or
-             (InstalledP.Version.CompareVersion(D.MinVersion)<0) then
+          D:=P.Dependencies[i];
+          if not ((CompilerOptions.CompilerOS in D.OSes) and (CompilerOptions.CompilerCPU in D.CPUs)) then
+            Log(llDebug,SDbgPackageDependencyOtherTarget,[D.PackageName,MakeTargetString(CompilerOptions.CompilerCPU,CompilerOptions.CompilerOS)])
+          // Skip dependencies that are available within the fpmake-file itself
+          else if not (assigned(ManifestPackages) and assigned(ManifestPackages.FindPackage(D.PackageName))) then
             begin
-              AvailP:=AvailableRepository.FindPackage(D.PackageName);
-              if not assigned(AvailP) or
-                 (AvailP.Version.CompareVersion(D.MinVersion)<0) then
+              InstalledP:=InstalledRepository.FindPackage(D.PackageName);
+              // Need installation?
+              if not assigned(InstalledP) or
+                 (InstalledP.Version.CompareVersion(D.MinVersion)<0) then
                 begin
-                  status:='Not Available!';
-                  MissingDependency:=D;
+                  AvailP:=AvailableRepository.FindPackage(D.PackageName);
+                  if not assigned(AvailP) or
+                     (AvailP.Version.CompareVersion(D.MinVersion)<0) then
+                    begin
+                      status:='Not Available!';
+                      MissingDependency:=D;
+                    end
+                  else
+                    begin
+                      status:='Updating';
+                      L.Add(D.PackageName);
+                    end;
                 end
               else
                 begin
-                  status:='Updating';
-                  L.Add(D.PackageName);
+                  if PackageIsBroken(InstalledP, True) then
+                    begin
+                      status:='Broken, recompiling';
+                      L.Add(D.PackageName);
+                    end
+                  else
+                    status:='OK';
                 end;
+              Log(llInfo,SLogPackageDependency,
+                  [D.PackageName,D.MinVersion.AsString,PackageInstalledVersionStr(D.PackageName),
+                   PackageAvailableVersionStr(D.PackageName),status])
             end
+        end;
+      if assigned(ManifestPackages) then
+        begin
+          inc(PackNr);
+          if PackNr<ManifestPackages.Count then
+            P := ManifestPackages[PackNr]
           else
-            begin
-              if PackageIsBroken(InstalledP, True) then
-                begin
-                  status:='Broken, recompiling';
-                  L.Add(D.PackageName);
-                end
-              else
-                status:='OK';
-            end;
-          Log(llInfo,SLogPackageDependency,
-              [D.PackageName,D.MinVersion.AsString,PackageInstalledVersionStr(D.PackageName),
-               PackageAvailableVersionStr(D.PackageName),status]);
-        end
-      else
-        Log(llDebug,SDbgPackageDependencyOtherTarget,[D.PackageName,MakeTargetString(CompilerOptions.CompilerCPU,CompilerOptions.CompilerOS)]);
+            P := nil;
+        end;
     end;
   // Give error on first missing dependency
   if assigned(MissingDependency) then
@@ -470,8 +500,8 @@ begin
         pkgglobals.Log(llProgres,SProgrDependenciesInstalled);
     end;
   FreeAndNil(L);
-  if FreeManifest then
-    FreeAndNil(P);
+  if assigned(ManifestPackages) then
+    ManifestPackages.Free;
 end;
 
 

+ 26 - 7
packages/fppkg/src/pkgfpmake.pp

@@ -15,7 +15,8 @@ uses
   pkgoptions,
   pkgglobals,
   pkgmessages,
-  pkgrepos;
+  pkgrepos,
+  fpxmlrep;
 
 type
   { TFPMakeCompiler }
@@ -269,6 +270,29 @@ Var
       AddOption(Name+'='+Value);
   end;
 
+  procedure ObtainSupportedTargetsFromManifest(p:TFPPackage);
+  var
+    X : TFPXMLRepositoryHandler;
+    ManifestPackages : TFPPackages;
+    i: integer;
+  begin
+    p.OSes:=[];
+    p.CPUs:=[];
+    ManifestPackages:=TFPPackages.Create(TFPPackage);
+    X:=TFPXMLRepositoryHandler.Create;
+    try
+      X.LoadFromXml(ManifestPackages,ManifestFileName);
+      for i := 0 to ManifestPackages.Count-1 do
+        begin
+          p.OSes:=p.OSes+ManifestPackages[i].OSes;
+          p.CPUs:=p.CPUs+ManifestPackages[i].CPUs;
+        end;
+    finally
+      X.Free;
+      ManifestPackages.Free;
+    end;
+  end;
+
 begin
   OOptions:='';
   // Does the current package support this CPU-OS?
@@ -276,12 +300,7 @@ begin
     begin
       P:=AvailableRepository.PackageByName(PackageName);
       if (PackageName=CurrentDirPackageName) and (FileExists(ManifestFileName)) then
-        begin
-          ManifestPackage:=LoadManifestFromFile(ManifestFileName);
-          P.OSes:=ManifestPackage.OSes;
-          P.CPUs:=ManifestPackage.CPUs;
-          ManifestPackage.Free;
-        end;
+        ObtainSupportedTargetsFromManifest(p);
     end
   else
     P:=nil;