Explorar o código

* Do not scan for available packages while checking for fpmkunit dependencies
because those scans could depend on compilation of the fpmkunit itself.
For the same reason the the fpmkunit-dependencies are checked now before
the 'normal' scan for available/installed packages.

git-svn-id: trunk@34648 -

joost %!s(int64=8) %!d(string=hai) anos
pai
achega
fde6b0b53b

+ 32 - 11
packages/fppkg/src/pkgfppkg.pp

@@ -26,7 +26,9 @@ type
     FOptions: TFppkgOptions;
     FCompilerOptions: TCompilerOptions;
     FFpmakeCompilerOptions: TCompilerOptions;
-    procedure ScanPackagesOnDisk(ACompilerOptions: TCompilerOptions; ARepositoryList: TComponentList);
+    function IncludeRepositoryTypeForPackageKind(ARepositoryType: TFPRepositoryType;
+      APackageKind: TpkgPackageKind): Boolean;
+    procedure ScanPackagesOnDisk(ACompilerOptions: TCompilerOptions; APackageKind: TpkgPackageKind; ARepositoryList: TComponentList);
     function  FindPackage(ARepositoryList: TComponentList; APackageName: string; APackageKind: TpkgPackageKind): TFPPackage;
   public
     constructor Create(AOwner: TComponent); override;
@@ -57,6 +59,9 @@ type
 
 implementation
 
+uses
+  pkgrepos;
+
 { TpkgFPpkg }
 
 constructor TpkgFPpkg.Create(AOwner: TComponent);
@@ -79,8 +84,16 @@ begin
   inherited Destroy;
 end;
 
+function TpkgFPpkg.IncludeRepositoryTypeForPackageKind(ARepositoryType: TFPRepositoryType;
+  APackageKind: TpkgPackageKind): Boolean;
+begin
+  Result := ((APackageKind=pkgpkInstalled) and (ARepositoryType = fprtInstalled)) or
+    ((APackageKind=pkgpkAvailable) and (ARepositoryType = fprtAvailable)) or
+    (APackageKind=pkgpkBoth);
+end;
+
 procedure TpkgFPpkg.ScanPackagesOnDisk(ACompilerOptions: TCompilerOptions;
-  ARepositoryList: TComponentList);
+  APackageKind: TpkgPackageKind; ARepositoryList: TComponentList);
 var
   i: Integer;
   RepoOption: TFppkgRepositoryOptionSection;
@@ -92,11 +105,14 @@ begin
       if FOptions.SectionList[i] is TFppkgRepositoryOptionSection then
         begin
           RepoOption := TFppkgRepositoryOptionSection(FOptions.SectionList[i]);
-          Repo := RepoOption.InitRepository(Self, ACompilerOptions);
-          if Assigned(Repo) then
+          if IncludeRepositoryTypeForPackageKind(RepoOption.GetRepositoryType, APackageKind) then
             begin
-              ARepositoryList.Add(Repo);
-              Repo.DefaultPackagesStructure.AddPackagesToRepository(Repo);
+              Repo := RepoOption.InitRepository(Self, ACompilerOptions);
+              if Assigned(Repo) then
+                begin
+                  ARepositoryList.Add(Repo);
+                  Repo.DefaultPackagesStructure.AddPackagesToRepository(Repo);
+                end;
             end;
         end;
     end;
@@ -229,8 +245,15 @@ end;
 
 procedure TpkgFPpkg.ScanPackages;
 begin
-  ScanPackagesOnDisk(FFpmakeCompilerOptions, FPMakeRepositoryList);
-  ScanPackagesOnDisk(FCompilerOptions, RepositoryList);
+  // There is no need to scan for available packages and add them to the
+  // FPMakeRepositoryList. Beside that it could lead to problems
+  // when the scan of one of the available-repositories tries to compile an
+  // fpmake-executable. (Like TFPUninstalledSourcesAvailablePackagesStructure does)
+  ScanPackagesOnDisk(FFpmakeCompilerOptions, pkgpkInstalled, FPMakeRepositoryList);
+
+  CheckFPMakeDependencies;
+
+  ScanPackagesOnDisk(FCompilerOptions, pkgpkBoth, RepositoryList);
   ScanAvailablePackages;
 end;
 
