IDE: A new command and entry in Run menu for building many modes at one go.

git-svn-id: trunk@45772 -
This commit is contained in:
juha 2014-07-04 14:31:31 +00:00
parent 72bb33e99c
commit 48a6a75f6c
7 changed files with 106 additions and 31 deletions

View File

@ -243,7 +243,8 @@ const
ecBuild = ecFirstLazarus + 401;
ecQuickCompile = ecFirstLazarus + 402;
ecCleanUpAndBuild = ecFirstLazarus + 403;
ecAbortBuild = ecFirstLazarus + 404;
ecBuildManyModes = ecFirstLazarus + 404;
ecAbortBuild = ecFirstLazarus + 405;
ecRun = ecFirstLazarus + 410;
ecPause = ecFirstLazarus + 411;
ecStepInto = ecFirstLazarus + 412;

View File

@ -603,6 +603,7 @@ begin
ecBuild : Result:= srkmecBuild;
ecQuickCompile : Result:= srkmecQuickCompile;
ecCleanUpAndBuild : Result:= srkmecCleanUpAndBuild;
ecBuildManyModes : Result:= srkmecBuildManyModes;
ecAbortBuild : Result:= srkmecAbortBuild;
ecRun : Result:= srkmecRun;
ecPause : Result:= srkmecPause;
@ -1188,6 +1189,7 @@ begin
ecBuild: SetSingle(VK_F9,[ssShift]);
ecQuickCompile: SetSingle(VK_UNKNOWN,[]);
ecCleanUpAndBuild: SetSingle(VK_UNKNOWN,[]);
ecBuildManyModes: SetSingle(VK_UNKNOWN,[]);
ecAbortBuild: SetSingle(VK_UNKNOWN,[]);
ecRun: SetSingle(VK_F9,[]);
ecPause: SetSingle(VK_UNKNOWN,[]);
@ -1609,6 +1611,7 @@ begin
ecBuild: SetSingle(VK_F9,[ssShift]);
ecQuickCompile: SetSingle(VK_UNKNOWN,[]);
ecCleanUpAndBuild: SetSingle(VK_UNKNOWN,[]);
ecBuildManyModes: SetSingle(VK_UNKNOWN,[]);
ecAbortBuild: SetSingle(VK_UNKNOWN,[]);
ecRun: SetSingle(VK_F9,[]);
ecPause: SetSingle(VK_UNKNOWN,[]);
@ -2220,6 +2223,7 @@ begin
ecBuild: SetSingle(VK_UNKNOWN,[]);
ecQuickCompile: SetSingle(VK_UNKNOWN,[]);
ecCleanUpAndBuild: SetSingle(VK_UNKNOWN,[]);
ecBuildManyModes: SetSingle(VK_UNKNOWN,[]);
ecAbortBuild: SetSingle(VK_UNKNOWN,[]);
ecRun: SetSingle(VK_R,[ssMeta]);
ecPause: SetSingle(VK_UNKNOWN,[]);
@ -2378,6 +2382,7 @@ begin
ecBuild: SetSingle(VK_F9,[ssShift]);
ecQuickCompile: SetSingle(VK_UNKNOWN,[]);
ecCleanUpAndBuild: SetSingle(VK_UNKNOWN,[]);
ecBuildManyModes: SetSingle(VK_UNKNOWN,[]);
ecAbortBuild: SetSingle(VK_UNKNOWN,[]);
ecRun: SetSingle(VK_F9,[], VK_F9,[ssMeta]);
ecPause: SetSingle(VK_UNKNOWN,[]);
@ -2875,7 +2880,8 @@ begin
AddDefault(C, 'Compile project/program', lisKMCompileProjectProgram, ecCompile);
AddDefault(C, 'Build project/program', lisKMBuildProjectProgram, ecBuild);
AddDefault(C, 'Quick compile, no linking', lisKMQuickCompileNoLinking, ecQuickCompile);
AddDefault(C, 'Clean up and build project/program', lisKMCleanUpAndBuild, ecCleanUpAndBuild);
AddDefault(C, 'Clean up and build', lisKMCleanUpAndBuild, ecCleanUpAndBuild);
AddDefault(C, 'Build many modes', lisKMBuildManyModes, ecBuildManyModes);
AddDefault(C, 'Abort building', lisKMAbortBuilding, ecAbortBuild);
AddDefault(C, 'Run program', lisKMRunProgram, ecRun);
AddDefault(C, 'Pause program', lisKMPauseProgram, ecPause);

