Browse Source

* sources support

git-svn-id: trunk@6593 -
peter 18 years ago
parent
commit
a05917e982
3 changed files with 218 additions and 21 deletions
  1. 3 1
      packages/base/fpmake/fpmake.pp
  2. 3 0
      packages/base/fpmake/fpmktype.pp
  3. 212 20
      packages/base/fpmake/fpmkunit.pp

+ 3 - 1
packages/base/fpmake/fpmake.pp

@@ -7,7 +7,7 @@ uses fpmktype,fpmkunit;
 
 
 Var
 Var
   T : TTarget;
   T : TTarget;
-
+  S : TSource;
 begin
 begin
   With Installer do 
   With Installer do 
     begin
     begin
@@ -16,8 +16,10 @@ begin
     } 
     } 
     StartPackage('fpmake');
     StartPackage('fpmake');
     Version:='2.0.0';
     Version:='2.0.0';
+    Description:='Free Pascal Make Tool';
     T:=Targets.AddUnit('fpmktype');
     T:=Targets.AddUnit('fpmktype');
     T:=Targets.AddUnit('fpmkunit');
     T:=Targets.AddUnit('fpmkunit');
+    S:=Sources.AddSrcFiles('*.pp');
     EndPackage;
     EndPackage;
     Run;
     Run;
     end;
     end;

+ 3 - 0
packages/base/fpmake/fpmktype.pp

@@ -27,6 +27,9 @@ Type
   TTargetState = (tsNeutral,tsCompiling,tsCompiled,tsInstalled);
   TTargetState = (tsNeutral,tsCompiling,tsCompiled,tsInstalled);
   TTargetStates = Set of TTargetState;
   TTargetStates = Set of TTargetState;
 
 
+  TSourceType = (stDoc,stSrc,stExample,stTest);
+  TSourceTypes = set of TSourceType;
+
   TVerboseLevel = (vlError,vlWarning,vlInfo,vlCompare,vlCommand,vldebug);
   TVerboseLevel = (vlError,vlWarning,vlInfo,vlCompare,vlCommand,vldebug);
   TVerboseLevels = Set of TVerboseLevel;
   TVerboseLevels = Set of TVerboseLevel;
 
 

+ 212 - 20
packages/base/fpmake/fpmkunit.pp

@@ -8,7 +8,7 @@ Interface
 uses SysUtils,Classes,fpmktype;
 uses SysUtils,Classes,fpmktype;
 
 
 Type
 Type
-  TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmManifest);
+  TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmManifest,rmListSources);
 
 
   { TNamedItem }
   { TNamedItem }
 
 
@@ -130,6 +130,7 @@ Type
     Function GetOutputFileName (AOs : TOS) : String; Virtual;
     Function GetOutputFileName (AOs : TOS) : String; Virtual;
     procedure SetName(const AValue: String);override;
     procedure SetName(const AValue: String);override;
     Procedure GetCleanFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Procedure GetCleanFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
+    Procedure GetSourceFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Procedure GetInstallFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Procedure GetInstallFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Procedure GetArchiveFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Procedure GetArchiveFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
     Property HasUnitPath : Boolean Index 0 Read GetHasStrings;
     Property HasUnitPath : Boolean Index 0 Read GetHasStrings;
@@ -190,6 +191,32 @@ Type
     Property DefaultCPU : TCPUs Read FDefaultCPU Write FDefaultCPU;
     Property DefaultCPU : TCPUs Read FDefaultCPU Write FDefaultCPU;
   end;
   end;
 
 
+  { TSource }
+
+  TSource = Class(TNamedItem)
+  private
+    FSourceType: TSourceType;
+  Public
+    Constructor Create(ACollection : TCollection); override;
+    Destructor Destroy; override;
+    procedure GetSourceFiles(List: TStrings);
+    Property SourceType : TSourceType Read FSourceType Write FSourceType;
+  end;
+
+  { TSources }
+
+  TSources = Class(TNamedCollection)
+  private
+    function GetSourceItem(Index : Integer): TSource;
+    procedure SetSourceItem(Index : Integer; const AValue: TSource);
+  public
+    Function AddDocFiles(AFiles : String) : TSource;
+    Function AddSrcFiles(AFiles : String) : TSource;
+    Function AddExampleFiles(AFiles : String) : TSource;
+    Function AddTestFiles(AFiles : String) : TSource;
+    Property SourceItems[Index : Integer] : TSource Read GetSourceItem Write SetSourceItem;default;
+  end;
+
   { TPackage }
   { TPackage }
 
 
   TPackage = Class(TNamedItem) // Maybe descend from/use TTarget ?
   TPackage = Class(TNamedItem) // Maybe descend from/use TTarget ?
