IDE: reference/release external tools, auto free

git-svn-id: trunk@45301 -
This commit is contained in:
mattias 2014-06-02 10:04:34 +00:00
parent b791a70524
commit 39995327cc
9 changed files with 218 additions and 117 deletions

View File

@ -334,7 +334,7 @@ type
FMessageLineClass: TMessageLineClass;
procedure CreateLines; virtual;
procedure FetchAllPending; virtual; // (main thread)
procedure ToolExited; virtual; // (main thread)
procedure ToolExited; virtual; // (main thread) called by InputClosed
procedure QueueAsyncOnChanged; virtual; abstract; // (worker thread)
procedure RemoveAsyncOnChanged; virtual; abstract; // (main or worker thread)
public
@ -411,12 +411,14 @@ type
FWorkerDirectory: string;
FWorkerMessages: TMessageLines;
FParsers: TFPList; // list of TExtToolParser
FReferences: TStringList;
FTitle: string;
FTools: TIDEExternalTools;
FViews: TFPList; // list of TExtToolView
function GetCmdLineParams: string;
function GetParserCount: integer;
function GetParsers(Index: integer): TExtToolParser;
function GetReferences(Index: integer): string;
function GetViews(Index: integer): TExtToolView;
procedure SetCmdLineParams(aParams: string);
procedure SetEnvironmentOverrides(AValue: TStrings);
@ -441,6 +443,7 @@ type
procedure DoExecute; virtual; abstract; // starts thread, returns immediately
procedure Notification(AComponent: TComponent; Operation: TOperation);
override;
function CanFree: boolean; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@ -448,6 +451,7 @@ type
procedure LeaveCriticalSection; virtual;
property Thread: TThread read FThread write FThread;
procedure ConsistencyCheck; virtual;
procedure AutoFree; // free if not in use
property Title: string read FTitle write SetTitle;
property Hint: string read FHint write FHint; // this hint is shown in About dialog
@ -468,6 +472,10 @@ type
procedure AddHandlerOnAllViewsUpdated(const OnViewsUpdated: TNotifyEvent;
AsFirst: boolean = true); // called in main thread
procedure RemoveHandlerOnAllViewsUpdated(const OnViewsUpdated: TNotifyEvent);
procedure Reference(Thing: TObject; const Note: string); // add a reference to delay auto freeing, use Release for free
procedure Release(Thing: TObject);
property References[Index: integer]: string read GetReferences;
function ReferenceCount: integer;
// process
property Process: TProcessUTF8 read FProcess;
@ -506,10 +514,10 @@ type
function ViewCount: integer;
property Views[Index: integer]: TExtToolView read GetViews;
function AddView(View: TExtToolView): integer; // (main thread) will *not* be freed on destroy
procedure DeleteView(View: TExtToolView); // (main thread) disconnect and free
procedure RemoveView(View: TExtToolView); // (main thread) disconnect without free
procedure DeleteView(View: TExtToolView); // (main thread) disconnect and free, this might free the tool
procedure RemoveView(View: TExtToolView); // (main thread) disconnect without free, this might free the tool
function IndexOfView(View: TExtToolView): integer;
procedure ClearViews(Delete: boolean = false); // (main thread)
procedure ClearViews(Delete: boolean = false); // (main thread), this might free the tool
function FindUnfinishedView: TExtToolView;
// dependencies
@ -942,6 +950,11 @@ begin
Result:=TExtToolParser(FParsers[Index]);
end;
function TAbstractExternalTool.GetReferences(Index: integer): string;
begin
Result:=FReferences[Index];
end;
function TAbstractExternalTool.GetViews(Index: integer): TExtToolView;
begin
Result:=TExtToolView(FViews[Index]);
@ -1018,6 +1031,17 @@ begin
end;
end;
function TAbstractExternalTool.CanFree: boolean;
begin
Result:=false;
if csDestroying in ComponentState then exit;
if (FReferences.Count>0)
or (ViewCount>0) then exit;
if (Process<>nil) and (Process.Running) then
exit;
Result:=true;
end;
constructor TAbstractExternalTool.Create(AOwner: TComponent);
begin
if AOwner is TIDEExternalTools then
@ -1031,6 +1055,7 @@ begin
FStage:=etsInit;
FEstimatedLoad:=1;
FEnvironmentOverrides:=TStringList.Create;
FReferences:=TStringList.Create;
end;
destructor TAbstractExternalTool.Destroy;
@ -1043,6 +1068,7 @@ begin
ClearParsers;
ClearViews;
Group:=nil;
FreeAndNil(FReferences);
for h:=low(FHandlers) to high(FHandlers) do
FreeAndNil(FHandlers[h]);
FWorkerMessages.Clear;
@ -1079,6 +1105,14 @@ begin
end;
end;
procedure TAbstractExternalTool.AutoFree;
begin
if MainThreadID<>GetCurrentThreadId then
raise Exception.Create('AutoFree only via main thread');
if CanFree then
Free;
end;
procedure TAbstractExternalTool.RemoveAllHandlersOfObject(AnObject: TObject);
var
HandlerType: TExternalToolHandler;
@ -1111,6 +1145,38 @@ begin
RemoveHandler(ethAllViewsUpdated,TMethod(OnViewsUpdated));
end;
procedure TAbstractExternalTool.Reference(Thing: TObject; const Note: string);
var
i: Integer;
begin
if csDestroying in ComponentState then
raise Exception.Create('too late');
if (Note='') or (Thing=nil) then
raise Exception.Create('invalid parameters');
for i:=0 to FReferences.Count-1 do
if FReferences.Objects[i]=Thing then
raise Exception.Create('already referenced');
FReferences.AddObject(Note,Thing);
end;
procedure TAbstractExternalTool.Release(Thing: TObject);
var
i: Integer;
begin
for i:=0 to FReferences.Count-1 do
if FReferences.Objects[i]=Thing then begin
FReferences.Delete(i);
AutoFree;
exit;
end;
raise Exception.Create('reference not found');
end;
function TAbstractExternalTool.ReferenceCount: integer;
begin
Result:=FReferences.Count;
end;
procedure TAbstractExternalTool.AddHandlerOnNewOutput(
const OnNewOutput: TExternalToolNewOutputEvent; AsFirst: boolean);
begin
@ -1224,6 +1290,7 @@ begin
finally
View.LeaveCriticalSection;
end;
AutoFree;
end;
function TAbstractExternalTool.IndexOfView(View: TExtToolView): integer;
@ -1233,13 +1300,8 @@ end;
procedure TAbstractExternalTool.DeleteView(View: TExtToolView);
begin
EnterCriticalSection;
try
RemoveView(View);
View.Free;
finally
LeaveCriticalSection;
end;
RemoveView(View);
View.Free;
end;
procedure TAbstractExternalTool.ClearViews(Delete: boolean);
@ -2063,6 +2125,8 @@ begin
// wait for other threads to finish their access
EnterCriticalSection;
try
if (Tool<>nil) and (not (csDestroying in Tool.ComponentState)) then
Tool.RemoveView(Self);
RemoveAsyncOnChanged;
ClearLines;
FreeAndNil(FProgressLine);