@@ -255,9 +278,7 @@ begin
   for i := ARepositoryList.Count-1 downto 0 do
     begin
       Repo := ARepositoryList.Items[i] as TFPRepository;
-      if ((APackageKind=pkgpkInstalled) and (Repo.RepositoryType = fprtInstalled)) or
-        ((APackageKind=pkgpkAvailable) and (Repo.RepositoryType = fprtAvailable)) or
-        (APackageKind=pkgpkBoth) then
+      if IncludeRepositoryTypeForPackageKind(Repo.RepositoryType, APackageKind) then
         begin
           Result := repo.FindPackage(APackageName);
           if Assigned(Result) then

+ 7 - 1
packages/fppkg/src/pkgoptions.pp

@@ -127,6 +127,7 @@ Type
     procedure AddKeyValue(const AKey, AValue: string); override;
     procedure LogValues(ALogLevel: TLogLevel); override;
     function AllowDuplicate: Boolean; override;
+    function GetRepositoryType: TFPRepositoryType; virtual;
 
     function InitRepository(AParent: TComponent; ACompilerOptions: TCompilerOptions): TFPRepository; virtual;
 
@@ -348,6 +349,11 @@ begin
   Result := True;
 end;
 
+function TFppkgRepositoryOptionSection.GetRepositoryType: TFPRepositoryType;
+begin
+  result := fprtInstalled;
+end;
+
 function TFppkgRepositoryOptionSection.InitRepository(AParent: TComponent;
   ACompilerOptions: TCompilerOptions): TFPRepository;
 var
@@ -356,7 +362,7 @@ begin
   if Path <> '' then
     begin
       Result := TFPRepository.Create(AParent);
-      Result.RepositoryType := fprtInstalled;
+      Result.RepositoryType := GetRepositoryType;
       Result.RepositoryName := RepositoryName;
       Result.Description := Description;
       InstPackages := TFPInstalledPackagesStructure.Create(AParent, Path, ACompilerOptions);

+ 8 - 1
packages/fppkg/src/pkguninstalledsourcesrepository.pp

@@ -27,6 +27,8 @@ type
     constructor Create(AnOptionParser: TTemplateParser); override;
     procedure AddKeyValue(const AKey, AValue: string); override;
     function InitRepository(AParent: TComponent; ACompilerOptions: TCompilerOptions): TFPRepository; override;
+
+    function GetRepositoryType: TFPRepositoryType; override;
   end;
 
   { TFPUninstalledSourcesAvailablePackagesStructure }
@@ -63,7 +65,7 @@ begin
   if Path <> '' then
     begin
       Result := TFPRepository.Create(AParent);
-      Result.RepositoryType := fprtAvailable;
+      Result.RepositoryType := GetRepositoryType;
       Result.RepositoryName := RepositoryName;
       Result.Description := Description;
       InstPackages := TFPUninstalledSourcesAvailablePackagesStructure.Create(AParent, Path, ACompilerOptions);
@@ -71,6 +73,11 @@ begin
     end;
 end;
 
+function TFppkgUninstalledSourceRepositoryOptionSection.GetRepositoryType: TFPRepositoryType;
+begin
+  Result := fprtAvailable;
+end;
+
 { TFPUninstalledSourcesPackagesStructure }
 
 function TFPUninstalledSourcesAvailablePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;

+ 0 - 1
utils/fppkg/fppkg.pp

@@ -339,7 +339,6 @@ begin
         end;
       end;
     FindInstalledPackages(GFPpkg.FPMakeCompilerOptions,true);
-    CheckFPMakeDependencies;
     // We only need to reload the status when we use a different
     // configuration for compiling fpmake or when the CPU, OS or compiler
     // are set in the command-line