@@ -215,17 +242,20 @@ Type
     FOS: TOses;
     FOS: TOses;
     FTargetState: TTargetState;
     FTargetState: TTargetState;
     FTargets: TTargets;
     FTargets: TTargets;
+    FSources: TSources;
     FDirectory: String;
     FDirectory: String;
     FOptions: String;
     FOptions: String;
+    FFileName: String;
     FAuthor: String;
     FAuthor: String;
     FLicense: String;
     FLicense: String;
-    FURL: String;
+    FExternalURL: String;
     FVersion: String;
     FVersion: String;
     FEmail : String;
     FEmail : String;
     FCommands : TCommands;
     FCommands : TCommands;
     FDescriptionFile : String;
     FDescriptionFile : String;
     FDescription : String;
     FDescription : String;
     Function GetDescription : string;
     Function GetDescription : string;
+    Function GetFileName : string;
     function GetCommands: TCommands;
     function GetCommands: TCommands;
     function GetHasCommands: Boolean;
     function GetHasCommands: Boolean;
     function GetHasStrings(AIndex: integer): Boolean;
     function GetHasStrings(AIndex: integer): Boolean;
@@ -241,9 +271,11 @@ Type
     Procedure GetCleanFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
     Procedure GetCleanFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
     procedure GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
     procedure GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
     Procedure GetArchiveFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
     Procedure GetArchiveFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
+    Procedure GetSourceFiles(List : TStrings); virtual;
     Procedure GetManifest(Manifest : TStrings);
     Procedure GetManifest(Manifest : TStrings);
     Property Version : String Read FVersion Write FVersion;
     Property Version : String Read FVersion Write FVersion;
-    Property URL : String Read FURL Write FURL;
+    Property FileName : String Read GetFileName Write FFileName;
+    Property ExternalURL : String Read FExternalURL Write FExternalURL;
     Property Email : String Read FEmail Write FEmail;
     Property Email : String Read FEmail Write FEmail;
     Property Author : String Read FAuthor Write FAuthor;
     Property Author : String Read FAuthor Write FAuthor;
     Property License : String Read FLicense Write FLicense;
     Property License : String Read FLicense Write FLicense;
@@ -273,6 +305,7 @@ Type
     Property Commands : TCommands Read GetCommands Write SetCommands;
     Property Commands : TCommands Read GetCommands Write SetCommands;
     Property State : TTargetState Read FTargetState;
     Property State : TTargetState Read FTargetState;
     Property Targets : TTargets Read FTargets;
     Property Targets : TTargets Read FTargets;
+    Property Sources : TSources Read FSources;
     // events
     // events
     Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
     Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
     Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAfterCompile;
     Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAfterCompile;
@@ -447,6 +480,7 @@ Type
     Procedure Archive(APackage : TPackage);
     Procedure Archive(APackage : TPackage);
     Procedure Clean(APackage : TPackage);
     Procedure Clean(APackage : TPackage);
     Procedure FixDependencies(APackage : TPackage);
     Procedure FixDependencies(APackage : TPackage);
+    Procedure GetSourceFiles(APackage : TPackage; List : TStrings);
     Procedure GetManifest(APackage : TPackage; Manifest : TStrings);
     Procedure GetManifest(APackage : TPackage; Manifest : TStrings);
     procedure CheckExternalPackage(Const APackageName : String);
     procedure CheckExternalPackage(Const APackageName : String);
     procedure CreateOutputDir(APackage: TPackage);
     procedure CreateOutputDir(APackage: TPackage);
@@ -455,6 +489,7 @@ Type
     Procedure Install(Packages : TPackages);
     Procedure Install(Packages : TPackages);
     Procedure Archive(Packages : TPackages);
     Procedure Archive(Packages : TPackages);
     Procedure Clean(Packages : TPackages);
     Procedure Clean(Packages : TPackages);