View File

@ -395,18 +395,23 @@ var
Params:=Cmd;
{$IFDEF EnableNewExtTools}
Tool:=ExternalToolList.Add(CurTitle);
Tool.Process.Executable:=Executable;
Tool.AddParsers(SubToolFPC);
Tool.AddParsers(SubToolMake);
Tool.Process.CurrentDirectory:=fWorkingDir;
Tool.EnvironmentOverrides:=EnvironmentOverrides;
Tool.CmdLineParams:=Params;
Tool.Execute;
Tool.WaitForExit;
if Tool.ErrorMessage='' then
exit(mrOk)
else
exit(mrCancel);
Tool.Reference(Self,ClassName);
try
Tool.Process.Executable:=Executable;
Tool.AddParsers(SubToolFPC);
Tool.AddParsers(SubToolMake);
Tool.Process.CurrentDirectory:=fWorkingDir;
Tool.EnvironmentOverrides:=EnvironmentOverrides;
Tool.CmdLineParams:=Params;
Tool.Execute;
Tool.WaitForExit;
if Tool.ErrorMessage='' then
exit(mrOk)
else
exit(mrCancel);
finally
Tool.Release(Self);
end;
{$ELSE}
if Tool=nil then
Tool:=TExternalToolOptions.Create;

View File