View File

@ -437,6 +437,7 @@ resourcestring
lisBFBuildCommand = 'Build Command';
lisMenuQuickCompile = 'Quick Compile';
lisMenuCleanUpAndBuild = 'Clean up and Build ...';
lisMenuBuildManyModes = 'Build many Modes ...';
lisMenuAbortBuild = 'Abort Build';
lisMenuProjectRun = '&Run';
lisBFAlwaysBuildBeforeRun = 'Always build before run';
@ -2947,6 +2948,7 @@ resourcestring
srkmecBuild = 'build program/project';
srkmecQuickCompile = 'quick compile, no linking';
srkmecCleanUpAndBuild = 'clean up and build';
srkmecBuildManyModes = 'build many modes';
srkmecAbortBuild = 'abort build';
srkmecRun = 'run program';
srkmecPause = 'pause program';
@ -3040,6 +3042,7 @@ resourcestring
lisKMBuildProjectProgram = 'Build project/program';
lisKMQuickCompileNoLinking = 'Quick compile, no linking';
lisKMCleanUpAndBuild = 'Clean up and build';
lisKMBuildManyModes = 'Build many modes';
lisKMAbortBuilding = 'Abort building';
lisKMRunProgram = 'Run program';
lisKMPauseProgram = 'Pause program';
@ -5552,6 +5555,8 @@ resourcestring
lisEventsLogAddComment = 'Add Comment ...';
lisEventsLogAddComment2 = 'Add Comment';
lisCleanUpAndBuildProject = 'Clean up and build project';
lisBuildFollowingModes = 'Build the following modes';
lisSelectedModesWereBuilt = 'Selected %d modes were succesfully built.';
lisProjectOutputDirectory = 'Project output directory';
lisProjectSourceDirectories = 'Project source directories';
lisPackageOutputDirectories = 'Package output directories';

View File

@ -338,6 +338,7 @@ type
procedure mnuBuildProjectClicked(Sender: TObject);
procedure mnuQuickCompileProjectClicked(Sender: TObject);
procedure mnuCleanUpAndBuildProjectClicked(Sender: TObject);
procedure mnuBuildManyModesClicked(Sender: TObject);
procedure mnuAbortBuildProjectClicked(Sender: TObject);
procedure mnuRunProjectClicked(Sender: TObject);
procedure mnuPauseProjectClicked(Sender: TObject);
@ -2843,6 +2844,7 @@ begin
itmRunMenuBuild.OnClick := @mnuBuildProjectClicked;
itmRunMenuQuickCompile.OnClick := @mnuQuickCompileProjectClicked;
itmRunMenuCleanUpAndBuild.OnClick := @mnuCleanUpAndBuildProjectClicked;
itmRunMenuBuildManyModes.OnClick := @mnuBuildManyModesClicked;
itmRunMenuAbortBuild.OnClick := @mnuAbortBuildProjectClicked;
itmRunMenuRun.OnClick := @mnuRunProjectClicked;
itmRunMenuPause.OnClick := @mnuPauseProjectClicked;
@ -4367,18 +4369,16 @@ end;
procedure TMainIDE.mnuCleanUpAndBuildProjectClicked(Sender: TObject);
begin
if Project1=nil then exit;
if Project1.MainUnitInfo=nil then begin
// this project has no source to compile
IDEMessageDialog(lisCanNotCompileProject,
lisTheProjectHasNoMainSourceFile, mtError, [mbCancel], '');
exit;
end;
if PrepareForCompile<>mrOk then exit;
if SourceFileMgr.PrepareForCompileWithMsg<>mrOk then exit;
if ShowBuildProjectDialog(Project1)<>mrOk then exit;
DoBuildProject(crBuild,[]);
end;
procedure TMainIDE.mnuBuildManyModesClicked(Sender: TObject);
begin
SourceFileMgr.BuildManyModes;
end;
procedure TMainIDE.mnuAbortBuildProjectClicked(Sender: TObject);
Begin
DoAbortBuild;
@ -6605,14 +6605,7 @@ var
aCompileHint: String;
OldToolStatus: TIDEToolStatus;
begin
if (Project1=nil) or (Project1.MainUnitInfo=nil) then begin
// this project has no source to compile
IDEMessageDialog(lisCanNotCompileProject,
lisTheProjectHasNoMainSourceFile, mtError, [mbCancel], '');
exit(mrCancel);
end;
Result:=PrepareForCompile;
Result:=SourceFileMgr.PrepareForCompileWithMsg;
if Result<>mrOk then begin
debugln(['TMainIDE.DoBuildProject PrepareForCompile failed']);
exit;
@ -6838,15 +6831,12 @@ begin
// Prevent any "Run" command after building, until the debugger is clear.
OldToolStatus := ToolStatus;
ToolStatus:=itBuilder;
{$IFNDEF EnableOldExtTools}
{$ELSE}
{$IFDEF EnableOldExtTools}
ConnectOutputFilter;
for err := Low(TFPCErrorType) to High(TFPCErrorType) do
with Project1.CompilerOptions.CompilerMessages do
TheOutputFilter.ErrorTypeName[err] := ErrorNames[err];
{$ENDIF}
// compile
CompilerFilename:=Project1.GetCompilerFilename;
// Hint: use absolute paths, because some external tools resolve symlinked directories
@ -6950,8 +6940,7 @@ end;
function TMainIDE.DoAbortBuild: TModalResult;
begin
Result:=mrOk;
{$IFNDEF EnableOldExtTools}
{$ELSE}
{$IFDEF EnableOldExtTools}
if ToolStatus<>itBuilder then exit;
{$ENDIF}
AbortBuild;