+    Procedure GetSourceFiles(Packages : TPackages;List : TStrings);
     Procedure GetManifest(Packages : TPackages; Manifest : TStrings);
     Procedure GetManifest(Packages : TPackages; Manifest : TStrings);
     Property ListMode : Boolean Read FListMode Write FListMode;
     Property ListMode : Boolean Read FListMode Write FListMode;
     Property ForceCompile : Boolean Read FForceCompile Write FForceCompile;
     Property ForceCompile : Boolean Read FForceCompile Write FForceCompile;
@@ -490,6 +525,7 @@ Type
     function GetStrings(AIndex : Integer): TStrings;
     function GetStrings(AIndex : Integer): TStrings;
     function GetOSes: TOSes;
     function GetOSes: TOSes;
     function GetTargets: TTargets;
     function GetTargets: TTargets;
+    function GetSources: TSources;
     procedure SetDefaultPackage(const AValue: TPackage);
     procedure SetDefaultPackage(const AValue: TPackage);
     procedure SetDefaults(const AValue: TDefaults);
     procedure SetDefaults(const AValue: TDefaults);
     procedure SetStrings(AIndex : Integer; const AValue: TStrings);
     procedure SetStrings(AIndex : Integer; const AValue: TStrings);
@@ -509,6 +545,7 @@ Type
     Procedure Install; virtual;
     Procedure Install; virtual;
     Procedure Archive; virtual;
     Procedure Archive; virtual;
     Procedure Manifest; virtual;
     Procedure Manifest; virtual;
+    Procedure GetSourceFiles; virtual;
     Property BuildEngine : TBuildEngine Read FBuildEngine;
     Property BuildEngine : TBuildEngine Read FBuildEngine;
   Public
   Public
     Constructor Create(AOWner : TComponent); override;
     Constructor Create(AOWner : TComponent); override;
@@ -529,16 +566,18 @@ Type
     Property ListMode : Boolean Read FListMode;
     Property ListMode : Boolean Read FListMode;
     // Default Package redirects.
     // Default Package redirects.
     Property Targets : TTargets Read GetTargets;
     Property Targets : TTargets Read GetTargets;
+    Property Sources : TSources Read GetSources;
     Property OS: TOSes Read GetOSes Write SetOses;
     Property OS: TOSes Read GetOSes Write SetOses;
     Property Author : String Index 0 Read GetPackageString Write SetPackageString;
     Property Author : String Index 0 Read GetPackageString Write SetPackageString;
     Property Directory : String Index 1 Read GetPackageString Write SetPackageString;
     Property Directory : String Index 1 Read GetPackageString Write SetPackageString;
     Property License : String Index 2 Read GetPackageString Write SetPackageString;
     Property License : String Index 2 Read GetPackageString Write SetPackageString;
     Property Options : String Index 3 Read GetPackageString Write SetPackageString;
     Property Options : String Index 3 Read GetPackageString Write SetPackageString;
-    Property URL : String Index 4 Read GetPackageString Write SetPackageString;
+    Property ExternalURL : String Index 4 Read GetPackageString Write SetPackageString;
     Property Email : String Index 5 Read GetPackageString Write SetPackageString;
     Property Email : String Index 5 Read GetPackageString Write SetPackageString;
     Property Description: String Index 6 Read GetPackageString Write SetPackageString;
     Property Description: String Index 6 Read GetPackageString Write SetPackageString;
     Property DescriptionFileName: String Index 7 Read GetPackageString Write SetPackageString;
     Property DescriptionFileName: String Index 7 Read GetPackageString Write SetPackageString;
     Property Version : String Index 8 Read GetPackageString Write SetPackageString;
     Property Version : String Index 8 Read GetPackageString Write SetPackageString;
+    Property FileName : String Index 9 Read GetPackageString Write SetPackageString;
   end;
   end;
 
 
   TReplaceFunction = Function (Const AName,Args : String) : String of Object;
   TReplaceFunction = Function (Const AName,Args : String) : String of Object;
@@ -1042,6 +1081,49 @@ begin
 end;
 end;
 
 
 
 
