mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-03 23:59:32 +01:00
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:
parent
72bb33e99c
commit
48a6a75f6c
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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';
|
||||
|
||||
33
ide/main.pp
33
ide/main.pp
@ -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;
|
||||
|
||||
@ -286,6 +286,7 @@ type
|
||||
itmRunMenuBuild: TIDEMenuCommand;
|
||||
itmRunMenuQuickCompile: TIDEMenuCommand;
|
||||
itmRunMenuCleanUpAndBuild: TIDEMenuCommand;
|
||||
itmRunMenuBuildManyModes: TIDEMenuCommand;
|
||||
itmRunMenuAbortBuild: TIDEMenuCommand;
|
||||
//itmRunnning: TIDEMenuSection;
|
||||
itmRunMenuRun: TIDEMenuCommand;
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user