View File

@ -286,6 +286,7 @@ type
itmRunMenuBuild: TIDEMenuCommand;
itmRunMenuQuickCompile: TIDEMenuCommand;
itmRunMenuCleanUpAndBuild: TIDEMenuCommand;
itmRunMenuBuildManyModes: TIDEMenuCommand;
itmRunMenuAbortBuild: TIDEMenuCommand;
//itmRunnning: TIDEMenuSection;
itmRunMenuRun: TIDEMenuCommand;

View File

@ -926,6 +926,7 @@ begin
CreateMenuItem(ParentMI,itmRunMenuBuild,'itmRunMenuBuild',lisBuild,'menu_build_all');
CreateMenuItem(ParentMI,itmRunMenuQuickCompile,'itmRunMenuQuickCompile',lisMenuQuickCompile,'menu_quick_compile');
CreateMenuItem(ParentMI,itmRunMenuCleanUpAndBuild,'itmRunMenuCleanUpAndBuild',lisMenuCleanUpAndBuild,'menu_build');
CreateMenuItem(ParentMI,itmRunMenuBuildManyModes,'itmRunMenuBuildManyModes',lisMenuBuildManyModes,'menu_build_all');
CreateMenuItem(ParentMI,itmRunMenuAbortBuild,'itmRunMenuAbortBuild',lisMenuAbortBuild,'menu_abort_build');
CreateMenuSeparatorSection(mnuRun,itmRunnning,'itmRunnning');

View File

