mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 06:49:16 +02:00
* Added ability to build fpmakes with multiple packages
git-svn-id: trunk@29349 -
This commit is contained in:
parent
4956784613
commit
164d5a4f38
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user