mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 21:09:11 +02:00
* Remove the unit-directory entirely on a distclean. To avoid problems when units got renamed, or in similar circumstances
git-svn-id: trunk@18055 -
This commit is contained in:
parent
65b41a6c73
commit
7bcf71f342
@ -695,6 +695,7 @@ Type
|
|||||||
FBinInstallDir,
|
FBinInstallDir,
|
||||||
FDocInstallDir,
|
FDocInstallDir,
|
||||||
FExamplesInstallDir : String;
|
FExamplesInstallDir : String;
|
||||||
|
FRemoveTree: String;
|
||||||
FRemoveDir: String;
|
FRemoveDir: String;
|
||||||
FRemove: String;
|
FRemove: String;
|
||||||
FTarget: String;
|
FTarget: String;
|
||||||
@ -755,6 +756,7 @@ Type
|
|||||||
Property Move : String Read FMove Write FMove; // Move $(FILES) to $(DEST)
|
Property Move : String Read FMove Write FMove; // Move $(FILES) to $(DEST)
|
||||||
Property Remove : String Read FRemove Write FRemove; // Delete $(FILES)
|
Property Remove : String Read FRemove Write FRemove; // Delete $(FILES)
|
||||||
Property RemoveDir : String Read FRemoveDir Write FRemoveDir; // Delete $(FILES)
|
Property RemoveDir : String Read FRemoveDir Write FRemoveDir; // Delete $(FILES)
|
||||||
|
Property RemoveTree : String Read FRemoveTree Write FRemoveTree; // removes $(DIRECTORY)
|
||||||
Property MkDir : String Read FMkDir write FMkDir; // Make $(DIRECTORY)
|
Property MkDir : String Read FMkDir write FMkDir; // Make $(DIRECTORY)
|
||||||
Property Archive : String Read FArchive Write FArchive; // zip $(ARCHIVE) $(FILESORDIRS)
|
Property Archive : String Read FArchive Write FArchive; // zip $(ARCHIVE) $(FILESORDIRS)
|
||||||
// Misc
|
// Misc
|
||||||
@ -811,6 +813,7 @@ Type
|
|||||||
Procedure SysMoveFile(Const Src,Dest : String); virtual;
|
Procedure SysMoveFile(Const Src,Dest : String); virtual;
|
||||||
Procedure SysDeleteFile(Const AFileName : String); virtual;
|
Procedure SysDeleteFile(Const AFileName : String); virtual;
|
||||||
Procedure SysDeleteDirectory(Const ADirectoryName : String); virtual;
|
Procedure SysDeleteDirectory(Const ADirectoryName : String); virtual;
|
||||||
|
Procedure SysDeleteTree(Const ADirectoryName : String); virtual;
|
||||||
Procedure SysArchiveFiles(List : TStrings; Const AFileName : String); virtual;
|
Procedure SysArchiveFiles(List : TStrings; Const AFileName : String); virtual;
|
||||||
procedure LogIndent;
|
procedure LogIndent;
|
||||||
procedure LogUnIndent;
|
procedure LogUnIndent;
|
||||||
@ -846,6 +849,7 @@ Type
|
|||||||
Procedure CmdArchiveFiles(List : TStrings; Const ArchiveFile : String);
|
Procedure CmdArchiveFiles(List : TStrings; Const ArchiveFile : String);
|
||||||
Procedure CmdRenameFile(SourceName, DestName : String);
|
Procedure CmdRenameFile(SourceName, DestName : String);
|
||||||
Procedure CmdRemoveDirs(List: TStrings);
|
Procedure CmdRemoveDirs(List: TStrings);
|
||||||
|
Procedure CmdRemoveTrees(List: TStrings);
|
||||||
Procedure ExecuteCommands(Commands : TCommands; At : TCommandAt);
|
Procedure ExecuteCommands(Commands : TCommands; At : TCommandAt);
|
||||||
// Dependency commands
|
// Dependency commands
|
||||||
Function DependencyOK(ADependency : TDependency) : Boolean;
|
Function DependencyOK(ADependency : TDependency) : Boolean;
|
||||||
@ -1174,6 +1178,7 @@ Const
|
|||||||
KeyMove = 'Move';
|
KeyMove = 'Move';
|
||||||
KeyRemove = 'Remove';
|
KeyRemove = 'Remove';
|
||||||
KeyRemoveDir= 'RemoveDir';
|
KeyRemoveDir= 'RemoveDir';
|
||||||
|
KeyRemoveTree= 'RemoveTree';
|
||||||
KeyOptions = 'Options';
|
KeyOptions = 'Options';
|
||||||
KeyCPU = 'CPU';
|
KeyCPU = 'CPU';
|
||||||
KeyOS = 'OS';
|
KeyOS = 'OS';
|
||||||
@ -3035,6 +3040,7 @@ begin
|
|||||||
Values[KeyExamplesInstallDir]:=FExamplesInstallDir;
|
Values[KeyExamplesInstallDir]:=FExamplesInstallDir;
|
||||||
Values[KeyRemove]:=FRemove;
|
Values[KeyRemove]:=FRemove;
|
||||||
Values[KeyRemoveDir]:=FRemoveDir;
|
Values[KeyRemoveDir]:=FRemoveDir;
|
||||||
|
Values[KeyRemoveTree]:=FRemoveTree;
|
||||||
Values[KeyTarget]:=FTarget;
|
Values[KeyTarget]:=FTarget;
|
||||||
if FNoFPCCfg then
|
if FNoFPCCfg then
|
||||||
Values[KeyNoFPCCfg]:='Y';
|
Values[KeyNoFPCCfg]:='Y';
|
||||||
@ -3075,6 +3081,7 @@ begin
|
|||||||
FMove:=Values[KeyMove];
|
FMove:=Values[KeyMove];
|
||||||
FRemove:=Values[KeyRemove];
|
FRemove:=Values[KeyRemove];
|
||||||
FRemoveDir:=Values[KeyRemoveDir];
|
FRemoveDir:=Values[KeyRemoveDir];
|
||||||
|
FRemoveTree:=Values[KeyRemoveTree];
|
||||||
Options:=OptionsToStringList(Values[KeyOptions]);
|
Options:=OptionsToStringList(Values[KeyOptions]);
|
||||||
Line:=Values[KeyCPU];
|
Line:=Values[KeyCPU];
|
||||||
If (Line<>'') then
|
If (Line<>'') then
|
||||||
@ -3698,6 +3705,45 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBuildEngine.SysDeleteTree(const ADirectoryName: String);
|
||||||
|
|
||||||
|
function IntRemoveTree(const ADirectoryName: String) : boolean;
|
||||||
|
var
|
||||||
|
searchRec: TSearchRec;
|
||||||
|
SearchResult: longint;
|
||||||
|
begin
|
||||||
|
result := true;
|
||||||
|
SearchResult := FindFirst(IncludeTrailingPathDelimiter(ADirectoryName)+AllFilesMask, faAnyFile+faSymLink, searchRec);
|
||||||
|
try
|
||||||
|
while SearchResult=0 do
|
||||||
|
begin
|
||||||
|
if (searchRec.Name<>'.') and (searchRec.Name<>'..') then
|
||||||
|
begin
|
||||||
|
if (searchRec.Attr and faDirectory)=faDirectory then
|
||||||
|
begin
|
||||||
|
if not IntRemoveTree(IncludeTrailingPathDelimiter(ADirectoryName)+searchRec.Name) then
|
||||||
|
result := false;
|
||||||
|
end
|
||||||
|
else if not DeleteFile(IncludeTrailingPathDelimiter(ADirectoryName)+searchRec.Name) then
|
||||||
|
result := False;
|
||||||
|
end;
|
||||||
|
SearchResult := FindNext(searchRec);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FindClose(searchRec);
|
||||||
|
end;
|
||||||
|
if not RemoveDir(ADirectoryName) then
|
||||||
|
result := false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if not DirectoryExists(ADirectoryName) then
|
||||||
|
Log(vldebug,SDbgDirectoryDoesNotExist,[ADirectoryName])
|
||||||
|
else If Not IntRemoveTree(ADirectoryName) then
|
||||||
|
Error(SErrRemovingDirectory,[ADirectoryName]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TBuildEngine.SysArchiveFiles(List: TStrings;Const AFileName: String);
|
procedure TBuildEngine.SysArchiveFiles(List: TStrings;Const AFileName: String);
|
||||||
begin
|
begin
|
||||||
If Not (Assigned(OnArchivefiles) or Assigned(ArchiveFilesProc)) then
|
If Not (Assigned(OnArchivefiles) or Assigned(ArchiveFilesProc)) then
|
||||||
@ -3873,6 +3919,21 @@ begin
|
|||||||
SysDeleteDirectory(List[i]);
|
SysDeleteDirectory(List[i]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TBuildEngine.CmdRemoveTrees(List: TStrings);
|
||||||
|
Var
|
||||||
|
Args : String;
|
||||||
|
I : Integer;
|
||||||
|
begin
|
||||||
|
If (Defaults.RemoveTree<>'') then
|
||||||
|
begin
|
||||||
|
Args:=FileListToString(List,'');
|
||||||
|
ExecuteCommand(Defaults.RemoveTree,Args);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
For I:=0 to List.Count-1 do
|
||||||
|
SysDeleteTree(List[i]);
|
||||||
|
end;
|
||||||
|
|
||||||
Function TBuildEngine.FileNewer(const Src,Dest : String) : Boolean;
|
Function TBuildEngine.FileNewer(const Src,Dest : String) : Boolean;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -5026,6 +5087,7 @@ procedure TBuildEngine.Clean(APackage: TPackage; AllTargets: boolean);
|
|||||||
var
|
var
|
||||||
ACPU: TCpu;
|
ACPU: TCpu;
|
||||||
AOS: TOS;
|
AOS: TOS;
|
||||||
|
DirectoryList : TStringList;
|
||||||
begin
|
begin
|
||||||
Log(vlInfo,SInfoCleaningPackage,[APackage.Name]);
|
Log(vlInfo,SInfoCleaningPackage,[APackage.Name]);
|
||||||
try
|
try
|
||||||
@ -5034,13 +5096,22 @@ begin
|
|||||||
DoBeforeClean(Apackage);
|
DoBeforeClean(Apackage);
|
||||||
if AllTargets then
|
if AllTargets then
|
||||||
begin
|
begin
|
||||||
for ACPU:=low(TCpu) to high(TCpu) do
|
// Remove the unit-directory completely. This is safer in case of files
|
||||||
|
// being renamed and such. See also bug 19655
|
||||||
|
DirectoryList := TStringList.Create;
|
||||||
|
try
|
||||||
|
DirectoryList.Add(ExtractFileDir(APackage.GetUnitsOutputDir(ACPU,AOS)));
|
||||||
|
CmdRemoveTrees(DirectoryList);
|
||||||
|
finally
|
||||||
|
DirectoryList.Free;
|
||||||
|
end;
|
||||||
|
{ for ACPU:=low(TCpu) to high(TCpu) do
|
||||||
for AOS:=low(TOS) to high(TOS) do
|
for AOS:=low(TOS) to high(TOS) do
|
||||||
begin
|
begin
|
||||||
if FileExists(APackage.GetUnitsOutputDir(ACPU,AOS)) or
|
if FileExists(APackage.GetUnitsOutputDir(ACPU,AOS)) or
|
||||||
FileExists(APackage.GetBinOutputDir(ACPU,AOS)) then
|
FileExists(APackage.GetBinOutputDir(ACPU,AOS)) then
|
||||||
Clean(APackage,ACPU,AOS);
|
Clean(APackage,ACPU,AOS);
|
||||||
end;
|
end;}
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
Clean(APackage, Defaults.CPU, Defaults.OS);
|
Clean(APackage, Defaults.CPU, Defaults.OS);
|
||||||
|
Loading…
Reference in New Issue
Block a user