+{ TSources }
+
+function TSources.GetSourceItem(Index : Integer): TSource;
+begin
+  Result:=TSource(Items[Index]);
+end;
+
+
+procedure TSources.SetSourceItem(Index : Integer; const AValue: TSource);
+begin
+  Items[Index]:=AValue;
+end;
+
+
+function TSources.AddDocFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stDoc;
+end;
+
+
+function TSources.AddSrcFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stSrc;
+end;
+
+function TSources.AddExampleFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stExample;
+end;
+
+function TSources.AddTestFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stTest;
+end;
+
 { TNamedItemList }
 { TNamedItemList }
 
 
 function TNamedItemList.GetNamedItem(Index : Integer): TNamedItem;
 function TNamedItemList.GetNamedItem(Index : Integer): TNamedItem;
@@ -1545,31 +1627,30 @@ Procedure TPackage.GetManifest(Manifest : TStrings);
 Var
 Var
   S : String;
   S : String;
   Release,Minor,Major : Word;
   Release,Minor,Major : Word;
-  i : integer;
-
+  i : Integer;
 begin
 begin
   With Manifest do
   With Manifest do
     begin
     begin
     Add(Format('<package name="%s">',[QuoteXml(Name)]));
     Add(Format('<package name="%s">',[QuoteXml(Name)]));
     SplitVersion(Version,Release,Minor,Major,S);
     SplitVersion(Version,Release,Minor,Major,S);
     Add(Format('<version release="%d" major="%d" minor="%d" suffix="%s"/>',[Release,Minor,Major,QuoteXMl(S)]));
     Add(Format('<version release="%d" major="%d" minor="%d" suffix="%s"/>',[Release,Minor,Major,QuoteXMl(S)]));
+    Add(Format('<filename>%s</filename>',[QuoteXml(FileName)]));
     Add(Format('<author>%s</author>',[QuoteXml(Author)]));
     Add(Format('<author>%s</author>',[QuoteXml(Author)]));
-    Add(Format('<url>%s</url>',[QuoteXml(URL)]));
+    if ExternalURL<>'' then
+      Add(Format('<externalurl>%s</externalurl>',[QuoteXml(ExternalURL)]));
     Add(Format('<email>%s</email>',[QuoteXMl(Email)]));
     Add(Format('<email>%s</email>',[QuoteXMl(Email)]));
     S:=Description;
     S:=Description;
     If (S<>'') then
     If (S<>'') then
       Add(Format('<description>%s</description>',[QuoteXML(S)]));
       Add(Format('<description>%s</description>',[QuoteXML(S)]));
     if HasDependencies then
     if HasDependencies then
       begin
       begin
-      If (Dependencies.Count>0) then
-        begin
-        Add('<dependencies>');
-        for I:=0 to Dependencies.Count-1 do
+        If (Dependencies.Count>0) then
           begin
           begin
-          Add(Format('<dependency><package packagename=""/></dependency>',[QuoteXML(Dependencies[i])]));
+            Add('<dependencies>');
+            for I:=0 to Dependencies.Count-1 do
+              Add(Format('<dependency><package packagename="%s"/></dependency>',[QuoteXML(Dependencies[i])]));
+            Add('</dependencies>');
           end;
           end;
-        Add('</dependencies>');
-        end;
       end;
       end;
     Add('</package>');
     Add('</package>');
     end;
     end;
@@ -1624,6 +1705,7 @@ Var
 begin
 begin
   inherited Create(ACollection);
   inherited Create(ACollection);
   FTargets:=TTargets.Create(TTarget);
   FTargets:=TTargets.Create(TTarget);
+  FSources:=TSources.Create(TSource);
   L:=TStringList.Create;
   L:=TStringList.Create;
   FDependencies:=L;
   FDependencies:=L;
   FInstallFiles:=TStringList.Create;
   FInstallFiles:=TStringList.Create;
@@ -1640,6 +1722,7 @@ begin
   FreeAndNil(FIncludePath);
   FreeAndNil(FIncludePath);
   FreeAndNil(FObjectPath);
   FreeAndNil(FObjectPath);
   FreeAndNil(FUnitPath);
   FreeAndNil(FUnitPath);
+  FreeAndNil(FSources);
   FreeAndNil(FTargets);
   FreeAndNil(FTargets);
   inherited destroy;
   inherited destroy;
 end;
 end;