@ -336,13 +336,18 @@ begin
+' '+BogusFilename;
{$IFDEF EnableNewExtTools}
CompileTool:=ExternalToolList.Add(dlgCCOTestToolCompilingEmptyFile);
CompileTool.AddParsers(SubToolFPC);
CompileTool.AddParsers(SubToolMake);
CompileTool.Process.CurrentDirectory:=TestDir;
CompileTool.Process.Executable:=CompilerFilename;
CompileTool.CmdLineParams:=CmdLineParams;
CompileTool.Execute;
CompileTool.WaitForExit;
CompileTool.Reference(Self,ClassName);
try
CompileTool.AddParsers(SubToolFPC);
CompileTool.AddParsers(SubToolMake);
CompileTool.Process.CurrentDirectory:=TestDir;
CompileTool.Process.Executable:=CompilerFilename;
CompileTool.CmdLineParams:=CmdLineParams;
CompileTool.Execute;
CompileTool.WaitForExit;
finally
CompileTool.Release(Self);
end;
{$ELSE}
CompileTool:=TExternalToolOptions.Create;
CompileTool.Title:=dlgCCOTestToolCompilingEmptyFile;

View File

@ -322,21 +322,26 @@ begin
{$IFDEF EnableNewExtTools}
Tool:=ExternalToolList.Add('Compile Project');
Tool.Hint:=aCompileHint;
Tool.Process.Executable:=CompilerFilename;
Tool.CmdLineParams:=CmdLine;
Tool.Process.CurrentDirectory:=WorkingDir;
FPCParser:=TFPCParser(Tool.AddParsers(SubToolFPC));
FPCParser.HideHintsSenderNotUsed:=not AProject.CompilerOptions.ShowHintsForSenderNotUsed;
FPCParser.HideHintsUnitNotUsedInMainSource:=not AProject.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc;
if (not AProject.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc)
and (AProject.MainFilename<>'') then
FPCParser.FilesToIgnoreUnitNotUsed.Add(AProject.MainFilename);
Tool.AddParsers(SubToolMake);
Tool.Execute;
Tool.WaitForExit;
if Tool.ErrorMessage='' then
Result:=mrOK;
Tool.Reference(Self,ClassName);
try
Tool.Hint:=aCompileHint;
Tool.Process.Executable:=CompilerFilename;
Tool.CmdLineParams:=CmdLine;
Tool.Process.CurrentDirectory:=WorkingDir;
FPCParser:=TFPCParser(Tool.AddParsers(SubToolFPC));
FPCParser.HideHintsSenderNotUsed:=not AProject.CompilerOptions.ShowHintsForSenderNotUsed;
FPCParser.HideHintsUnitNotUsedInMainSource:=not AProject.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc;
if (not AProject.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc)
and (AProject.MainFilename<>'') then
FPCParser.FilesToIgnoreUnitNotUsed.Add(AProject.MainFilename);
Tool.AddParsers(SubToolMake);
Tool.Execute;
Tool.WaitForExit;
if Tool.ErrorMessage='' then
Result:=mrOK;
finally
Tool.Release(Self);
end;
{$ELSE}
try
if TheProcess=nil then

View File

