lazarus/ide/buildlazdialog.pas
2002-01-24 14:12:54 +00:00

389 lines
13 KiB
ObjectPascal

{
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
Author: Mattias Gaertner
Abstract:
Defines the TBuildLazarusOptions which stores the settings for the
"Build Lazarus" function of the IDE.
TConfigureBuildLazarusDlg is used to edit TBuildLazarusOptions.
The BuildLazarus function will build the lazarus parts.
}
unit BuildLazDialog;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, Buttons, LResources,
XMLCfg, ExtToolDialog, ExtToolEditDlg, TransferMacros;
type
TMakeMode = (mmNone, mmBuild, mmCleanBuild);
TBuildLazarusOptions = class
private
fBuildLCL: TMakeMode;
fBuildSynEdit: TMakeMode;
fBuildCodeTools: TMakeMode;
fBuildIDE: TMakeMode;
fBuildExamples: TMakeMode;
fCleanAll: boolean;
fMakeFilename: string;
public
constructor Create;
procedure Load(XMLConfig: TXMLConfig; const Path: string);
procedure Save(XMLConfig: TXMLConfig; const Path: string);
property BuildLCL: TMakeMode read fBuildLCL write fBuildLCL;
property BuildSynEdit: TMakeMode read fBuildSynEdit write fBuildSynEdit;
property BuildCodeTools: TMakeMode read fBuildCodeTools write fBuildCodeTools;
property BuildIDE: TMakeMode read fBuildIDE write fBuildIDE;
property BuildExamples: TMakeMode read fBuildExamples write fBuildExamples;
property CleanAll: boolean read fCleanAll write fCleanAll;
property MakeFilename: string read fMakeFilename write fMakeFilename;
end;
TConfigureBuildLazarusDlg = class(TForm)
CleanAllCheckBox: TCheckBox;
BuildLCLRadioGroup: TRadioGroup;
BuildSynEditRadioGroup: TRadioGroup;
BuildCodeToolsRadioGroup: TRadioGroup;
BuildIDERadioGroup: TRadioGroup;
BuildExamplesRadioGroup: TRadioGroup;
OkButton: TButton;
CancelButton: TButton;
procedure OkButtonClick(Sender: TObject);
procedure CancelButtonClick(Sender: TObject);
private
function MakeModeToInt(MakeMode: TMakeMode): integer;
function IntToMakeMode(i: integer): TMakeMode;
public
procedure Load(Options: TBuildLazarusOptions);
procedure Save(Options: TBuildLazarusOptions);
constructor Create(AnOwner: TComponent); override;
end;
function ShowConfigureBuildLazarusDlg(
Options: TBuildLazarusOptions): TModalResult;
function BuildLazarus(Options: TBuildLazarusOptions;
ExternalTools: TExternalToolList; Macros: TTransferMacroList): TModalResult;
implementation
const
MakeModeNames: array[TMakeMode] of string = (
'None', 'Build', 'Clean & Build'
);
function StrToMakeMode(const s: string): TMakeMode;
begin
for Result:=Succ(mmNone) to High(TMakeMode) do
if AnsiCompareText(s,MakeModeNames[Result])=0 then exit;
Result:=mmNone;
end;
function ShowConfigureBuildLazarusDlg(
Options: TBuildLazarusOptions): TModalResult;
var ConfigBuildLazDlg: TConfigureBuildLazarusDlg;
begin
Result:=mrCancel;
ConfigBuildLazDlg:=TConfigureBuildLazarusDlg.Create(Application);
try
ConfigBuildLazDlg.Load(Options);
Result:=ConfigBuildLazDlg.ShowModal;
if Result=mrOk then
ConfigBuildLazDlg.Save(Options);
finally
ConfigBuildLazDlg.Free;
end;
Result:=mrOk;
end;
function BuildLazarus(Options: TBuildLazarusOptions;
ExternalTools: TExternalToolList; Macros: TTransferMacroList): TModalResult;
var
Tool: TExternalToolOptions;
begin
Result:=mrCancel;
Tool:=TExternalToolOptions.Create;
try
Tool.Filename:=Options.MakeFilename;
Tool.ScanOutputForFPCMessages:=true;
Tool.ScanOutputForMakeMessages:=true;
if Options.CleanAll then begin
// clean lazarus source directories
Tool.Title:='Clean Lazarus Source';
Tool.WorkingDirectory:='$(LazarusDir)';
Tool.CmdLineParams:='cleanall';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
if Options.BuildLCL<>mmNone then begin
// build lcl
Tool.Title:='Build LCL';
Tool.WorkingDirectory:='$(LazarusDir)/lcl';
if Options.BuildLCL=mmBuild then
Tool.CmdLineParams:=''
else
Tool.CmdLineParams:='clean all';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
if Options.BuildSynEdit<>mmNone then begin
// build SynEdit
Tool.Title:='Build SynEdit';
Tool.WorkingDirectory:='$(LazarusDir)/components/synedit';
if Options.BuildSynEdit=mmBuild then
Tool.CmdLineParams:=''
else
Tool.CmdLineParams:='clean all';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
if Options.BuildCodeTools<>mmNone then begin
// build CodeTools
Tool.Title:='Build CodeTools';
Tool.WorkingDirectory:='$(LazarusDir)/components/codetools';
if Options.BuildCodeTools=mmBuild then
Tool.CmdLineParams:=''
else
Tool.CmdLineParams:='clean all';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
if Options.BuildIDE<>mmNone then begin
// build IDE
Tool.Title:='Build IDE';
Tool.WorkingDirectory:='$(LazarusDir)';
if Options.BuildIDE=mmBuild then
Tool.CmdLineParams:='ide'
else
// ToDo: the Makefile needs a 'cleanide'
Tool.CmdLineParams:='clean all';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
if Options.BuildExamples<>mmNone then begin
// build Examples
Tool.Title:='Build Examples';
Tool.WorkingDirectory:='$(LazarusDir)/examples';
if Options.BuildExamples=mmBuild then
Tool.CmdLineParams:=''
else
Tool.CmdLineParams:='clean all';
Result:=ExternalTools.Run(Tool,Macros);
if Result<>mrOk then exit;
end;
Result:=mrOk;
finally
Tool.Free;
end;
end;
{ TConfigureBuildLazarusDlg }
constructor TConfigureBuildLazarusDlg.Create(AnOwner: TComponent);
var MakeMode: TMakeMode;
begin
inherited Create(AnOwner);
if LazarusResources.Find(Classname)=nil then begin
SetBounds((Screen.Width-350) div 2,(Screen.Height-320) div 2,350,320);
Caption:='Configure "Build Lazarus"';
CleanAllCheckBox:=TCheckBox.Create(Self);
with CleanAllCheckBox do begin
Parent:=Self;
Name:='CleanAllCheckBox';
SetBounds(10,10,Self.ClientWidth-24,20);
Caption:='Clean all';
Visible:=true;
end;
BuildLCLRadioGroup:=TRadioGroup.Create(Self);
with BuildLCLRadioGroup do begin
Parent:=Self;
Name:='BuildLCLRadioGroup';
SetBounds(10,CleanAllCheckBox.Top+CleanAllCheckBox.Height+5,
CleanAllCheckBox.Width,40);
Caption:='Build LCL';
for MakeMode:=Low(TMakeMode) to High(TMakeMode) do
Items.Add(MakeModeNames[MakeMode]);
Columns:=3;
Visible:=true;
end;
BuildSynEditRadioGroup:=TRadioGroup.Create(Self);
with BuildSynEditRadioGroup do begin
Parent:=Self;
Name:='BuildSynEditRadioGroup';
SetBounds(10,BuildLCLRadioGroup.Top+BuildLCLRadioGroup.Height+5,
BuildLCLRadioGroup.Width,BuildLCLRadioGroup.Height);
Caption:='Build SynEdit';
for MakeMode:=Low(TMakeMode) to High(TMakeMode) do
Items.Add(MakeModeNames[MakeMode]);
Columns:=3;
Visible:=true;
end;
BuildCodeToolsRadioGroup:=TRadioGroup.Create(Self);
with BuildCodeToolsRadioGroup do begin
Parent:=Self;
Name:='BuildCodeToolsRadioGroup';
SetBounds(10,BuildSynEditRadioGroup.Top+BuildSynEditRadioGroup.Height+5,
BuildLCLRadioGroup.Width,BuildLCLRadioGroup.Height);
Caption:='Build CodeTools';
for MakeMode:=Low(TMakeMode) to High(TMakeMode) do
Items.Add(MakeModeNames[MakeMode]);
Columns:=3;
Visible:=true;
end;
BuildIDERadioGroup:=TRadioGroup.Create(Self);
with BuildIDERadioGroup do begin
Parent:=Self;
Name:='BuildIDERadioGroup';
SetBounds(10,BuildCodeToolsRadioGroup.Top+BuildCodeToolsRadioGroup.Height+5,
BuildLCLRadioGroup.Width,BuildLCLRadioGroup.Height);
Caption:='Build IDE';
for MakeMode:=Low(TMakeMode) to High(TMakeMode) do
Items.Add(MakeModeNames[MakeMode]);
Columns:=3;
Visible:=true;
end;
BuildExamplesRadioGroup:=TRadioGroup.Create(Self);
with BuildExamplesRadioGroup do begin
Parent:=Self;
Name:='BuildExamplesRadioGroup';
SetBounds(10,BuildIDERadioGroup.Top+BuildIDERadioGroup.Height+5,
BuildLCLRadioGroup.Width,BuildLCLRadioGroup.Height);
Caption:='Build Examples';
for MakeMode:=Low(TMakeMode) to High(TMakeMode) do
Items.Add(MakeModeNames[MakeMode]);
Columns:=3;
Visible:=true;
end;
OkButton:=TButton.Create(Self);
with OkButton do begin
Parent:=Self;
Name:='OkButton';
SetBounds(Self.ClientWidth-180,Self.ClientHeight-38,80,25);
Caption:='Ok';
OnClick:=@OkButtonClick;
Visible:=true;
end;
CancelButton:=TButton.Create(Self);
with CancelButton do begin
Parent:=Self;
Name:='CancelButton';
SetBounds(Self.ClientWidth-90,OkButton.Top,OkButton.Width,OkButton.Height);
Caption:='Cancel';
OnClick:=@CancelButtonClick;
Visible:=true;
end;
end;
end;
procedure TConfigureBuildLazarusDlg.OkButtonClick(Sender: TObject);
begin
ModalResult:=mrOk;
end;
procedure TConfigureBuildLazarusDlg.CancelButtonClick(Sender: TObject);
begin
ModalResult:=mrCancel;
end;
procedure TConfigureBuildLazarusDlg.Load(Options: TBuildLazarusOptions);
begin
CleanAllCheckBox.Checked:=Options.CleanAll;
BuildLCLRadioGroup.ItemIndex:=MakeModeToInt(Options.BuildLCL);
BuildSynEditRadioGroup.ItemIndex:=MakeModeToInt(Options.BuildSynEdit);
BuildCodeToolsRadioGroup.ItemIndex:=MakeModeToInt(Options.BuildCodeTools);
BuildIDERadioGroup.ItemIndex:=MakeModeToInt(Options.BuildIDE);
BuildExamplesRadioGroup.ItemIndex:=MakeModeToInt(Options.BuildExamples);
end;
procedure TConfigureBuildLazarusDlg.Save(Options: TBuildLazarusOptions);
begin
Options.CleanAll:=CleanAllCheckBox.Checked;
Options.BuildLCL:=IntToMakeMode(BuildLCLRadioGroup.ItemIndex);
Options.BuildSynEdit:=IntToMakeMode(BuildSynEditRadioGroup.ItemIndex);
Options.BuildCodeTools:=IntToMakeMode(BuildCodeToolsRadioGroup.ItemIndex);
Options.BuildIDE:=IntToMakeMode(BuildIDERadioGroup.ItemIndex);
Options.BuildExamples:=IntToMakeMode(BuildExamplesRadioGroup.ItemIndex);
end;
function TConfigureBuildLazarusDlg.MakeModeToInt(MakeMode: TMakeMode): integer;
begin
case MakeMode of
mmBuild: Result:=1;
mmCleanBuild: Result:=2;
else Result:=0;
end;
end;
function TConfigureBuildLazarusDlg.IntToMakeMode(i: integer): TMakeMode;
begin
case i of
1: Result:=mmBuild;
2: Result:=mmCleanBuild;
else Result:=mmNone;
end;
end;
{ TBuildLazarusOptions }
procedure TBuildLazarusOptions.Save(XMLConfig: TXMLConfig; const Path: string);
begin
XMLConfig.SetValue(Path+'BuildLCL/Value',MakeModeNames[fBuildLCL]);
XMLConfig.SetValue(Path+'BuildSynEdit/Value',MakeModeNames[fBuildSynEdit]);
XMLConfig.SetValue(Path+'BuildCodeTools/Value',MakeModeNames[fBuildCodeTools]);
XMLConfig.SetValue(Path+'BuildIDE/Value',MakeModeNames[fBuildIDE]);
XMLConfig.SetValue(Path+'BuildExamples/Value',MakeModeNames[fBuildExamples]);
XMLConfig.SetValue(Path+'CleanAll/Value',fCleanAll);
XMLConfig.SetValue(Path+'MakeFilename/Value',fMakeFilename);
end;
procedure TBuildLazarusOptions.Load(XMLConfig: TXMLConfig; const Path: string);
begin
fBuildLCL:=StrToMakeMode(XMLConfig.GetValue(Path+'BuildLCL/Value',
MakeModeNames[fBuildLCL]));
fBuildSynEdit:=StrToMakeMode(XMLConfig.GetValue(Path+'BuildSynEdit/Value',
MakeModeNames[fBuildSynEdit]));
fBuildCodeTools:=StrToMakeMode(XMLConfig.GetValue(Path+'BuildCodeTools/Value',
MakeModeNames[fBuildCodeTools]));
fBuildIDE:=StrToMakeMode(XMLConfig.GetValue(Path+'BuildIDE/Value',
MakeModeNames[fBuildIDE]));
fBuildExamples:=StrToMakeMode(XMLConfig.GetValue(Path+'BuildExamples/Value',
MakeModeNames[fBuildExamples]));
fCleanAll:=XMLConfig.GetValue(Path+'CleanAll/Value',fCleanAll);
fMakeFilename:=XMLConfig.GetValue(Path+'MakeFilename/Value',fMakeFilename);
end;
constructor TBuildLazarusOptions.Create;
begin
inherited Create;
fMakeFilename:='/usr/bin/make';
end;
end.