@@ -1672,6 +1755,17 @@ begin
     FTargets.TargetItems[I].GetCleanFiles(List,APrefix,AOS);
     FTargets.TargetItems[I].GetCleanFiles(List,APrefix,AOS);
 end;
 end;
 
 
+procedure TPackage.GetSourceFiles(List: TStrings);
+
+Var
+  I : Integer;
+
+begin
+  // AddStrings(List,SourceFiles,APrefix);
+  For I:=0 to FSources.Count-1 do
+    FSources.SourceItems[I].GetSourceFiles(List);
+end;
+
 procedure TPackage.GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
 procedure TPackage.GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
 
 
 Var
 Var
@@ -1732,6 +1826,15 @@ begin
 end;
 end;
 
 
 
 
+Function TPackage.GetFileName : string;
+begin
+  If (FFileName<>'') then
+    Result:=FFileName
+  else
+    Result:=Name+'-'+Version+'.zip';
+end;
+
+
 { TPackages }
 { TPackages }
 
 
 function TPackages.GetPackage(AName : String): TPackage;
 function TPackages.GetPackage(AName : String): TPackage;
@@ -1783,11 +1886,12 @@ begin
     1 : Result:=P.Directory;
     1 : Result:=P.Directory;
     2 : Result:=P.License;
     2 : Result:=P.License;
     3 : Result:=P.Options;
     3 : Result:=P.Options;
-    4 : Result:=P.URL;
+    4 : Result:=P.ExternalURL;
     5 : Result:=P.Email;
     5 : Result:=P.Email;
     6 : Result:=P.Description;
     6 : Result:=P.Description;
     7 : Result:=P.DescriptionFile;
     7 : Result:=P.DescriptionFile;
     8 : Result:=P.Version;
     8 : Result:=P.Version;
+    9 : Result:=P.FileName;
   end;
   end;
 end;
 end;
 
 
@@ -1805,11 +1909,12 @@ begin
     1 : P.Directory:=AValue;
     1 : P.Directory:=AValue;
     2 : P.License:=AValue;
     2 : P.License:=AValue;
     3 : P.Options:=AValue;
     3 : P.Options:=AValue;
-    4 : P.URL:=AValue;
+    4 : P.ExternalURL:=AValue;
     5 : P.Email:=AValue;
     5 : P.Email:=AValue;
     6 : P.Description:=AValue;
     6 : P.Description:=AValue;
     7 : P.DescriptionFile:=AValue;
     7 : P.DescriptionFile:=AValue;
     8 : P.Version:=AValue;
     8 : P.Version:=AValue;
+    9 : P.FileName:=AValue;
   end;
   end;
 end;
 end;
 
 
@@ -1826,6 +1931,12 @@ begin
   Result:=DefaultPackage.Targets;
   Result:=DefaultPackage.Targets;
 end;
 end;
 
 
+function TInstaller.GetSources: TSources;
+begin
+  CheckDefaultPackage;
+  Result:=DefaultPackage.Sources;
+end;
+
 procedure TInstaller.SetDefaultPackage(const AValue: TPackage);
 procedure TInstaller.SetDefaultPackage(const AValue: TPackage);
 begin
 begin
   if FDefaultPackage=AValue then exit;
   if FDefaultPackage=AValue then exit;
@@ -1980,6 +2091,8 @@ begin
       FRunMode:=rmarchive
       FRunMode:=rmarchive
     else if CheckCommand(I,'M','manifest') then
     else if CheckCommand(I,'M','manifest') then
       FRunMode:=rmManifest
       FRunMode:=rmManifest
+    else if CheckCommand(I,'M','listsources') then
+      FRunMode:=rmListSources
     else if CheckOption(I,'h','help') then
     else if CheckOption(I,'h','help') then
       Usage('',[])
       Usage('',[])
     else if Checkoption(I,'C','CPU') then
     else if Checkoption(I,'C','CPU') then
@@ -2098,20 +2211,35 @@ procedure TInstaller.Manifest;
 
 
 Var
 Var
   L : TStrings;
   L : TStrings;
-  I : Integer;
-
 begin
 begin
   L:=TStringList.Create;
   L:=TStringList.Create;
   Try
   Try
+    Log(vlCommand,'Generating manifest.xml');
     L.Add('<?xml version="1.0"?>');
     L.Add('<?xml version="1.0"?>');
     BuildEngine.GetManifest(FPackages,L);
     BuildEngine.GetManifest(FPackages,L);