@ -4486,21 +4486,26 @@ begin
{$IFDEF EnableNewExtTools}
ExtTool:=ExternalToolList.Add(ToolTitle);
ExtTool.Hint:=CompileHint;
ExtTool.Process.CurrentDirectory:=WorkingDir;
ExtTool.Process.Executable:=ProgramFilename;
ExtTool.CmdLineParams:=Params;
if ScanForFPCMessages then
ExtTool.AddParsers(SubToolFPC);
if ScanForMakeMessages then
ExtTool.AddParsers(SubToolMake);
if ExtTool.ParserCount=0 then
ExtTool.AddParsers(SubToolDefault);
// run
ExtTool.Execute;
ExtTool.WaitForExit;
if ExtTool.ErrorMessage='' then
Result:=mrOK;
ExtTool.Reference(Self,ClassName);
try
ExtTool.Hint:=CompileHint;
ExtTool.Process.CurrentDirectory:=WorkingDir;
ExtTool.Process.Executable:=ProgramFilename;
ExtTool.CmdLineParams:=Params;
if ScanForFPCMessages then
ExtTool.AddParsers(SubToolFPC);
if ScanForMakeMessages then
ExtTool.AddParsers(SubToolMake);
if ExtTool.ParserCount=0 then
ExtTool.AddParsers(SubToolDefault);
// run
ExtTool.Execute;
ExtTool.WaitForExit;
if ExtTool.ErrorMessage='' then
Result:=mrOK;
finally
ExtTool.Release(Self);
end;
{$ELSE}
ExtTool:=TIDEExternalToolOptions.Create;
try

View File

