* Added ability to build fpmakes with multiple packages

git-svn-id: trunk@29349 -
This commit is contained in:
joost 2014-12-28 13:28:46 +00:00
parent 4956784613
commit 164d5a4f38
2 changed files with 94 additions and 45 deletions

View File

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

View File

@ -15,7 +15,8 @@ uses
pkgoptions, pkgoptions,
pkgglobals, pkgglobals,
pkgmessages, pkgmessages,
pkgrepos; pkgrepos,
fpxmlrep;
type type
{ TFPMakeCompiler } { TFPMakeCompiler }
@ -269,6 +270,29 @@ Var
AddOption(Name+'='+Value); AddOption(Name+'='+Value);
end; 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 begin
OOptions:=''; OOptions:='';
// Does the current package support this CPU-OS? // Does the current package support this CPU-OS?
@ -276,12 +300,7 @@ begin
begin begin
P:=AvailableRepository.PackageByName(PackageName); P:=AvailableRepository.PackageByName(PackageName);
if (PackageName=CurrentDirPackageName) and (FileExists(ManifestFileName)) then if (PackageName=CurrentDirPackageName) and (FileExists(ManifestFileName)) then
begin ObtainSupportedTargetsFromManifest(p);
ManifestPackage:=LoadManifestFromFile(ManifestFileName);
P.OSes:=ManifestPackage.OSes;
P.CPUs:=ManifestPackage.CPUs;
ManifestPackage.Free;
end;
end end
else else
P:=nil; P:=nil;