-    For I:=0 to L.Count-1 do
-      Writeln(L[i]);
+    L.SaveToFile('manifest.xml');
   Finally
   Finally
     L.Free;
     L.Free;
   end;
   end;
 end;
 end;
 
 
+procedure TInstaller.GetSourceFiles;
+
+Var
+  L : TStrings;
+begin
+  L:=TStringList.Create;
+  Try
+    Log(vlCommand,'Generating sources.xml');
+    L.Add('<?xml version="1.0"?>');
+    BuildEngine.GetSourceFiles(FPackages,L);
+    L.SaveToFile('sources.xml');
+  Finally
+    L.Free;
+  end;
+end;
+
+
 constructor TInstaller.Create(AOWner: TComponent);
 constructor TInstaller.Create(AOWner: TComponent);
 begin
 begin
   inherited Create(AOWner);
   inherited Create(AOWner);
@@ -2148,6 +2276,7 @@ begin
       rmArchive : Archive;
       rmArchive : Archive;
       rmClean    : Clean;
       rmClean    : Clean;
       rmManifest : Manifest;
       rmManifest : Manifest;
+      rmListSources : GetSourceFiles;
     end;
     end;
   except
   except
     On E : Exception do
     On E : Exception do
@@ -2956,6 +3085,24 @@ begin
     end;
     end;
 end;
 end;
 
 
+Procedure TBuildEngine.GetSourceFiles(APackage : TPackage; List : TStrings);
+var
+  L : TStrings;
+  i : integer;
+begin
+  try
+    L:=TStringList.Create;
+    APackage.GetSourceFiles(L);
+    List.Add(Format('<sources packagename=%s>',[APackage.Name]));
+    for i:=0 to L.Count-1 do
+      List.Add(Format('<source>%s</source>',[L[i]]));
+    List.Add('</sources>');
+  finally
+    L.Free;
+  end;
+end;
+
+
 Procedure TBuildEngine.GetManifest(APackage : TPackage; Manifest : TStrings);
 Procedure TBuildEngine.GetManifest(APackage : TPackage; Manifest : TStrings);
 
 
 begin
 begin
@@ -3067,6 +3214,19 @@ begin
 end;
 end;
 
 
 
 
+Procedure TBuildEngine.GetSourceFiles(Packages : TPackages; List : TStrings);
+
+Var
+  I : Integer;
+
+begin
+  List.Add('<packages>');
+  For I:=0 to Packages.Count-1 do
+    GetSourceFiles(Packages.PackageItems[i],List);
+  List.Add('</packages>');
+end;
+
+
 { TTarget }
 { TTarget }
 
 
 function TTarget.GetHasStrings(AIndex: integer): Boolean;
 function TTarget.GetHasStrings(AIndex: integer): Boolean;
@@ -3207,6 +3367,21 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TTarget.GetSourceFiles(List: TStrings; APrefix : String; AnOS : TOS);
+begin
+  If (OS=[]) or (AnOS in OS) then
+    begin
+    List.Add(APrefix+ObjectFileName);
+    If (TargetType in [ttUnit,ttExampleUnit]) then
+      List.Add(APrefix+UnitFileName)
+    else If (TargetType in [ttProgram,ttExampleProgram]) then
+      List.Add(APrefix+GetProgramFileName(AnOS));
+    If ResourceStrings then
+      List.Add(APrefix+RSTFileName);
+    // Maybe add later ?  AddStrings(List,CleanFiles);
+    end;
+end;
+
 procedure TTarget.GetInstallFiles(List: TStrings; APrefix : String; AnOS : TOS);
 procedure TTarget.GetInstallFiles(List: TStrings; APrefix : String; AnOS : TOS);
 begin
 begin
   If (OS=[]) or (AnOS in OS) then
   If (OS=[]) or (AnOS in OS) then
@@ -3233,6 +3408,23 @@ begin
 end;
 end;
 
 
 
 
+{ TSource }
+
+constructor TSource.Create(ACollection: TCollection);
+begin
+  inherited Create(ACollection);
+end;
+
+destructor TSource.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSource.GetSourceFiles(List: TStrings);
+begin
+  List.Add(Name);
+end;
+
 
 
 { TCommands }
 { TCommands }