@ -287,7 +287,7 @@ type
function ViewCount: integer; inline;
property Views[Index: integer]: TLMsgWndView read GetViews;
function IndexOfView(View: TLMsgWndView): integer;
procedure ClearViews; // deletes/frees all views
procedure ClearViews(OnlyFinished: boolean); // deletes/frees all views
procedure RemoveView(View: TLMsgWndView); // remove without free
function GetView(aCaption: string; CreateIfNotExist: boolean): TLMsgWndView;
function GetLineAt(Y: integer; out View: TLMsgWndView; out Line: integer): boolean;
@ -427,7 +427,7 @@ type
function FindUnfinishedView: TLMsgWndView;
procedure DeleteView(View: TLMsgWndView); // free view
function IndexOfView(View: TLMsgWndView): integer;
procedure ClearViews; // deletes/frees all views
procedure ClearViews(OnlyFinished: boolean); // deletes/frees all views
// source marks
procedure CreateMarksForFile(aSynEdit: TSynEdit; aFilename: string;
@ -2749,7 +2749,7 @@ var
begin
IdleConnected:=false;
Images:=nil;
ClearViews;
ClearViews(false);
FActiveFilter:=nil;
for i:=0 to FFilters.Count-1 do
@ -2808,10 +2808,22 @@ begin
Result:=FViews.IndexOf(View);
end;
procedure TMessagesCtrl.ClearViews;
procedure TMessagesCtrl.ClearViews(OnlyFinished: boolean);
var
i: Integer;
View: TLMsgWndView;
begin
while ViewCount>0 do
Views[0].Free;
if OnlyFinished then begin
for i:=ViewCount-1 downto 0 do begin
if i>=ViewCount then continue;
View:=Views[i];
if View.HasFinished then
View.Free;
end;
end else begin
while ViewCount>0 do
Views[0].Free;
end;
end;
procedure TMessagesCtrl.RemoveView(View: TLMsgWndView);
@ -3484,7 +3496,7 @@ end;
procedure TMessagesFrame.ClearMenuItemClick(Sender: TObject);
begin
MessagesCtrl.ClearViews;
MessagesCtrl.ClearViews(true);
end;
function TMessagesFrame.GetViews(Index: integer): TLMsgWndView;
@ -3649,7 +3661,7 @@ end;
destructor TMessagesFrame.Destroy;
begin
MessagesCtrl.BeginUpdate;
ClearViews;
ClearViews(false);
inherited Destroy;
end;
@ -3684,9 +3696,9 @@ begin
Result:=MessagesCtrl.IndexOfView(View);
end;
procedure TMessagesFrame.ClearViews;
procedure TMessagesFrame.ClearViews(OnlyFinished: boolean);
begin
MessagesCtrl.ClearViews;
MessagesCtrl.ClearViews(OnlyFinished);
end;
procedure TMessagesFrame.CreateMarksForFile(aSynEdit: TSynEdit;

View File

@ -163,7 +163,7 @@ end;
procedure TMessagesView.Clear;
begin
MessagesFrame1.ClearViews;
MessagesFrame1.ClearViews(true);
end;
procedure TMessagesView.DeleteView(View: TExtToolView);

View File

@ -972,7 +972,7 @@ var
begin
Result:=mrCancel;
CanAbort:=[sfCanAbort,sfProjectSaving]*Flags<>[];
//writeln('TLazSourceFileManager.SaveEditorFile A PageIndex=',PageIndex,' Flags=',SaveFlagsToString(Flags));
//debugln('TLazSourceFileManager.SaveEditorFile A PageIndex=',PageIndex,' Flags=',SaveFlagsToString(Flags));
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.SaveEditorFile A');{$ENDIF}
if not (MainIDE.ToolStatus in [itNone,itDebugger]) then
exit(mrAbort);
@ -1137,7 +1137,7 @@ begin
MainBuildBoss.CheckAmbiguousSources(DestFilename,false);
{$IFDEF IDE_DEBUG}
writeln('*** HasResources=',AnUnitInfo.HasResources);
debugln(['*** HasResources=',AnUnitInfo.HasResources]);
{$ENDIF}
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.SaveEditorFile B');{$ENDIF}
// save resource file and lfm file
@ -1684,14 +1684,14 @@ begin
// check readonly
NewUnitInfo.FileReadOnly:=FileExistsUTF8(NewUnitInfo.Filename)
and (not FileIsWritable(NewUnitInfo.Filename));
//writeln('[TLazSourceFileManager.OpenEditorFile] B');
//debugln('[TLazSourceFileManager.OpenEditorFile] B');
// open file in source notebook
Result:=OpenFileInSourceEditor(NewEditorInfo, PageIndex, WindowIndex, Flags, UseWindowID);
if Result<>mrOk then begin
DebugLn(['TLazSourceFileManager.OpenEditorFile failed DoOpenFileInSourceEditor: ',AFilename]);
exit;
end;
//writeln('[TLazSourceFileManager.OpenEditorFile] C');
//debugln('[TLazSourceFileManager.OpenEditorFile] C');
// open resource component (designer, form, datamodule, ...)
if NewUnitInfo.OpenEditorInfoCount = 1 then
Result:=OpenResource;
@ -1705,7 +1705,7 @@ begin
end;
Result:=mrOk;
//writeln('TLazSourceFileManager.OpenEditorFile END "',AFilename,'"');
//debugln('TLazSourceFileManager.OpenEditorFile END "',AFilename,'"');
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.OpenEditorFile END');{$ENDIF}
end;
@ -2319,7 +2319,7 @@ begin
if Data=nil then exit;
if Data is TPublishModuleOptions then begin
Copy:=TPublishModuleOptions(Data).FileCanBePublished(Filename);
//writeln('TLazSourceFileManager.OnCopyFile "',Filename,'" ',Copy);
//debugln('TLazSourceFileManager.OnCopyFile "',Filename,'" ',Copy);
end;
end;
@ -2899,7 +2899,7 @@ function TLazSourceFileManager.CreateProjectForProgram(ProgramBuf: TCodeBuffer):
var
NewProjectDesc: TProjectDescriptor;
begin
//writeln('[TLazSourceFileManager.DoCreateProjectForProgram] A ',ProgramBuf.Filename);
//debugln('[TLazSourceFileManager.DoCreateProjectForProgram] A ',ProgramBuf.Filename);
if (Project1 <> nil)
and (not MainIDE.DoResetToolStatus([rfInteractive, rfSuccessOnTrigger])) then exit;
@ -2928,7 +2928,7 @@ begin
// create a new project
Project1:=MainIDE.CreateProjectObject(NewProjectDesc,ProjectDescriptorProgram);
Result:=InitProjectForProgram(ProgramBuf);
//writeln('[TLazSourceFileManager.DoCreateProjectForProgram] END');
//debugln('[TLazSourceFileManager.DoCreateProjectForProgram] END');
end;
function TLazSourceFileManager.InitProjectForProgram(ProgramBuf: TCodeBuffer): TModalResult;
@ -3079,7 +3079,7 @@ end;
function TLazSourceFileManager.CloseProject: TModalResult;
begin
//writeln('TLazSourceFileManager.CloseProject A');
//debugln('TLazSourceFileManager.CloseProject A');
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.CloseProject A');{$ENDIF}
Result:=DebugBoss.DoStopProject;
if Result<>mrOk then begin
@ -3114,7 +3114,7 @@ begin
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.CloseProject C');{$ENDIF}
Result:=mrOk;
//writeln('TLazSourceFileManager.CloseProject end ',CodeToolBoss.ConsistencyCheck);
//debugln('TLazSourceFileManager.CloseProject end ',CodeToolBoss.ConsistencyCheck);
end;
procedure TLazSourceFileManager.OpenProject(aMenuItem: TIDEMenuItem);
@ -3974,7 +3974,7 @@ begin
end;
if ComponentSavingOk then begin
{$IFDEF IDE_DEBUG}
writeln('TLazSourceFileManager.SaveFileResources E ',CompResourceCode);
debugln('TLazSourceFileManager.SaveFileResources E ',CompResourceCode);
{$ENDIF}
// replace lazarus form resource code in include file (.lrs)
if not (sfSaveToTestDir in Flags) then begin
@ -4031,7 +4031,7 @@ begin
end;
if (LFMCode<>nil) then begin
{$IFDEF IDE_DEBUG}
writeln('TLazSourceFileManager.SaveFileResources E2 LFM=',LFMCode.Filename);
debugln('TLazSourceFileManager.SaveFileResources E2 LFM=',LFMCode.Filename);
{$ENDIF}
if (ResType=rtRes) and (LFMCode.DiskEncoding<>EncodingUTF8) then
begin
@ -4113,7 +4113,7 @@ begin
end;
{$IFDEF IDE_DEBUG}
if ResourceCode<>nil then
writeln('TLazSourceFileManager.SaveFileResources F ',ResourceCode.Modified);
debugln('TLazSourceFileManager.SaveFileResources F ',ResourceCode.Modified);
{$ENDIF}
// save binary stream (.lrs)
if LRSCode<>nil then begin
@ -4146,7 +4146,7 @@ begin
Result:=mrOk;
{$IFDEF IDE_DEBUG}
writeln('TLazSourceFileManager.SaveFileResources G ',LFMCode<>nil);
debugln('TLazSourceFileManager.SaveFileResources G ',LFMCode<>nil);
{$ENDIF}
end;
@ -4732,7 +4732,7 @@ begin
Result:=mrOk;
{$IFDEF IDE_VERBOSE}
writeln('[TLazSourceFileManager.DoOpenMainUnit] END');
debugln('[TLazSourceFileManager.DoOpenMainUnit] END');
{$ENDIF}
end;
@ -4985,7 +4985,7 @@ begin
end;
end;
if AnUnitInfo.HasResources then begin
//writeln('TLazSourceFileManager.LoadResourceFile A "',AnUnitInfo.Filename,'" "',AnUnitInfo.ResourceFileName,'"');
//debugln('TLazSourceFileManager.LoadResourceFile A "',AnUnitInfo.Filename,'" "',AnUnitInfo.ResourceFileName,'"');
ResType:=MainBuildBoss.GetResourceType(AnUnitInfo);
if ResType=rtLRS then begin
LRSFilename:=MainBuildBoss.FindLRSFilename(AnUnitInfo,false);

View File

@ -3571,38 +3571,43 @@ begin
{$IFDEF EnableNewExtTools}
PkgCompileTool:=ExternalToolList.Add(Format(lisPkgMangCompilingPackage, [APackage.IDAsString]));
FPCParser:=TFPCParser(PkgCompileTool.AddParsers(SubToolFPC));
//debugln(['TLazPackageGraph.CompilePackage ',APackage.Name,' ',APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc,' ',APackage.MainUnit.Filename]);
if (APackage.MainUnit<>nil)
and (not APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc) then
FPCParser.FilesToIgnoreUnitNotUsed.Add(APackage.MainUnit.Filename);
FPCParser.HideHintsSenderNotUsed:=not APackage.CompilerOptions.ShowHintsForSenderNotUsed;
FPCParser.HideHintsUnitNotUsedInMainSource:=not APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc;
PkgCompileTool.AddParsers(SubToolMake);
PkgCompileTool.Process.CurrentDirectory:=APackage.Directory;
PkgCompileTool.Process.Executable:=CompilerFilename;
PkgCompileTool.CmdLineParams:=EffectiveCompilerParams;
PkgCompileTool.Hint:=Note;
PkgCompileTool.Data:=TIDEExternalToolData.Create(IDEToolCompilePackage,
APackage.Name,APackage.Filename);
PkgCompileTool.FreeData:=true;
// run
PkgCompileTool.Execute;
PkgCompileTool.WaitForExit;
PkgCompileTool.Reference(Self,Classname);
try
FPCParser:=TFPCParser(PkgCompileTool.AddParsers(SubToolFPC));
//debugln(['TLazPackageGraph.CompilePackage ',APackage.Name,' ',APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc,' ',APackage.MainUnit.Filename]);
if (APackage.MainUnit<>nil)
and (not APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc) then
FPCParser.FilesToIgnoreUnitNotUsed.Add(APackage.MainUnit.Filename);
FPCParser.HideHintsSenderNotUsed:=not APackage.CompilerOptions.ShowHintsForSenderNotUsed;
FPCParser.HideHintsUnitNotUsedInMainSource:=not APackage.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc;
PkgCompileTool.AddParsers(SubToolMake);
PkgCompileTool.Process.CurrentDirectory:=APackage.Directory;
PkgCompileTool.Process.Executable:=CompilerFilename;
PkgCompileTool.CmdLineParams:=EffectiveCompilerParams;
PkgCompileTool.Hint:=Note;
PkgCompileTool.Data:=TIDEExternalToolData.Create(IDEToolCompilePackage,
APackage.Name,APackage.Filename);
PkgCompileTool.FreeData:=true;
// run
PkgCompileTool.Execute;
PkgCompileTool.WaitForExit;
// check if main ppu file was created
SrcPPUFile:=APackage.GetSrcPPUFilename;
SrcPPUFileExists:=(SrcPPUFile<>'') and FileExistsUTF8(SrcPPUFile);
// write state file
Result:=SavePackageCompiledState(APackage,
CompilerFilename,CompilerParams,
PkgCompileTool.ErrorMessage='',SrcPPUFileExists,true);
if Result<>mrOk then begin
DebugLn(['TLazPackageGraph.CompilePackage SavePackageCompiledState failed: ',APackage.IDAsString]);
exit;
// check if main ppu file was created
SrcPPUFile:=APackage.GetSrcPPUFilename;
SrcPPUFileExists:=(SrcPPUFile<>'') and FileExistsUTF8(SrcPPUFile);
// write state file
Result:=SavePackageCompiledState(APackage,
CompilerFilename,CompilerParams,
PkgCompileTool.ErrorMessage='',SrcPPUFileExists,true);
if Result<>mrOk then begin
DebugLn(['TLazPackageGraph.CompilePackage SavePackageCompiledState failed: ',APackage.IDAsString]);
exit;
end;
if PkgCompileTool.ErrorMessage<>'' then
exit(mrCancel);
finally
PkgCompileTool.Release(Self);
end;
if PkgCompileTool.ErrorMessage<>'' then
exit(mrCancel);
{$ELSE}
PkgCompileTool:=TIDEExternalToolOptions.Create;