+ added new command 'pkglist' for listing of packages in format compatible with 'install.dat' file used by the text-mode installer - primarily for GO32v2 and OS/2 targets

git-svn-id: trunk@29221 -
This commit is contained in:
Tomas Hajny 2014-12-08 17:58:34 +00:00
parent 587d2247bc
commit c4eca70656

View File

@ -146,7 +146,7 @@ Type
TLogEvent = Procedure (Level : TVerboseLevel; Const Msg : String) of Object;
TNotifyProcEvent = procedure(Sender: TObject);
TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmDistClean,rmManifest,rmZipInstall);
TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmDistClean,rmManifest,rmZipInstall,rmPkgList);
TBuildMode = (bmOneByOne, bmBuildUnit{, bmSkipImplicitUnits});
TBuildModes = set of TBuildMode;
@ -234,6 +234,8 @@ Const
FPMakePPFile = 'fpmake.pp';
ManifestFile = 'manifest.xml';
PkgListFileBase = 'pkg-';
PkgListFileExt = '.lst';
DirNotFound = '<dirnotfound>';
@ -703,6 +705,8 @@ Type
FAfterInstallProc: TNotifyProcEvent;
FAfterManifest: TNotifyEvent;
FAfterManifestProc: TNotifyProcEvent;
FAfterPkgList: TNotifyEvent;
FAfterPkgListProc: TNotifyProcEvent;
FBeforeArchive: TNotifyEvent;
FBeforeArchiveProc: TNotifyProcEvent;
FBeforeClean: TNotifyEvent;
@ -713,6 +717,8 @@ Type
FBeforeInstallProc: TNotifyProcEvent;
FBeforeManifest: TNotifyEvent;
FBeforeManifestProc: TNotifyProcEvent;
FBeforePkgList: TNotifyEvent;
FBeforePkgListProc: TNotifyProcEvent;
FBuildMode: TBuildMode;
FFlags: TStrings;
FFPDocFormat: TFPDocFormats;
@ -792,6 +798,7 @@ Type
Procedure GetArchiveFiles(List : TStrings; ACPU:TCPU; AOS : TOS); virtual;
Procedure GetArchiveSourceFiles(List : TStrings); virtual;
Procedure GetManifest(Manifest : TStrings);
Procedure ListPackage(PkgList : TStrings);
Procedure AddPackageVariant(APackageVariant: TPackageVariants);
procedure ApplyPackageVariantToCompilerOptions(ACompilerOptions: tstrings);
procedure SetDefaultPackageVariant;
@ -856,6 +863,10 @@ Type
Property BeforeManifestProc : TNotifyProcEvent Read FBeforeManifestProc Write FBeforeManifestProc;
Property AfterManifest : TNotifyEvent Read FAfterManifest Write FAfterManifest;
Property AfterManifestProc : TNotifyProcEvent Read FAfterManifestProc Write FAfterManifestProc;
Property BeforePkgList : TNotifyEvent Read FBeforePkgList Write FBeforePkgList;
Property BeforePkgListProc : TNotifyProcEvent Read FBeforePkgListProc Write FBeforePkgListProc;
Property AfterPkgList : TNotifyEvent Read FAfterPkgList Write FAfterPkgList;
Property AfterPkgListProc : TNotifyProcEvent Read FAfterPkgListProc Write FAfterPkgListProc;
end;
{ TPackages }
@ -909,6 +920,7 @@ Type
FNoFPCCfg: Boolean;
FUseEnvironment: Boolean;
FZipPrefix: String;
FExplicitOSNone: Boolean;
function GetBuildCPU: TCpu;
function GetBuildOS: TOS;
function GetBuildString: String;
@ -955,6 +967,7 @@ Type
Property Target : String Read FTarget Write SetTarget;
Property OS : TOS Read FOS Write SetOS;
Property CPU : TCPU Read FCPU Write SetCPU;
Property ExplicitOSNone: Boolean read FExplicitOSNone Write FExplicitOSNone;
Property BuildString : String read GetBuildString;
Property BuildOS : TOS read GetBuildOS;
Property BuildCPU : TCpu read GetBuildCPU;
@ -1040,11 +1053,13 @@ Type
FAfterCompile: TNotifyEvent;
FAfterInstall: TNotifyEvent;
FAfterManifest: TNotifyEvent;
FAfterPkgList: TNotifyEvent;
FBeforeArchive: TNotifyEvent;
FBeforeClean: TNotifyEvent;
FBeforeCompile: TNotifyEvent;
FBeforeInstall: TNotifyEvent;
FBeforeManifest: TNotifyEvent;
FBeforePkgList: TNotifyEvent;
FOnCopyFile: TCopyFileProc;
FOnFinishCopy: TNotifyEvent;
@ -1140,6 +1155,7 @@ Type
Procedure Install(APackage : TPackage; AnArchiveFiles: boolean);
Procedure Archive(APackage : TPackage);
Procedure Manifest(APackage : TPackage);
Procedure PkgList(PkgList: TStrings; APackage : TPackage);
Procedure Clean(APackage : TPackage; AllTargets: boolean);
Procedure Clean(APackage : TPackage; ACPU:TCPU; AOS : TOS);
Procedure CompileDependencies(APackage : TPackage);
@ -1152,6 +1168,7 @@ Type
Procedure ZipInstall(Packages : TPackages);
Procedure Archive(Packages : TPackages);
procedure Manifest(Packages: TPackages);
procedure PkgList(Packages: TPackages);
Procedure Clean(Packages : TPackages; AllTargets: boolean);
Procedure Log(Level : TVerboseLevel; Msg : String);
@ -1172,6 +1189,8 @@ Type
Property AfterArchive : TNotifyEvent Read FAfterArchive Write FAfterArchive;
Property BeforeManifest : TNotifyEvent Read FBeforeManifest Write FBeforeManifest;
Property AfterManifest : TNotifyEvent Read FAfterManifest Write FAfterManifest;
Property BeforePkgList : TNotifyEvent Read FBeforePkgList Write FBeforePkgList;
Property AfterPkgList : TNotifyEvent Read FAfterPkgList Write FAfterPkgList;
Property OnLog : TLogEvent Read FOnLog Write FOnlog;
end;
@ -1204,6 +1223,7 @@ Type
Procedure ZipInstall; virtual;
Procedure Archive; virtual;
Procedure Manifest; virtual;
Procedure PkgList; virtual;
Public
Constructor Create(AOwner : TComponent); virtual;
Destructor destroy; override;
@ -1328,6 +1348,13 @@ Implementation
uses typinfo, rtlconsts;
const
{$ifdef CREATE_TAR_FILE}
ArchiveExtension = '.tar.gz';
{$else CREATE_TAR_FILE}
ArchiveExtension = '.zip';
{$endif CREATE_TAR_FILE}
{----------------- from strutils ---------------------}
function FindPart(const HelpWilds, inputStr: string): Integer;
@ -1537,6 +1564,7 @@ ResourceString
SInfoArchivingPackage = 'Archiving package %s in "%s"';
SInfoCleaningPackage = 'Cleaning package %s';
SInfoManifestPackage = 'Creating manifest for package %s';
SInfoPkgListPackage = 'Adding package %s to the package list';
SInfoCopyingFile = 'Copying file "%s" to "%s"';
SInfoDeletedFile = 'Deleted file "%s"';
SInfoRemovedDirectory = 'Removed directory "%s"';
@ -1563,6 +1591,7 @@ ResourceString
SDbgExternalDependency = 'External dependency %s found in "%s"';
SDbgBuildEngineArchiving = 'Build engine archiving';
SDbgBuildEngineGenerateManifests = 'Build engine generating manifests';
SDbgBuildEngineGeneratePkgList = 'Build engine generating package list';
SDbgBuildEngineCleaning = 'Build engine cleaning';
SDbgGenerating = 'Generating "%s"';
SDbgLoading = 'Loading "%s"';
@ -1600,6 +1629,7 @@ ResourceString
SHelpArchive = 'Create archive (zip) with all units in the package(s).';
SHelpHelp = 'This message.';
SHelpManifest = 'Create a manifest suitable for import in repository.';
SHelpPkgList = 'Create list of all packages suitable for FPC installer.';
SHelpZipInstall = 'Install all units in the package(s) into an archive.';
SHelpCmdOptions = 'Where options is one or more of the following:';
SHelpCPU = 'Compile for indicated CPU.';
@ -2138,17 +2168,23 @@ begin
end;
Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
Function MakeTargetString(CPU : TCPU;OS: TOS;ALimit83: boolean) : String;
begin
if (Defaults.BuildOS in AllLimit83fsOses) or
(OS in AllLimit83fsOses) then
if ALimit83 then
Result := OSToString(OS)
else
Result:=CPUToString(CPU)+'-'+OSToString(OS);
end;
function MakeZipSuffix(CPU : TCPU;OS: TOS) : String;
Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
begin
Result := MakeTargetString (CPU, OS,
(Defaults.BuildOS in AllLimit83fsOses) or (OS in AllLimit83fsOses));
end;
function MakeZipSuffix(CPU : TCPU;OS: TOS;ALimit83: boolean) : String;
begin
case OS of
@ -2158,17 +2194,23 @@ begin
emx: result := 'emx';
osNone:
begin
if (Defaults.BuildOS in AllLimit83fsOses) or
(OS in AllLimit83fsOses) then
if ALimit83 then
result := 'src'
else
result := '.source'
end
else
result := '.' + MakeTargetString(CPU, OS);
result := '.' + MakeTargetString(CPU, OS, ALimit83);
end;
end;
function MakeZipSuffix(CPU : TCPU;OS: TOS) : String;
begin
Result := MakeZipSuffix (CPU, OS,
(Defaults.BuildOS in AllLimit83fsOses) or (OS in AllLimit83fsOses));
end;
Procedure StringToCPUOS(const S : String; Var CPU : TCPU; Var OS: TOS);
Var
@ -3496,6 +3538,44 @@ begin
end;
end;
Procedure TPackage.ListPackage(PkgList : TStrings);
function GetArchiveName (const APackage: TPackage; ALimit83: boolean): string;
begin
{ Special hack to allow both long and short source files being recognized }
if ALimit83 and (Defaults.ZipPrefix = 'units-') then
result := 'u'
else
result := Defaults.ZipPrefix;
if ALimit83 then
result := result + APackage.ShortName
else
result := result + APackage.Name;
result := result + MakeZipSuffix(Defaults.CPU, Defaults.OS, ALimit83);
end;
Var
S : String;
begin
if OSes = AllOSes then
Exit;
if ({(OSes = AllOSes) or }(Defaults.OS = osNone) or
(Defaults.OS in OSes)) and
((Defaults.CPU in CPUs) or (Defaults.CPU = cpuNone)) then
begin
if Defaults.OS = osNone then
PkgList.Add (Format ('# Source %d', [Succ (PkgList.Count div 2)]))
else {if OSes <> AllOSes then}
PkgList.Add (Format ('# ' + OSToString(Defaults.OS) + ' %d', [Succ (PkgList.Count div 2)]));
S := 'package=' + GetArchiveName (Self, false) + ArchiveExtension;
if ((ShortName <> Name) or (Defaults.ZipPrefix = 'units-')) and
((Defaults.OS in AllLimit83fsOSes) or (Defaults.OS = osNone)) then
S := S + '[' + GetArchiveName (Self, true) + ArchiveExtension + ']';
S := S + ',' + Description;
PkgList.Add(S);
end;
end;
procedure TPackage.AddPackageVariant(APackageVariant: TPackageVariants);
begin
if not assigned(APackageVariant.FMasterPackage) then
@ -4083,7 +4163,8 @@ var
infoSL : TStringList;
{$endif HAS_UNIT_PROCESS}
begin
if (CPU=cpuNone) or (OS=osNone) or (FCompilerVersion='') then
if (CPU=cpuNone) or ((OS=osNone) and not ExplicitOSNone) or
(FCompilerVersion='') then
begin
{$ifdef HAS_UNIT_PROCESS}
// Detect compiler version/target from -i option
@ -4096,13 +4177,13 @@ begin
FCompilerVersion:=infosl[0];
if CPU=cpuNone then
CPU:=StringToCPU(infosl[1]);
if OS=osNone then
if (OS=osNone) and not ExplicitOSNone then
OS:=StringToOS(infosl[2]);
{$else HAS_UNIT_PROCESS}
// Defaults taken from compiler used to build fpmake
if CPU=cpuNone then
CPU:=StringToCPU({$I %FPCTARGETCPU%});
if OS=osNone then
if (OS=osNone) and not ExplicitOSNone then
OS:=StringToOS({$I %FPCTARGETOS%});
if FCompilerVersion='' then
FCompilerVersion:={$I %FPCVERSION%};
@ -4524,12 +4605,17 @@ begin
FRunMode:=rmarchive
else if CheckCommand(I,'M','manifest') then
FRunMode:=rmManifest
else if CheckCommand(I,'l','pkglist') then
FRunMode:=rmPkgList
else if CheckOption(I,'h','help') then
Usage('',[])
else if Checkoption(I,'C','cpu') then
Defaults.CPU:=StringToCPU(OptionArg(I))
else if Checkoption(I,'O','os') then
Defaults.OS:=StringToOS(OptionArg(I))
begin
Defaults.OS:=StringToOS(OptionArg(I));
Defaults.ExplicitOSNone := OptionArg(I) = OSToString(osNone);
end
else if Checkoption(I,'t','target') then
Defaults.Target:=OptionArg(I)
else if CheckOption(I,'l','list-commands') then
@ -4631,6 +4717,7 @@ begin
LogCmd('archive',SHelpArchive);
LogCmd('manifest',SHelpManifest);
LogCmd('zipinstall',SHelpZipInstall);
LogCmd('pkglist',SHelpPkgList);
Log(vlInfo,SHelpCmdOptions);
LogOption('h','help',SHelpHelp);
LogOption('l','list-commands',SHelpList);
@ -4708,6 +4795,12 @@ begin
end;
procedure TCustomInstaller.PkgList;
begin
BuildEngine.PkgList(Packages);
end;
procedure TCustomInstaller.CheckPackages;
begin
If (Packages.Count=0) then
@ -4731,6 +4824,7 @@ begin
rmClean : Clean(False);
rmDistClean: Clean(True);
rmManifest : Manifest;
rmPkgList : PkgList;
end;
except
On E : Exception do
@ -4824,7 +4918,7 @@ begin
{$ifdef HAS_TAR_SUPPORT}
if not assigned(FTarWriter) then
begin
FGZFileStream := TGZFileStream.create(GetArchiveName +'.tar.gz', gzopenwrite);
FGZFileStream := TGZFileStream.create(GetArchiveName + ArchiveExtension, gzopenwrite);
try
FTarWriter := TTarWriter.Create(FGZFileStream);
FTarWriter.Permissions := [tpReadByOwner, tpWriteByOwner, tpReadByGroup, tpReadByOther];
@ -4855,7 +4949,7 @@ begin
if not assigned(FZipper) then
begin
FZipper := TZipper.Create;
FZipper.FileName := GetArchiveName + '.zip';
FZipper.FileName := GetArchiveName + ArchiveExtension;
end;
FZipper.Entries.AddFileEntry(ASourceFileName, ADestFileName);
@ -7046,6 +7140,13 @@ begin
end;
Procedure TBuildEngine.PkgList(PkgList: TStrings; APackage : TPackage);
begin
Log(vlInfo, Format(SInfoPkgListPackage,[APackage.Name]));
APackage.ListPackage(PkgList);
end;
procedure TBuildEngine.Compile(Packages: TPackages);
function IsReadyToCompile(APackage:TPackage): boolean;
@ -7286,6 +7387,44 @@ begin
end;
procedure TBuildEngine.PkgList(Packages: TPackages);
Var
I : Integer;
P : TPackage;
L : TStrings;
PKGL : String;
begin
L:=TStringList.Create;
If Assigned(BeforePkgList) then
BeforePkgList(Self);
Log(vlDebug, SDbgBuildEngineGeneratePkgList);
{ Consider only the target OS, because the installer would be run there }
if Defaults.OS in AllLimit83fsOSes then
PKGL := PkgListFileBase + OSToString (Defaults.OS) + PkgListFileExt
else if Defaults.OS = osNone then
PKGL := PkgListFileBase + 'src' + PkgListFileExt
else
PKGL := PkgListFileBase + CPUToString (Defaults.CPU) + '-' +
OSToString (Defaults.OS) + PkgListFileExt;
Try
Log(vlDebug, Format(SDbgGenerating, [PKGL]));
For I:=0 to Packages.Count-1 do
begin
P:=Packages.PackageItems[i];
PkgList(L, P);
end;
L.SaveToFile(PKGL);
Finally
L.Free;
end;
If Assigned(AfterPkgList) then
AfterPkgList(Self);
end;
procedure TBuildEngine.Clean(Packages: TPackages; AllTargets: boolean);
Var
I : Integer;