@ -49,7 +49,8 @@ uses
{$ENDIF}
InputHistory, CheckLFMDlg, LCLMemManager, CodeToolManager, CodeToolsStructs,
ConvCodeTool, CodeCache, CodeTree, FindDeclarationTool, BasicCodeTools,
SynEdit, UnitResources, IDEExternToolIntf, ExtToolDialog, PublishModule;
SynEdit, UnitResources, IDEExternToolIntf, ExtToolDialog, PublishModule,
CompOptsIntf;
type
@ -174,11 +175,13 @@ type
procedure OpenProject(aMenuItem: TIDEMenuItem);
procedure CloseAll;
procedure InvertedFileClose(PageIndex: LongInt; SrcNoteBook: TSourceNotebook);
// project inspector
// Ensure compilation is OK, build many modes at one go.
function PrepareForCompileWithMsg: TModalResult;
function BuildManyModes: Boolean;
// Project Inspector
// Checks if the UnitDirectory is part of the Unit Search Paths, if not,
// ask the user if he wants to extend dependencies or the Unit Search Paths.
function CheckDirIsInSearchPath(UnitInfo: TUnitInfo; AllowAddingDependencies, IsIncludeFile: Boolean): Boolean;
// methods for 'new unit'
function CreateNewCodeBuffer(Descriptor: TProjectFileDescriptor;
NewOwner: TObject; NewFilename: string; var NewCodeBuffer: TCodeBuffer;
@ -187,7 +190,6 @@ type
AncestorType: TPersistentClass; ResourceCode: TCodeBuffer;
UseCreateFormStatements, DisableAutoSize: Boolean): TModalResult;
function NewUniqueComponentName(Prefix: string): string;
// methods for 'save unit'
function ShowSaveFileAsDialog(var AFilename: string; AnUnitInfo: TUnitInfo;
var LFMCode, LRSCode: TCodeBuffer; CanAbort: boolean): TModalResult;
@ -1553,8 +1555,7 @@ begin
if (Layout<>nil) and (Layout.WindowPlacement=iwpDefault)
and ((SrcNoteBook.Top + SrcNoteBook.Height) > MessagesView.Top)
and (MessagesView.Parent = nil) then
SrcNoteBook.Height := Max(50,Min(SrcNoteBook.Height,
MessagesView.Top-SrcNoteBook.Top));
SrcNoteBook.Height := Max(50,Min(SrcNoteBook.Height,MessagesView.Top-SrcNoteBook.Top));
if PutOnTop then
begin
IDEWindowCreators.ShowForm(MessagesView,true);
@ -1586,7 +1587,7 @@ function TLazSourceFileManager.NewFile(NewFileDescriptor: TProjectFileDescriptor
end;
var
NewUnitInfo:TUnitInfo;
NewUnitInfo: TUnitInfo;
NewSrcEdit: TSourceEditor;
NewUnitName: string;
NewBuffer: TCodeBuffer;
@ -4010,6 +4011,77 @@ begin
end;
end;
function TLazSourceFileManager.PrepareForCompileWithMsg: TModalResult;
begin
Result:=mrCancel;
if Project1=nil then exit;
if Project1.MainUnitInfo=nil then
// this project has no source to compile
IDEMessageDialog(lisCanNotCompileProject,lisTheProjectHasNoMainSourceFile,mtError,[mbCancel])
else
Result:=MainIDE.PrepareForCompile;
end;
function TLazSourceFileManager.BuildManyModes(): Boolean;
var
ModeCnt: Integer;
function BuildOneMode: Boolean;
begin
Inc(ModeCnt);
DebugLn('');
DebugLn(Format('Building mode %d: %s ...', [ModeCnt, Project1.ActiveBuildMode.Identifier]));
DebugLn('');
Result := MainIDE.DoBuildProject(crBuild,[]) = mrOK;
end;
var
ModeList: TList;
md, ActiveMode: TProjectBuildMode;
BuildActiveMode: Boolean;
i: Integer;
Msg: String;
begin
Result := False;
ModeCnt := 0;
if PrepareForCompileWithMsg <> mrOk then exit;
FListForm := Nil;
ModeList := TList.Create;
try
if not ShowCheckListBuildModes(lisBuildFollowingModes) then Exit;
ActiveMode := Project1.ActiveBuildMode;
BuildActiveMode := False;
// Collect modes to be built.
for i := 0 to Project1.BuildModes.Count-1 do
begin
md := Project1.BuildModes[i];
if (FListForm=Nil) or FListForm.CheckListBox1.Checked[i] then
if md = ActiveMode then
BuildActiveMode := True
else
ModeList.Add(md);
end;
// Build first the active mode so we don't have to switch many times.
if BuildActiveMode then
if not BuildOneMode then Exit;
// Build rest of the modes.
for i := 0 to ModeList.Count-1 do
begin
Project1.ActiveBuildMode := TProjectBuildMode(ModeList[i]);
if not BuildOneMode then Exit;
end;
// Switch back to original mode.
if ModeList.Count > 0 then
Project1.ActiveBuildMode := ActiveMode;
Msg := Format(lisSelectedModesWereBuilt, [ModeCnt]);
IDEMessageDialog(lisSuccess, Msg, mtInformation, [mbOK]);
Result:=True;
finally
ModeList.Free;
FListForm.Free;
end;
end;
function TLazSourceFileManager.CheckDirIsInSearchPath(UnitInfo: TUnitInfo;
AllowAddingDependencies, IsIncludeFile: Boolean): Boolean;
// Check if the given unit's path is on Unit- or Include-search path.