mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 11:29:27 +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,
|
||||
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;
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user