mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-27 04:13:43 +02:00
2032 lines
67 KiB
ObjectPascal
2032 lines
67 KiB
ObjectPascal
{ /***************************************************************************
|
|
compileroptionsdlg.pp - Lazarus IDE unit
|
|
---------------------------------------
|
|
Compiler options form sets the switches for the project
|
|
file for the FPC compiler.
|
|
|
|
|
|
Initial Revision : Sat May 10 23:15:32 CST 1999
|
|
|
|
|
|
***************************************************************************/
|
|
|
|
***************************************************************************
|
|
* *
|
|
* This source 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. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
* *
|
|
***************************************************************************
|
|
}
|
|
|
|
unit CompilerOptionsDlg;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
{$I ide.inc}
|
|
|
|
uses
|
|
Forms, Classes, Math, LCLProc, SysUtils, InterfaceBase,
|
|
ComCtrls, Buttons, StdCtrls, ExtCtrls, Graphics, FileUtil,
|
|
Dialogs, Controls, GraphType, LCLType,
|
|
LinkScanner,
|
|
MacroIntf, ProjectIntf, IDEWindowIntf, IDEContextHelpEdit, MainIntf,
|
|
TransferMacros, PathEditorDlg, LazarusIDEStrConsts, IDEOptionDefs, LazConf,
|
|
IDEProcs, IDEImagesIntf, ShowCompilerOpts, Project, PackageDefs, IDEMsgIntf,
|
|
CompilerOptions, CheckCompilerOpts, CompOptsModes, BuildModesEditor,
|
|
Compiler_BuildMacro_Options, CheckLst;
|
|
|
|
type
|
|
{ TfrmCompilerOptions }
|
|
|
|
TfrmCompilerOptions = class(TForm)
|
|
CategoryTreeView: TTreeView;
|
|
chkUseAsDefault: TCheckBox;
|
|
MainNoteBook: TPageControl;
|
|
|
|
{ Search Paths Controls }
|
|
PathPage: TTabSheet;
|
|
|
|
lblOtherUnits: TLabel;
|
|
edtOtherUnits: TEdit;
|
|
OtherUnitsPathEditBtn: TPathEditorButton;
|
|
|
|
lblIncludeFiles: TLabel;
|
|
edtIncludeFiles: TEdit;
|
|
IncludeFilesPathEditBtn: TPathEditorButton;
|
|
|
|
lblOtherSources: TLabel;
|
|
edtOtherSources: TEdit;
|
|
OtherSourcesPathEditBtn: TPathEditorButton;
|
|
|
|
lblLibraries: TLabel;
|
|
edtLibraries: TEdit;
|
|
LibrariesPathEditBtn: TPathEditorButton;
|
|
|
|
lblUnitOutputDir: TLabel;
|
|
edtUnitOutputDir: TEdit;
|
|
btnUnitOutputDir: TButton;
|
|
|
|
lblDebugPath: TLabel;
|
|
edtDebugPath: TEdit;
|
|
DebugPathEditBtn: TPathEditorButton;
|
|
|
|
LCLWidgetTypeLabel: TLabel;
|
|
LCLWidgetTypeComboBox: TComboBox;
|
|
|
|
{ Build modes }
|
|
BuildModesPage: TTabSheet;
|
|
|
|
{ Parsing Controls }
|
|
ParsingPage: TTabSheet;
|
|
grpAsmStyle: TRadioGroup;
|
|
grpSyntaxOptions: TCheckGroup;
|
|
grpSyntaxMode: TGroupBox;
|
|
cmbSyntaxMode: TComboBox;
|
|
|
|
{ Code Generation Controls }
|
|
CodeGenPage: TTabSheet;
|
|
|
|
grpSmartLinkUnit: TGroupBox;
|
|
chkSmartLinkUnit: TCheckBox;
|
|
|
|
grpChecks: TGroupBox;
|
|
chkChecksIO: TCheckBox;
|
|
chkChecksRange: TCheckBox;
|
|
chkChecksOverflow: TCheckBox;
|
|
chkChecksStack: TCheckBox;
|
|
chkVerifyObjMethodCall: TCheckBox;
|
|
|
|
grpHeapSize: TGroupBox;
|
|
edtHeapSize: TEdit;
|
|
|
|
grpTargetPlatform: TGroupBox;
|
|
lblTargetOS : TLabel;
|
|
CategorySplitter: TSplitter;
|
|
TargetOSComboBox: TComboBox;
|
|
lblTargetCPU : TLabel;
|
|
TargetCPUComboBox: TComboBox;
|
|
lblTargetProcessorProc : TLabel;
|
|
TargetProcessorProcComboBox: TComboBox;
|
|
|
|
grpOptimizations: TGroupBox;
|
|
radOptLevelNone: TRadioButton;
|
|
radOptLevel1: TRadioButton;
|
|
radOptLevel2: TRadioButton;
|
|
radOptLevel3: TRadioButton;
|
|
chkOptVarsInReg: TCheckBox;
|
|
lblOptMiddle: TLabel;
|
|
chkOptUncertain: TCheckBox;
|
|
chkOptSmaller: TCheckBox;
|
|
|
|
{ Linking Controls }
|
|
LinkingPage: TTabSheet;
|
|
grpDebugging: TGroupBox;
|
|
chkDebugGDB: TCheckBox;
|
|
chkUseLineInfoUnit: TCheckBox;
|
|
chkGenerateDwarf: TCheckBox;
|
|
chkUseHeaptrc: TCheckBox;
|
|
chkUseValgrind: TCheckBox;
|
|
chkGenGProfCode: TCheckBox;
|
|
chkSymbolsStrip: TCheckBox;
|
|
chkUseExternalDbgSyms: TCheckBox;
|
|
|
|
grpLinkLibraries: TGroupBox;
|
|
chkLinkSmart: TCheckBox;
|
|
|
|
grpOptions: TGroupBox;
|
|
chkOptionsLinkOpt: TCheckBox;
|
|
edtOptionsLinkOpt: TEdit;
|
|
|
|
TargetSpecificsGrpBox: TGroupBox;
|
|
chkWin32GraphicApp: TCheckBox;
|
|
|
|
{ Messages Controls }
|
|
MsgPage: TTabSheet;
|
|
grpVerbosity: TCheckGroup;
|
|
grpErrorCnt: TGroupBox;
|
|
|
|
{ Compiler Messages Controls }
|
|
edtErrorCnt: TEdit;
|
|
btnBrowseMsg: TButton;
|
|
chklistCompMsg: TCheckListBox;
|
|
chkUseMsgFile: TCheckBox;
|
|
editMsgFileName: TEdit;
|
|
grpCompilerMessages: TGroupBox;
|
|
CfgCmpMsgPage: TTabSheet;
|
|
|
|
|
|
{ 'Other' Controls }
|
|
OtherPage: TTabSheet;
|
|
grpConfigFile: TGroupBox;
|
|
chkConfigFile: TCheckBox;
|
|
chkCustomConfigFile: TCheckBox;
|
|
edtConfigPath: TEdit;
|
|
grpCustomOptions: TGroupBox;
|
|
memCustomOptions: TMemo;
|
|
|
|
{ Build Macros and Conditionals }
|
|
MacrosPage: TTabSheet;
|
|
BuildMacrosFrame: TCompOptBuildMacrosFrame;
|
|
|
|
{ Inherited Options }
|
|
InheritedPage: TTabSheet;
|
|
InhSplitter: TSplitter;
|
|
InhNoteLabel: TLabel;
|
|
InhTreeView: TTreeView;
|
|
InhItemMemo: TMemo;
|
|
|
|
{ Compilation }
|
|
CompilationPage: TTabSheet;
|
|
|
|
chkCreateMakefile: TCheckBox;
|
|
|
|
ExecuteBeforeGroupBox: TGroupBox;
|
|
lblRunIfExecBefore: TLabel;
|
|
chkExecBeforeCompile: TCheckBox;
|
|
chkExecBeforeBuild: TCheckBox;
|
|
chkExecBeforeRun: TCheckBox;
|
|
ExecuteBeforeCommandLabel: TLabel;
|
|
ExecuteBeforeCommandEdit: TEdit;
|
|
ExecuteBeforeScanFPCCheckBox: TCheckBox;
|
|
ExecuteBeforeScanMakeCheckBox: TCheckBox;
|
|
ExecuteBeforeShowAllCheckBox: TCheckBox;
|
|
|
|
grpCompiler: TGroupBox;
|
|
lblRunIfCompiler: TLabel;
|
|
chkCompilerCompile: TCheckBox;
|
|
chkCompilerBuild: TCheckBox;
|
|
chkCompilerRun: TCheckBox;
|
|
lblCompiler: TLabel;
|
|
edtCompiler: TEdit;
|
|
|
|
ExecuteAfterGroupBox: TGroupBox;
|
|
lblRunIfExecAfter: TLabel;
|
|
chkExecAfterCompile: TCheckBox;
|
|
chkExecAfterBuild: TCheckBox;
|
|
chkExecAfterRun: TCheckBox;
|
|
ExecuteAfterCommandLabel: TLabel;
|
|
ExecuteAfterCommandEdit: TEdit;
|
|
ExecuteAfterScanFPCCheckBox: TCheckBox;
|
|
ExecuteAfterScanMakeCheckBox: TCheckBox;
|
|
ExecuteAfterShowAllCheckBox: TCheckBox;
|
|
|
|
{ Buttons }
|
|
BtnPanel: TPanel;
|
|
btnShowOptions: TBitBtn;
|
|
btnOK: TBitBtn;
|
|
btnCancel: TBitBtn;
|
|
btnCheck: TBitBtn;
|
|
btnLoadSave: TBitBtn;
|
|
HelpButton: TBitBtn;
|
|
|
|
procedure ButtonOKClicked(Sender: TObject);
|
|
procedure btnTestClicked(Sender: TObject);
|
|
procedure ButtonLoadSaveClick(Sender: TObject);
|
|
procedure ButtonShowOptionsClicked(Sender: TObject);
|
|
procedure CategoryTreeViewSelectionChanged(Sender: TObject);
|
|
procedure FileBrowseBtnClick(Sender: TObject);
|
|
procedure HelpButtonClick(Sender: TObject);
|
|
procedure InhTreeViewSelectionChanged(Sender: TObject);
|
|
procedure chkCustomConfigFileClick(Sender: TObject);
|
|
procedure PathEditBtnClick(Sender: TObject);
|
|
procedure PathEditBtnExecuted(Sender: TObject);
|
|
procedure frmCompilerOptionsClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
procedure btnBrowseMsgClick(Sender: TObject);
|
|
procedure chklistCompMsgClick(Sender: TObject);
|
|
procedure chkUseMsgFileChange(Sender: TObject);
|
|
private
|
|
fPathsTVNode: TTreeNode;
|
|
FBuildModesTVNode: TTreeNode;
|
|
fBuildModeFrame: TBuildModesEditorFrame;
|
|
procedure SetupSearchPathsTab(Page: integer);
|
|
procedure SetupBuildModesTab(Page: integer);
|
|
procedure SetupParsingTab(Page: integer);
|
|
procedure SetupCodeGenerationTab(Page: integer);
|
|
procedure SetupLinkingTab(Page: integer);
|
|
procedure SetupVerbosityTab(Page: integer);
|
|
procedure SetupConfigMsgTab(Page: integer);
|
|
procedure SetupOtherTab(Page: integer);
|
|
procedure SetupMacrosTab(Page: integer);
|
|
procedure SetupInheritedTab(Page: integer);
|
|
procedure SetupCompilationTab(Page: integer);
|
|
procedure SetupButtonBar;
|
|
function CheckSearchPath(const Context, ExpandedPath: string;
|
|
Level: TCheckCompileOptionsMsgLvl): boolean;
|
|
private
|
|
FReadOnly: boolean;
|
|
ImageIndexPackage: integer;
|
|
ImageIndexRequired: integer;
|
|
ImageIndexInherited: integer;
|
|
InheritedChildDatas: TList; // list of PInheritedNodeData
|
|
TempMessages: TCompilerMessagesList;
|
|
procedure SetReadOnly(const AValue: boolean);
|
|
procedure UpdateInheritedTab;
|
|
procedure ClearInheritedTree;
|
|
procedure SetCompilerMessages;
|
|
function GetUseAsDefault: Boolean;
|
|
public
|
|
CompilerOpts: TBaseCompilerOptions; // real options
|
|
OldCompOpts: TBaseCompilerOptions; // set on loading, used for revert
|
|
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
procedure LoadOptionsToForm;
|
|
procedure LoadOptionsToForm(SrcCompilerOptions: TBaseCompilerOptions);
|
|
function SaveFormToOptions(CheckAndWarn: TCheckCompileOptionsMsgLvl): boolean;
|
|
function SaveFormToOptions(CheckAndWarn: TCheckCompileOptionsMsgLvl;
|
|
DestCompilerOptions: TBaseCompilerOptions): boolean;
|
|
public
|
|
property ReadOnly: boolean read FReadOnly write SetReadOnly;
|
|
property UseAsDefault: boolean read GetUseAsDefault;
|
|
end;
|
|
|
|
function SyntaxModeToCaption(const Mode: string): string;
|
|
function CaptionToSyntaxMode(const Caption: string): string;
|
|
function ProcessorToCaption(const Processor: string): string;
|
|
function CaptionToProcessor(const Caption: string): string;
|
|
|
|
function CheckCompileReasons(Reason: TCompileReason;
|
|
Options: TProjectCompilerOptions; Quiet: boolean): TModalResult; // check if Reason is handled at least once
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
type
|
|
TInheritedNodeData = record
|
|
FullText: string;
|
|
Option: TInheritedCompilerOption;
|
|
end;
|
|
PInheritedNodeData = ^TInheritedNodeData;
|
|
|
|
function SyntaxModeToCaption(const Mode: string): string;
|
|
begin
|
|
if SysUtils.CompareText(Mode,'ObjFPC')=0 then
|
|
Result:=lisObjectPascalDefault+' (-Mobjfpc)'
|
|
else if SysUtils.CompareText(Mode,'Delphi')=0 then
|
|
Result:=lisDelphi+' (-Mdelphi)'
|
|
else if SysUtils.CompareText(Mode,'tp')=0 then
|
|
Result:=lisTurboPascal+' (-Mtp)'
|
|
else if SysUtils.CompareText(Mode,'fpc')=0 then
|
|
Result:=lisFreePascal+' (-Mfpc)'
|
|
else if SysUtils.CompareText(Mode,'macpas')=0 then
|
|
Result:=lisMacPascal+' (-Mmacpas)'
|
|
else
|
|
Result:='';
|
|
end;
|
|
|
|
function CaptionToSyntaxMode(const Caption: string): string;
|
|
begin
|
|
if System.Pos('-Mdelphi',Caption)>0 then
|
|
Result:='Delphi'
|
|
else if System.Pos('-Mtp',Caption)>0 then
|
|
Result:='tp'
|
|
else if System.Pos('-Mmacpas',Caption)>0 then
|
|
Result:='macpas'
|
|
else if System.Pos('-Mfpc',Caption)>0 then
|
|
Result:='fpc'
|
|
else
|
|
Result:='ObjFPC';
|
|
end;
|
|
|
|
function ProcessorToCaption(const Processor: string): string;
|
|
begin
|
|
if SysUtils.CompareText(Processor,'386')=0 then
|
|
Result:='386/486'+' (-Op386)'
|
|
else if SysUtils.CompareText(Processor,'pentium')=0 then
|
|
Result:='Pentium/Pentium MMX (-OpPENTIUM)'
|
|
else if SysUtils.CompareText(Processor,'pentium2')=0 then
|
|
Result:='Pentium Pro/Pentium II/C6x86/K6 (-OpPENTIUM2)'
|
|
else if SysUtils.CompareText(Processor,'pentium3')=0 then
|
|
Result:='Pentium III (-OpPENTIUM3)'
|
|
else if SysUtils.CompareText(Processor,'pentium4')=0 then
|
|
Result:='Pentium IV (-OpPENTIUM4)'
|
|
else if SysUtils.CompareText(Processor,'pentiumm')=0 then
|
|
Result:='Pentium M (-OpPENTIUMM)'
|
|
else
|
|
Result:='('+rsiwpDefault+')';
|
|
end;
|
|
|
|
function CaptionToProcessor(const Caption: string): string;
|
|
begin
|
|
if System.Pos('-Op386',Caption)>0 then
|
|
Result:='386'
|
|
else if System.Pos('-OpPENTIUMM',Caption)>0 then
|
|
Result:='pentiumm'
|
|
else if System.Pos('-OpPENTIUM4',Caption)>0 then
|
|
Result:='pentium4'
|
|
else if System.Pos('-OpPENTIUM3',Caption)>0 then
|
|
Result:='pentium3'
|
|
else if System.Pos('-OpPENTIUM2',Caption)>0 then
|
|
Result:='pentium2'
|
|
else if System.Pos('-OpPENTIUM',Caption)>0 then
|
|
Result:='pentium'
|
|
else
|
|
Result:='';
|
|
end;
|
|
|
|
function CheckCompileReasons(Reason: TCompileReason;
|
|
Options: TProjectCompilerOptions; Quiet: boolean): TModalResult;
|
|
var
|
|
ProjToolOpts: TProjectCompilationToolOptions;
|
|
begin
|
|
if (Reason in Options.CompileReasons)
|
|
and (Options.CompilerPath<>'') then
|
|
exit(mrOk);
|
|
if Options.ExecuteBefore is TProjectCompilationToolOptions then begin
|
|
ProjToolOpts:=TProjectCompilationToolOptions(Options.ExecuteBefore);
|
|
if (Reason in ProjToolOpts.CompileReasons) and (ProjToolOpts.Command<>'') then
|
|
exit(mrOk);
|
|
end;
|
|
if Options.ExecuteAfter is TProjectCompilationToolOptions then begin
|
|
ProjToolOpts:=TProjectCompilationToolOptions(Options.ExecuteAfter);
|
|
if (Reason in ProjToolOpts.CompileReasons) and (ProjToolOpts.Command<>'') then
|
|
exit(mrOk);
|
|
end;
|
|
// reason is not handled
|
|
if Quiet then exit(mrCancel);
|
|
Result:=MessageDlg('Nothing to do',
|
|
'The project''s compiler options has no compile command.'#13
|
|
+'See Project / Compiler Options ... / Compilation',mtInformation,
|
|
[mbCancel,mbIgnore],0);
|
|
if Result=mrIgnore then
|
|
Result:=mrOk;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions Constructor
|
|
------------------------------------------------------------------------------}
|
|
constructor TfrmCompilerOptions.Create(TheOwner: TComponent);
|
|
var
|
|
Page: integer;
|
|
begin
|
|
DisableAlign;
|
|
try
|
|
inherited Create(TheOwner);
|
|
Caption := dlgCompilerOptions;
|
|
|
|
TempMessages := TCompilerMessagesList.Create;
|
|
IDEDialogLayoutList.ApplyLayout(Self,Width,Height);
|
|
|
|
ImageIndexPackage := IDEImages.LoadImage(16, 'item_package');
|
|
ImageIndexRequired := IDEImages.LoadImage(16, 'pkg_required');
|
|
ImageIndexInherited := IDEImages.LoadImage(16, 'pkg_inherited');
|
|
|
|
MainNotebook.PageIndex:=0;
|
|
MainNoteBook.ShowTabs:=false;
|
|
Page:=0;
|
|
|
|
SetupSearchPathsTab(Page);
|
|
inc(Page);
|
|
SetupBuildModesTab(Page);
|
|
inc(Page);
|
|
SetupParsingTab(Page);
|
|
inc(Page);
|
|
SetupCodeGenerationTab(Page);
|
|
inc(Page);
|
|
SetupLinkingTab(Page);
|
|
inc(Page);
|
|
SetupVerbosityTab(Page);
|
|
inc(Page);
|
|
SetupConfigMsgTab(Page);
|
|
inc(Page);
|
|
SetupOtherTab(Page);
|
|
inc(Page);
|
|
SetupMacrosTab(Page);
|
|
inc(Page);
|
|
SetupInheritedTab(Page);
|
|
inc(Page);
|
|
SetupCompilationTab(Page);
|
|
inc(Page);
|
|
SetupButtonBar;
|
|
chkUseAsDefault.Caption := dlgCOUseAsDefault;
|
|
chkUseAsDefault.ShowHint:=true;
|
|
chkUseAsDefault.Hint:=lisWhenEnabledTheCurrentOptionsAreSavedToTheTemplateW;
|
|
|
|
CategoryTreeView.Selected:=CategoryTreeView.Items.GetFirstNode;
|
|
CategoryTreeViewSelectionChanged(nil);
|
|
finally
|
|
EnableAlign;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions Destructor
|
|
------------------------------------------------------------------------------}
|
|
destructor TfrmCompilerOptions.Destroy;
|
|
begin
|
|
FreeAndNil(OldCompOpts);
|
|
ClearInheritedTree;
|
|
TempMessages.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.LoadOptionsToForm;
|
|
begin
|
|
LoadOptionsToForm(nil);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions ButtonOKClicked
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.ButtonOKClicked(Sender: TObject);
|
|
begin
|
|
// Accept any changes
|
|
Assert(False, 'Trace:Accept compiler options changes');
|
|
|
|
{ Save the options and hide the dialog }
|
|
if not SaveFormToOptions(ccomlErrors) then exit;
|
|
ModalResult:=mrOk;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions ButtonCheckClicked
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.btnTestClicked(Sender: TObject);
|
|
begin
|
|
// Apply any changes and test
|
|
if not SaveFormToOptions(ccomlHints) then exit;
|
|
if Assigned(TestCompilerOptions) then begin
|
|
btnCheck.Enabled:=false;
|
|
try
|
|
TestCompilerOptions(CompilerOpts);
|
|
finally
|
|
btnCheck.Enabled:=true;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions ButtonShowOptionsClicked
|
|
This function is for testing the MakeOptionsString function only. Remove
|
|
this function and its button when the function is working correctly.
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.ButtonShowOptionsClicked(Sender: TObject);
|
|
begin
|
|
// Test MakeOptionsString function
|
|
if SaveFormToOptions(ccomlWarning) then
|
|
ShowCompilerOptionsDialog(Self, CompilerOpts);
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.CategoryTreeViewSelectionChanged(Sender: TObject);
|
|
var
|
|
Node: TTreeNode;
|
|
begin
|
|
Node:=CategoryTreeView.Selected;
|
|
if Node=nil then exit;
|
|
if TObject(Node.Data) is TTabSheet then begin
|
|
MainNoteBook.ActivePage:=TTabSheet(Node.Data);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.FileBrowseBtnClick(Sender: TObject);
|
|
var
|
|
OpenDialog: TOpenDialog;
|
|
DefaultFilename: String;
|
|
NewFilename: String;
|
|
begin
|
|
OpenDialog:=TSelectDirectoryDialog.Create(Self);
|
|
try
|
|
DefaultFilename:='';
|
|
if Sender=btnUnitOutputDir then begin
|
|
OpenDialog.Title:=lisUnitOutputDirectory;
|
|
OpenDialog.Options:=OpenDialog.Options+[ofPathMustExist];
|
|
end else
|
|
exit;
|
|
OpenDialog.Filename:=ExtractFilename(DefaultFilename);
|
|
if DefaultFilename<>'' then
|
|
OpenDialog.InitialDir:=ExtractFilePath(DefaultFilename)
|
|
else
|
|
OpenDialog.InitialDir:=CompilerOpts.BaseDirectory;
|
|
if OpenDialog.Execute then begin
|
|
NewFilename:=TrimFilename(OpenDialog.Filename);
|
|
if CompilerOpts<>nil then
|
|
NewFilename:=CompilerOpts.ShortenPath(NewFilename,false);
|
|
if Sender=btnUnitOutputDir then begin
|
|
edtUnitOutputDir.Text:=OpenDialog.Filename;
|
|
end;
|
|
end;
|
|
finally
|
|
OpenDialog.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.HelpButtonClick(Sender: TObject);
|
|
begin
|
|
ShowContextHelpForIDE(Self);
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.InhTreeViewSelectionChanged(Sender: TObject);
|
|
var
|
|
ANode: TTreeNode;
|
|
ChildData: PInheritedNodeData;
|
|
sl: TStrings;
|
|
begin
|
|
ANode:=InhTreeView.Selected;
|
|
if (ANode=nil) or (ANode.Data=nil) then begin
|
|
InhItemMemo.Lines.Text:=lisSelectANode;
|
|
end else begin
|
|
ChildData:=PInheritedNodeData(ANode.Data);
|
|
if ChildData^.Option in icoAllSearchPaths then begin
|
|
sl:=SplitString(ChildData^.FullText,';');
|
|
InhItemMemo.Lines.Assign(sl);
|
|
sl.Free;
|
|
end else
|
|
InhItemMemo.Lines.Text:=ChildData^.FullText;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.ButtonLoadSaveClick(Sender: TObject);
|
|
var
|
|
ImExpCompilerOptionsResult: TImportExportOptionsResult;
|
|
begin
|
|
MainIDEInterface.DoImExportCompilerOptions(Self, ImExpCompilerOptionsResult);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions GetCompilerOptions
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.LoadOptionsToForm(
|
|
SrcCompilerOptions: TBaseCompilerOptions);
|
|
var
|
|
i: integer;
|
|
LCLPlatform: TLCLPlatform;
|
|
EnabledLinkerOpts: Boolean;
|
|
Options: TBaseCompilerOptions;
|
|
HasBuildModes: boolean;
|
|
begin
|
|
if SrcCompilerOptions<>nil then
|
|
Options:=SrcCompilerOptions
|
|
else
|
|
Options:=CompilerOpts;
|
|
|
|
FreeAndNil(OldCompOpts);
|
|
OldCompOpts := TBaseCompilerOptionsClass(Options.ClassType).Create(nil);
|
|
OldCompOpts.Assign(Options);
|
|
|
|
DisableAlign;
|
|
try
|
|
EnabledLinkerOpts:=Options.NeedsLinkerOpts;
|
|
chkUseAsDefault.Visible:=Options.CanBeDefaulForProject;
|
|
|
|
{ Get the compiler options and apply them to the dialog }
|
|
|
|
// paths
|
|
edtOtherUnits.Text := Options.OtherUnitFiles;
|
|
edtIncludeFiles.Text := Options.IncludePath;
|
|
edtLibraries.Text := Options.Libraries;
|
|
lblLibraries.Enabled:=EnabledLinkerOpts;
|
|
edtOtherSources.Text := Options.SrcPath;
|
|
edtUnitOutputDir.Text := Options.UnitOutputDirectory;
|
|
edtDebugPath.Text := Options.DebugPath;
|
|
|
|
LCLPlatform := DirNameToLCLPlatform(Options.LCLWidgetType);
|
|
if CompareText(Options.LCLWidgetType,LCLPlatformDirNames[LCLPlatform])=0 then
|
|
LCLWidgetTypeComboBox.ItemIndex := ord(LCLPlatform)+1
|
|
else
|
|
LCLWidgetTypeComboBox.ItemIndex := 0;
|
|
|
|
// build modes
|
|
HasBuildModes:=(Options is TProjectCompilerOptions);
|
|
{$IFNDEF EnableBuildModes}
|
|
HasBuildModes:= false;
|
|
{$ENDIF}
|
|
if HasBuildModes then begin
|
|
// show build modes
|
|
if FBuildModesTVNode=nil then begin
|
|
FBuildModesTVNode:=CategoryTreeView.Items.AddObject(fPathsTVNode,
|
|
BuildModesPage.Caption,BuildModesPage);
|
|
end;
|
|
end else begin
|
|
// hide build modes
|
|
if FBuildModesTVNode<>nil then begin
|
|
CategoryTreeView.Items.Delete(FBuildModesTVNode);
|
|
FBuildModesTVNode:=nil;
|
|
end;
|
|
end;
|
|
|
|
// parsing
|
|
if (Options.AssemblerStyle in [1,2,3]) then
|
|
grpAsmStyle.ItemIndex:=Options.AssemblerStyle
|
|
else
|
|
grpAsmStyle.ItemIndex:=0;
|
|
|
|
with grpSyntaxOptions do
|
|
begin
|
|
Checked[0] := Options.CStyleOperators;
|
|
Checked[1] := Options.IncludeAssertionCode;
|
|
Checked[2] := Options.AllowLabel;
|
|
Checked[3] := Options.CPPInline;
|
|
Checked[4] := Options.CStyleMacros;
|
|
Checked[5] := Options.InitConstructor;
|
|
Checked[6] := Options.StaticKeyword;
|
|
Checked[7] := Options.UseAnsiStrings;
|
|
end;
|
|
|
|
cmbSyntaxMode.Text:=SyntaxModeToCaption(Options.SyntaxMode);
|
|
|
|
// code generation
|
|
chkSmartLinkUnit.Checked := Options.SmartLinkUnit;
|
|
|
|
chkChecksIO.Checked := Options.IOChecks;
|
|
chkChecksRange.Checked := Options.RangeChecks;
|
|
chkChecksOverflow.Checked := Options.OverflowChecks;
|
|
chkChecksStack.Checked := Options.StackChecks;
|
|
chkVerifyObjMethodCall.Checked := Options.VerifyObjMethodCall;
|
|
|
|
grpHeapSize.Enabled:=EnabledLinkerOpts;
|
|
edtHeapSize.Text := IntToStr(Options.HeapSize);
|
|
|
|
i:=TargetOSComboBox.Items.IndexOf(Options.TargetOS);
|
|
if i<0 then i:=0; // 0 is default
|
|
TargetOSComboBox.ItemIndex:=i;
|
|
TargetOSComboBox.Text:=Options.TargetOS;
|
|
i:=TargetCPUComboBox.Items.IndexOf(Options.TargetCPU);
|
|
if i<0 then i:=0; // 0 is default
|
|
TargetCPUComboBox.ItemIndex:=i;
|
|
TargetCPUComboBox.Text:=Options.TargetCPU;
|
|
|
|
TargetProcessorProcComboBox.Text:=ProcessorToCaption(Options.TargetProcessor);
|
|
|
|
chkOptVarsInReg.Checked := Options.VariablesInRegisters;
|
|
chkOptUncertain.Checked := Options.UncertainOptimizations;
|
|
chkOptSmaller.Checked := Options.SmallerCode;
|
|
|
|
case Options.OptimizationLevel of
|
|
1: radOptLevel1.Checked := true;
|
|
2: radOptLevel2.Checked := true;
|
|
3: radOptLevel3.Checked := true;
|
|
else
|
|
radOptLevelNone.Checked := true;
|
|
end;
|
|
|
|
// linking
|
|
chkDebugGDB.Checked := Options.GenerateDebugInfo;
|
|
chkUseLineInfoUnit.Checked := Options.UseLineInfoUnit;
|
|
chkGenerateDwarf.Checked := Options.GenerateDwarf;
|
|
chkUseHeaptrc.Checked := Options.UseHeaptrc;
|
|
chkUseValgrind.Checked := Options.UseValgrind;
|
|
chkGenGProfCode.Checked := Options.GenGProfCode;
|
|
chkSymbolsStrip.Checked := Options.StripSymbols;
|
|
chkSymbolsStrip.Enabled:=EnabledLinkerOpts;
|
|
chkUseExternalDbgSyms.Checked := Options.UseExternalDbgSyms;
|
|
|
|
chkLinkSmart.Checked := Options.LinkSmart;
|
|
grpLinkLibraries.Enabled:=EnabledLinkerOpts;
|
|
|
|
chkOptionsLinkOpt.Checked := Options.PassLinkerOptions;
|
|
edtOptionsLinkOpt.Text := Options.LinkerOptions;
|
|
chkWin32GraphicApp.Checked := Options.Win32GraphicApp;
|
|
chkWin32GraphicApp.Enabled:=EnabledLinkerOpts;
|
|
grpOptions.Enabled:=EnabledLinkerOpts;
|
|
|
|
// messages
|
|
with grpVerbosity do
|
|
begin
|
|
Checked[0] := Options.ShowErrors;
|
|
Checked[1] := Options.ShowHintsForSenderNotUsed;
|
|
Checked[2] := Options.ShowWarn;
|
|
Checked[3] := Options.ShowDebugInfo;
|
|
Checked[4] := Options.ShowNotes;
|
|
Checked[5] := Options.ShowUsedFiles;
|
|
Checked[6] := Options.ShowHints;
|
|
Checked[7] := Options.ShowTriedFiles;
|
|
Checked[8] := Options.ShowGenInfo;
|
|
Checked[9] := Options.ShowDefMacros;
|
|
Checked[10] := Options.ShowLineNum;
|
|
Checked[11] := Options.ShowCompProc;
|
|
Checked[12] := Options.ShowAllProcsOnError;
|
|
Checked[13] := Options.ShowCond;
|
|
Checked[14] := Options.ShowAll;
|
|
Checked[15] := Options.ShowExecInfo;
|
|
Checked[16] := Options.ShowSummary;
|
|
Checked[17] := Options.ShowNothing;
|
|
Checked[18] := Options.ShowHintsForUnusedUnitsInMainSrc;
|
|
Checked[19] := Options.WriteFPCLogo;
|
|
end;
|
|
|
|
// compiler messages
|
|
chkUseMsgFile.OnChange := nil;
|
|
try
|
|
chkUseMsgFile.Checked := Options.UseMsgFile;
|
|
editMsgFileName.Caption := Options.MsgFileName;
|
|
TempMessages.Assign(Options.CompilerMessages);
|
|
SetCompilerMessages;
|
|
finally
|
|
chkUseMsgFile.OnChange := @chkUseMsgFileChange;
|
|
end;
|
|
|
|
// other
|
|
chkConfigFile.Checked := not Options.DontUseConfigFile;
|
|
chkCustomConfigFile.Checked := Options.CustomConfigFile;
|
|
edtConfigPath.Enabled := chkCustomConfigFile.Checked;
|
|
edtConfigPath.Text := Options.ConfigFilePath;
|
|
memCustomOptions.Text := Options.CustomOptions;
|
|
|
|
edtErrorCnt.Text := IntToStr(Options.StopAfterErrCount);
|
|
|
|
// conditionals + build macros
|
|
BuildMacrosFrame.LoadFromOptions(Options);
|
|
|
|
// inherited tab
|
|
UpdateInheritedTab;
|
|
|
|
// compilation
|
|
chkCreateMakefile.Checked:=Options.CreateMakefileOnBuild;
|
|
|
|
ExecuteBeforeCommandEdit.Text:=Options.ExecuteBefore.Command;
|
|
ExecuteBeforeScanFPCCheckBox.Checked:=Options.ExecuteBefore.ScanForFPCMessages;
|
|
ExecuteBeforeScanMakeCheckBox.Checked:=
|
|
Options.ExecuteBefore.ScanForMakeMessages;
|
|
ExecuteBeforeShowAllCheckBox.Checked:=Options.ExecuteBefore.ShowAllMessages;
|
|
if Options.ExecuteBefore is TProjectCompilationToolOptions
|
|
then with TProjectCompilationToolOptions(Options.ExecuteBefore) do begin
|
|
chkExecBeforeCompile.Checked := crCompile in CompileReasons;
|
|
chkExecBeforeBuild.Checked := crBuild in CompileReasons;
|
|
chkExecBeforeRun.Checked := crRun in CompileReasons;
|
|
lblRunIfExecBefore.Visible := True;
|
|
chkExecBeforeCompile.Visible := True;
|
|
chkExecBeforeBuild.Visible := True;
|
|
chkExecBeforeRun.Visible := True;
|
|
end
|
|
else begin
|
|
lblRunIfExecBefore.Visible := False;
|
|
chkExecBeforeCompile.Visible := False;
|
|
chkExecBeforeBuild.Visible := False;
|
|
chkExecBeforeRun.Visible := False;
|
|
end;
|
|
|
|
edtCompiler.Text := Options.CompilerPath;
|
|
if Options is TProjectCompilerOptions
|
|
then with TProjectCompilerOptions(Options) do begin
|
|
lblRunIfCompiler.Visible := True;
|
|
chkCompilerCompile.AnchorToNeighbour(akLeft,30,lblRunIfCompiler);
|
|
chkCompilerCompile.Checked := crCompile in CompileReasons;
|
|
chkCompilerBuild.Checked := crBuild in CompileReasons;
|
|
chkCompilerRun.Checked := crRun in CompileReasons;
|
|
chkCompilerCompile.Caption := lisCOCallOnCompile;
|
|
chkCompilerCompile.Visible := True;
|
|
chkCompilerBuild.Visible := True;
|
|
chkCompilerRun.Visible := True;
|
|
edtCompiler.AnchorToNeighbour(akTop,0,chkCompilerCompile);
|
|
end
|
|
else if Options is TPkgCompilerOptions
|
|
then begin
|
|
lblRunIfCompiler.Visible := False;
|
|
chkCompilerCompile.AnchorParallel(akTop,6,chkCompilerCompile.Parent);
|
|
chkCompilerCompile.AnchorParallel(akLeft,6,chkCompilerCompile.Parent);
|
|
chkCompilerCompile.Visible := True;
|
|
chkCompilerCompile.Caption := lisCOSkipCallingCompiler;
|
|
chkCompilerCompile.Checked := TPkgCompilerOptions(Options).SkipCompiler;
|
|
chkCompilerBuild.Visible := False;
|
|
chkCompilerRun.Visible := False;
|
|
edtCompiler.AnchorToNeighbour(akTop,0,chkCompilerCompile);
|
|
end
|
|
else begin
|
|
lblRunIfCompiler.Visible := False;
|
|
chkCompilerCompile.Visible := False;
|
|
chkCompilerBuild.Visible := False;
|
|
chkCompilerRun.Visible := False;
|
|
edtCompiler.AnchorParallel(akTop,0,lblCompiler.Parent);
|
|
end;
|
|
|
|
ExecuteAfterCommandEdit.Text:=Options.ExecuteAfter.Command;
|
|
ExecuteAfterScanFPCCheckBox.Checked:=Options.ExecuteAfter.ScanForFPCMessages;
|
|
ExecuteAfterScanMakeCheckBox.Checked:=Options.ExecuteAfter.ScanForMakeMessages;
|
|
ExecuteAfterShowAllCheckBox.Checked:=Options.ExecuteAfter.ShowAllMessages;
|
|
if Options.ExecuteAfter is TProjectCompilationToolOptions
|
|
then with TProjectCompilationToolOptions(Options.ExecuteAfter) do begin
|
|
chkExecAfterCompile.Checked := crCompile in CompileReasons;
|
|
chkExecAfterBuild.Checked := crBuild in CompileReasons;
|
|
chkExecAfterRun.Checked := crRun in CompileReasons;
|
|
lblRunIfExecAfter.Visible := True;
|
|
chkExecAfterCompile.Visible := True;
|
|
chkExecAfterBuild.Visible := True;
|
|
chkExecAfterRun.Visible := True;
|
|
end
|
|
else begin
|
|
lblRunIfExecAfter.Visible := False;
|
|
chkExecAfterCompile.Visible := False;
|
|
chkExecAfterBuild.Visible := False;
|
|
chkExecAfterRun.Visible := False;
|
|
end;
|
|
finally
|
|
EnableAlign;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions PutCompilerOptions
|
|
------------------------------------------------------------------------------}
|
|
function TfrmCompilerOptions.SaveFormToOptions(
|
|
CheckAndWarn: TCheckCompileOptionsMsgLvl;
|
|
DestCompilerOptions: TBaseCompilerOptions): boolean;
|
|
|
|
function MakeCompileReasons(const ACompile, ABuild, ARun: TCheckBox): TCompileReasons;
|
|
begin
|
|
Result := [];
|
|
if ACompile.Checked then Include(Result, crCompile);
|
|
if ABuild.Checked then Include(Result, crBuild);
|
|
if ARun.Checked then Include(Result, crRun);
|
|
end;
|
|
|
|
function CheckPutSearchPath(const Context, OldExpandedPath,
|
|
NewExpandedPath: string): boolean;
|
|
var
|
|
Level: TCheckCompileOptionsMsgLvl;
|
|
begin
|
|
Level:=CheckAndWarn;
|
|
if OldExpandedPath<>NewExpandedPath then
|
|
Level:=ccomlHints;
|
|
Result:=CheckSearchPath(Context,NewExpandedPath,Level);
|
|
end;
|
|
|
|
var
|
|
code: LongInt;
|
|
hs: LongInt;
|
|
i: integer;
|
|
NewTargetOS,
|
|
NewTargetCPU: String;
|
|
Options: TBaseCompilerOptions;
|
|
NewDontUseConfigFile: Boolean;
|
|
NewCustomConfigFile: Boolean;
|
|
NewConfigFilePath: String;
|
|
AdditionalConfig: String;
|
|
OldPath: String;
|
|
begin
|
|
Result:=false;
|
|
|
|
// Put the compiler options from the dialog into the TCompilerOptions class
|
|
if DestCompilerOptions<>nil then
|
|
Options:=DestCompilerOptions
|
|
else
|
|
Options:=CompilerOpts;
|
|
if ReadOnly and (Options=CompilerOpts) then exit(true);
|
|
|
|
NewDontUseConfigFile:=not chkConfigFile.Checked;
|
|
NewCustomConfigFile:=chkCustomConfigFile.Checked;
|
|
NewConfigFilePath:=edtConfigPath.Text;
|
|
|
|
if ord(CheckAndWarn)<=ord(ccomlWarning) then begin
|
|
if ((NewDontUseConfigFile<>Options.DontUseConfigFile)
|
|
or (NewCustomConfigFile<>Options.CustomConfigFile)
|
|
or (NewConfigFilePath<>Options.ConfigFilePath))
|
|
and (not NewDontUseConfigFile) and NewCustomConfigFile
|
|
then begin
|
|
// config file options changed
|
|
// and both additional and standard config files are used
|
|
AdditionalConfig:=ExtractFilename(edtConfigPath.Text);
|
|
if (CompareFileNames(AdditionalConfig,'fpc.cfg')=0)
|
|
or (CompareFileNames(AdditionalConfig,'ppc386.cfg')=0)
|
|
then begin
|
|
if MessageDlg(lisCOAmbiguousAdditionalCompilerConfigFile,
|
|
Format(lisCOClickOKIfAreSureToDoThat, [BreakString(
|
|
lisCOWarningTheAdditionalCompilerConfigFileHasTheSameNa,
|
|
60, 0), #13#13]),
|
|
mtWarning,[mbOk,mbCancel],0)<>mrOk
|
|
then begin
|
|
Result:=false;
|
|
exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
try
|
|
|
|
// paths
|
|
OldPath:=Options.GetIncludePath(false);
|
|
Options.IncludePath := edtIncludeFiles.Text;
|
|
if not CheckPutSearchPath('include search path',OldPath,Options.GetIncludePath(false)) then
|
|
exit(false);
|
|
OldPath:=Options.GetLibraryPath(false);
|
|
Options.Libraries := edtLibraries.Text;
|
|
if not CheckPutSearchPath('library search path',OldPath,Options.GetLibraryPath(false)) then
|
|
exit(false);
|
|
OldPath:=Options.GetUnitPath(false);
|
|
Options.OtherUnitFiles := edtOtherUnits.Text;
|
|
if not CheckPutSearchPath('unit search path',OldPath,Options.GetUnitPath(false)) then
|
|
exit(false);
|
|
OldPath:=Options.GetSrcPath(false);
|
|
Options.SrcPath := edtOtherSources.Text;
|
|
if not CheckPutSearchPath('source search path',OldPath,Options.GetSrcPath(false)) then
|
|
exit(false);
|
|
Options.UnitOutputDirectory := edtUnitOutputDir.Text;
|
|
OldPath:=Options.GetDebugPath(false);
|
|
Options.DebugPath := edtDebugPath.Text;
|
|
if not CheckPutSearchPath('debugger search path',OldPath,Options.GetDebugPath(false)) then
|
|
exit(false);
|
|
|
|
// ToDo: will be replaced by buildmodes
|
|
i:=LCLWidgetTypeComboBox.Itemindex;
|
|
if i<=0 then
|
|
Options.LCLWidgetType:=''
|
|
else
|
|
Options.LCLWidgetType:= LCLPlatformDirNames[TLCLPlatform(i-1)];
|
|
|
|
// parsing
|
|
Options.AssemblerStyle := grpAsmStyle.ItemIndex;
|
|
|
|
with grpSyntaxOptions do
|
|
begin
|
|
Options.CStyleOperators := Checked[0];
|
|
Options.IncludeAssertionCode := Checked[1];
|
|
Options.AllowLabel := Checked[2];
|
|
Options.CPPInline := Checked[3];
|
|
Options.CStyleMacros := Checked[4];
|
|
Options.InitConstructor := Checked[5];
|
|
Options.StaticKeyword := Checked[6];
|
|
Options.UseAnsiStrings := Checked[7];
|
|
end;
|
|
|
|
Options.SyntaxMode:=CaptionToSyntaxMode(cmbSyntaxMode.Text);
|
|
|
|
// code generation
|
|
Options.SmartLinkUnit := chkSmartLinkUnit.Checked;
|
|
|
|
Options.IOChecks := chkChecksIO.Checked;
|
|
Options.RangeChecks := chkChecksRange.Checked;
|
|
Options.OverflowChecks := chkChecksOverflow.Checked;
|
|
Options.StackChecks := chkChecksStack.Checked;
|
|
Options.VerifyObjMethodCall := chkVerifyObjMethodCall.Checked;
|
|
|
|
Val(edtHeapSize.Text, hs, code);
|
|
if (code <> 0) then
|
|
Options.HeapSize := 0
|
|
else
|
|
Options.HeapSize := hs;
|
|
|
|
|
|
NewTargetOS:=TargetOSComboBox.Text;
|
|
if TargetOSComboBox.Items.IndexOf(NewTargetOS)<=0 then
|
|
NewTargetOS:='';
|
|
Options.TargetOS:=NewTargetOS;
|
|
|
|
NewTargetCPU:=TargetCPUComboBox.Text;
|
|
if TargetCPUComboBox.Items.IndexOf(NewTargetCPU)<=0 then
|
|
NewTargetCPU:='';
|
|
Options.TargetCPU:=NewTargetCPU;
|
|
|
|
Options.TargetProcessor := CaptionToProcessor(TargetProcessorProcComboBox.Text);
|
|
Options.VariablesInRegisters := chkOptVarsInReg.Checked;
|
|
Options.UncertainOptimizations := chkOptUncertain.Checked;
|
|
Options.SmallerCode := chkOptSmaller.Checked;
|
|
|
|
if (radOptLevel1.Checked) then
|
|
Options.OptimizationLevel := 1
|
|
else if (radOptLevel2.Checked) then
|
|
Options.OptimizationLevel := 2
|
|
else if (radOptLevel3.Checked) then
|
|
Options.OptimizationLevel := 3
|
|
else
|
|
Options.OptimizationLevel := 0;
|
|
|
|
// linking
|
|
Options.GenerateDebugInfo := chkDebugGDB.Checked;
|
|
Options.UseLineInfoUnit := chkUseLineInfoUnit.Checked;
|
|
Options.GenerateDwarf := chkGenerateDwarf.Checked;
|
|
Options.UseHeaptrc := chkUseHeaptrc.Checked;
|
|
Options.UseValgrind := chkUseValgrind.Checked;
|
|
Options.GenGProfCode := chkGenGProfCode.Checked;
|
|
Options.StripSymbols := chkSymbolsStrip.Checked;
|
|
Options.UseExternalDbgSyms := chkUseExternalDbgSyms.Checked;
|
|
|
|
Options.PassLinkerOptions := chkOptionsLinkOpt.Checked;
|
|
Options.LinkerOptions := edtOptionsLinkOpt.Text;
|
|
Options.Win32GraphicApp := chkWin32GraphicApp.Checked;
|
|
Options.LinkSmart := chkLinkSmart.Checked;
|
|
|
|
// messages
|
|
with grpVerbosity do
|
|
begin
|
|
Options.ShowErrors := Checked[0];
|
|
Options.ShowHintsForSenderNotUsed := Checked[1];
|
|
Options.ShowWarn := Checked[2];
|
|
Options.ShowDebugInfo := Checked[3];
|
|
Options.ShowNotes := Checked[4];
|
|
Options.ShowUsedFiles := Checked[5];
|
|
Options.ShowHints := Checked[6];
|
|
Options.ShowTriedFiles := Checked[7];
|
|
Options.ShowGenInfo := Checked[8];
|
|
Options.ShowDefMacros := Checked[9];
|
|
Options.ShowLineNum := Checked[10];
|
|
Options.ShowCompProc := Checked[11];
|
|
Options.ShowAllProcsOnError := Checked[12];
|
|
Options.ShowCond := Checked[13];
|
|
Options.ShowAll := Checked[14];
|
|
Options.ShowExecInfo := Checked[15];
|
|
Options.ShowSummary := Checked[16];
|
|
Options.ShowNothing := Checked[17];
|
|
Options.ShowHintsForUnusedUnitsInMainSrc := Checked[18];
|
|
Options.WriteFPCLogo := Checked[19];
|
|
end;
|
|
|
|
// compiler messages
|
|
Options.UseMsgFile := chkUseMsgFile.Checked;
|
|
Options.MsgFileName := editMsgFileName.Caption;
|
|
Options.CompilerMessages.Assign(TempMessages);
|
|
|
|
// conditionals
|
|
BuildMacrosFrame.SaveToOptions(Options);
|
|
|
|
// other
|
|
Options.DontUseConfigFile := not chkConfigFile.Checked;
|
|
Options.CustomConfigFile := chkCustomConfigFile.Checked;
|
|
Options.ConfigFilePath := edtConfigPath.Text;
|
|
Options.CustomOptions := memCustomOptions.Text;
|
|
|
|
Options.StopAfterErrCount := StrToIntDef(edtErrorCnt.Text,1);
|
|
|
|
// compilation
|
|
Options.CreateMakefileOnBuild := chkCreateMakefile.Checked;
|
|
|
|
Options.ExecuteBefore.Command := ExecuteBeforeCommandEdit.Text;
|
|
Options.ExecuteBefore.ScanForFPCMessages :=
|
|
ExecuteBeforeScanFPCCheckBox.Checked;
|
|
Options.ExecuteBefore.ScanForMakeMessages :=
|
|
ExecuteBeforeScanMakeCheckBox.Checked;
|
|
Options.ExecuteBefore.ShowAllMessages:=ExecuteBeforeShowAllCheckBox.Checked;
|
|
if Options.ExecuteBefore is TProjectCompilationToolOptions
|
|
then begin
|
|
TProjectCompilationToolOptions(Options.ExecuteBefore).CompileReasons :=
|
|
MakeCompileReasons(
|
|
chkExecBeforeCompile,
|
|
chkExecBeforeBuild,
|
|
chkExecBeforeRun
|
|
);
|
|
end;
|
|
|
|
Options.CompilerPath := edtCompiler.Text;
|
|
if Options is TProjectCompilerOptions
|
|
then begin
|
|
TProjectCompilerOptions(Options).CompileReasons := MakeCompileReasons(
|
|
chkCompilerCompile,
|
|
chkCompilerBuild,
|
|
chkCompilerRun
|
|
);
|
|
end
|
|
else if Options is TPkgCompilerOptions
|
|
then begin
|
|
TPkgCompilerOptions(Options).SkipCompiler := chkCompilerCompile.Checked;
|
|
end;
|
|
|
|
Options.ExecuteAfter.Command := ExecuteAfterCommandEdit.Text;
|
|
Options.ExecuteAfter.ScanForFPCMessages :=
|
|
ExecuteAfterScanFPCCheckBox.Checked;
|
|
Options.ExecuteAfter.ScanForMakeMessages :=
|
|
ExecuteAfterScanMakeCheckBox.Checked;
|
|
Options.ExecuteAfter.ShowAllMessages:=ExecuteAfterShowAllCheckBox.Checked;
|
|
if Options.ExecuteAfter is TProjectCompilationToolOptions
|
|
then begin
|
|
TProjectCompilationToolOptions(Options.ExecuteAfter).CompileReasons :=
|
|
MakeCompileReasons(
|
|
chkExecAfterCompile,
|
|
chkExecAfterBuild,
|
|
chkExecAfterRun
|
|
);
|
|
end;
|
|
|
|
// check for change and mark as modified
|
|
if not OldCompOpts.IsEqual(Options) then begin
|
|
//Diff:=TStringList.Create;
|
|
//options.CreateDiff(OldCompOpts,Diff);
|
|
//debugln(Diff.Text);
|
|
//Diff.Free;
|
|
Options.Modified:=true;
|
|
IncreaseCompilerParseStamp;
|
|
end;
|
|
Result:=true;
|
|
finally
|
|
if not Result then begin
|
|
Options.Assign(OldCompOpts);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TfrmCompilerOptions.SaveFormToOptions(
|
|
CheckAndWarn: TCheckCompileOptionsMsgLvl): boolean;
|
|
begin
|
|
Result:=SaveFormToOptions(CheckAndWarn,nil);
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.UpdateInheritedTab;
|
|
var
|
|
OptionsList: TFPList;
|
|
i: Integer;
|
|
AncestorOptions: TAdditionalCompilerOptions;
|
|
AncestorNode: TTreeNode;
|
|
|
|
procedure AddChildNode(const NewNodeName, Value: string;
|
|
Option: TInheritedCompilerOption);
|
|
var
|
|
VisibleValue: String;
|
|
ChildNode: TTreeNode;
|
|
ChildData: PInheritedNodeData;
|
|
begin
|
|
if Value='' then exit;
|
|
New(ChildData);
|
|
ChildData^.FullText:=Value;
|
|
ChildData^.Option:=Option;
|
|
if InheritedChildDatas=nil then InheritedChildDatas:=TList.Create;
|
|
InheritedChildDatas.Add(ChildData);
|
|
|
|
if length(Value)>100 then
|
|
VisibleValue:=copy(Value,1,100)+'[...]'
|
|
else
|
|
VisibleValue:=Value;
|
|
ChildNode:=InhTreeView.Items.AddChildObject(AncestorNode,
|
|
NewNodeName+' = "'+VisibleValue+'"',ChildData);
|
|
ChildNode.ImageIndex:=ImageIndexRequired;
|
|
ChildNode.SelectedIndex:=ChildNode.ImageIndex;
|
|
end;
|
|
|
|
begin
|
|
OptionsList:=nil;
|
|
CompilerOpts.GetInheritedCompilerOptions(OptionsList);
|
|
InhTreeView.BeginUpdate;
|
|
ClearInheritedTree;
|
|
if OptionsList<>nil then begin
|
|
// add All node
|
|
AncestorNode:=InhTreeView.Items.Add(nil,lisAllInheritedOptions);
|
|
AncestorNode.ImageIndex:=ImageIndexInherited;
|
|
AncestorNode.SelectedIndex:=AncestorNode.ImageIndex;
|
|
with CompilerOpts do begin
|
|
AddChildNode(lisunitPath,
|
|
GetInheritedOption(icoUnitPath,true),icoUnitPath);
|
|
AddChildNode(lisincludePath,
|
|
GetInheritedOption(icoIncludePath,true),icoIncludePath);
|
|
AddChildNode(lisobjectPath,
|
|
GetInheritedOption(icoObjectPath,true),icoObjectPath);
|
|
AddChildNode(lislibraryPath,
|
|
GetInheritedOption(icoLibraryPath,true),icoLibraryPath);
|
|
AddChildNode(lislinkerOptions,GetInheritedOption(icoLinkerOptions,true),
|
|
icoLinkerOptions);
|
|
AddChildNode(liscustomOptions,GetInheritedOption(icoCustomOptions,true),
|
|
icoCustomOptions);
|
|
end;
|
|
AncestorNode.Expanded:=true;
|
|
// add detail nodes
|
|
for i:=0 to OptionsList.Count-1 do begin
|
|
AncestorOptions:=TAdditionalCompilerOptions(OptionsList[i]);
|
|
AncestorNode:=InhTreeView.Items.Add(nil,'');
|
|
AncestorNode.Text:=AncestorOptions.GetOwnerName;
|
|
AncestorNode.ImageIndex:=ImageIndexPackage;
|
|
AncestorNode.SelectedIndex:=AncestorNode.ImageIndex;
|
|
with AncestorOptions.ParsedOpts do begin
|
|
AddChildNode(lisunitPath,
|
|
CreateRelativeSearchPath(GetParsedValue(pcosUnitPath),
|
|
CompilerOpts.BaseDirectory),
|
|
icoUnitPath);
|
|
AddChildNode(lisincludePath,
|
|
CreateRelativeSearchPath(GetParsedValue(pcosIncludePath),
|
|
CompilerOpts.BaseDirectory),
|
|
icoIncludePath);
|
|
AddChildNode(lisobjectPath,
|
|
CreateRelativeSearchPath(GetParsedValue(pcosObjectPath),
|
|
CompilerOpts.BaseDirectory),
|
|
icoObjectPath);
|
|
AddChildNode(lislibraryPath,
|
|
CreateRelativeSearchPath(GetParsedValue(pcosLibraryPath),
|
|
CompilerOpts.BaseDirectory),
|
|
icoLibraryPath);
|
|
AddChildNode(lislinkerOptions, GetParsedValue(pcosLinkerOptions),
|
|
icoLinkerOptions);
|
|
AddChildNode(liscustomOptions, GetParsedValue(pcosCustomOptions),
|
|
icoCustomOptions);
|
|
end;
|
|
AncestorNode.Expanded:=true;
|
|
end;
|
|
OptionsList.Free;
|
|
end else begin
|
|
InhTreeView.Items.Add(nil, lisNoCompilerOptionsInherited);
|
|
end;
|
|
InhTreeView.EndUpdate;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.ClearInheritedTree;
|
|
var
|
|
i: Integer;
|
|
ChildData: PInheritedNodeData;
|
|
begin
|
|
if InhTreeView=nil then exit;
|
|
InhTreeView.BeginUpdate;
|
|
// dispose all child data
|
|
if InheritedChildDatas<>nil then begin
|
|
for i:=0 to InheritedChildDatas.Count-1 do begin
|
|
ChildData:=PInheritedNodeData(InheritedChildDatas[i]);
|
|
Dispose(ChildData);
|
|
end;
|
|
InheritedChildDatas.Free;
|
|
InheritedChildDatas:=nil;
|
|
end;
|
|
InhTreeView.Items.Clear;
|
|
InhTreeView.EndUpdate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupParsingTab
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupParsingTab(Page: integer);
|
|
var
|
|
m: TCompilerMode;
|
|
s: String;
|
|
begin
|
|
MainNoteBook.Page[Page].Caption:= dlgCOParsing;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
// Setup the Parsing Tab
|
|
with grpAsmStyle do begin
|
|
Caption := dlgCOAsmStyle+' (-R)';
|
|
|
|
with Items do begin
|
|
BeginUpdate;
|
|
Add(dlgAssemblerDefault);
|
|
Add('Intel');
|
|
Add('AT&&T');
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
with grpSyntaxOptions do begin
|
|
AutoSize:=true;
|
|
Caption := dlgSyntaxOptions;
|
|
|
|
Items.Add(dlgCOCOps+' (-Sc)');
|
|
Items.Add(dlgAssertCode+' (-Sa)');
|
|
Items.Add(dlgLabelGoto+' (-Sg)');
|
|
Items.Add(dlgCppInline+' (-Si)');
|
|
Items.Add(dlgCMacro+' (-Sm)');
|
|
Items.Add(dlgInitDoneOnly+' (-Ss)');
|
|
Items.Add(dlgStaticKeyword+' (-St)');
|
|
Items.Add(dlgCOAnsiStr+' (-Sh)');
|
|
end;
|
|
|
|
grpSyntaxMode.Caption:=lisSyntaxMode+' (-M)';
|
|
cmbSyntaxMode.Items.BeginUpdate;
|
|
cmbSyntaxMode.Items.Clear;
|
|
for m:=Low(TCompilerMode) to High(TCompilerMode) do begin
|
|
s:=SyntaxModeToCaption(CompilerModeNames[m]);
|
|
if s<>'' then
|
|
cmbSyntaxMode.Items.Add(s);
|
|
end;
|
|
cmbSyntaxMode.Items.EndUpdate;
|
|
end;
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupCodeGenerationTab
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupCodeGenerationTab(Page: integer);
|
|
begin
|
|
// Setup the Code Generation Tab
|
|
MainNoteBook.Page[Page].Caption:= dlgCodeGeneration;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
grpSmartLinkUnit.Caption := dlgCOUnitStyle;
|
|
chkSmartLinkUnit.Caption := dlgCOSmartLinkable + ' (-CX)';
|
|
|
|
grpChecks.Caption := dlgCOChecks;
|
|
chkChecksIO.Caption := 'I/O (-Ci)';
|
|
chkChecksRange.Caption := dlgCORange+' (-Cr)';
|
|
chkChecksOverflow.Caption := dlgCOOverflow+' (-Co)';
|
|
chkChecksStack.Caption := dlgCOStack+' (-Ct)';
|
|
chkVerifyObjMethodCall.Caption := lisVerifyMethodCalls+' (-CR)';
|
|
|
|
grpHeapSize.Caption := dlgHeapSize +' (-Ch):';
|
|
edtHeapSize.Text := '';
|
|
|
|
grpTargetPlatform.Caption := dlgTargetPlatform;
|
|
lblTargetOS.Caption := dlgTargetOS+' (-T)';
|
|
|
|
with TargetOSComboBox do
|
|
begin
|
|
with Items do begin
|
|
Add('('+rsiwpDefault+')');
|
|
Add('Darwin');
|
|
Add('FreeBSD');
|
|
Add('Linux');
|
|
Add('NetBSD');
|
|
Add('OpenBSD');
|
|
Add('Solaris');
|
|
Add('Win32');
|
|
Add('Win64');
|
|
Add('WinCE');
|
|
Add('go32v2');
|
|
Add('os2');
|
|
Add('beos');
|
|
Add('haiku');
|
|
Add('qnx');
|
|
Add('netware');
|
|
Add('wdosx');
|
|
Add('emx');
|
|
Add('watcom');
|
|
Add('netwlibc');
|
|
Add('amiga');
|
|
Add('atari');
|
|
Add('palmos');
|
|
Add('gba');
|
|
Add('nds');
|
|
Add('macos');
|
|
Add('morphos');
|
|
Add('embedded');
|
|
Add('symbian');
|
|
end;
|
|
ItemIndex:=0;
|
|
end;
|
|
|
|
lblTargetCPU.Caption :=dlgTargetCPUFamily+' (-P)';
|
|
|
|
with TargetCPUComboBox do begin
|
|
with Items do begin
|
|
Add('('+rsiwpDefault+')');
|
|
Add('arm');
|
|
Add('i386');
|
|
Add('m68k');
|
|
Add('powerpc');
|
|
Add('sparc');
|
|
Add('x86_64');
|
|
end;
|
|
ItemIndex:=0;
|
|
end;
|
|
|
|
lblTargetProcessorProc.Caption := dlgTargetProc;
|
|
|
|
with TargetProcessorProcComboBox do begin
|
|
with Items do begin
|
|
Clear;
|
|
Add(ProcessorToCaption(''));
|
|
Add(ProcessorToCaption('386'));
|
|
Add(ProcessorToCaption('Pentium'));
|
|
Add(ProcessorToCaption('Pentium2'));
|
|
Add(ProcessorToCaption('Pentium3'));
|
|
Add(ProcessorToCaption('Pentium4'));
|
|
Add(ProcessorToCaption('PentiumM'));
|
|
end;
|
|
ItemIndex:=0;
|
|
end;
|
|
|
|
grpOptimizations.Caption := dlgOptimiz;
|
|
radOptLevelNone.Caption := dlgLevelNoneOpt+' (none)';
|
|
radOptLevel1.Caption := dlgLevel1Opt+' (-O1)';
|
|
radOptLevel2.Caption := dlgLevel2Opt+' (-O2)';
|
|
radOptLevel3.Caption := dlgLevel3Opt+' (-O3)';
|
|
chkOptVarsInReg.Caption := dlgCOKeepVarsReg+' (-Or)';
|
|
chkOptUncertain.Caption := dlgUncertOpt+' (-Ou)';
|
|
chkOptSmaller.Caption := lisSmallerRatherThanFaster+' (-Os)';
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupLinkingTab
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupLinkingTab(Page: integer);
|
|
begin
|
|
MainNoteBook.Page[Page].Caption:= dlgCOLinking;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
// Setup the Linking Tab
|
|
with grpDebugging do begin
|
|
AutoSize:=true;
|
|
Caption := dlgCODebugging;
|
|
end;
|
|
|
|
chkDebugGDB.Caption := dlgCOGDB+' (-g)';
|
|
chkUseLineInfoUnit.Caption := dlgLNumsBct+' (-gl)';
|
|
chkGenerateDwarf.Caption := dlgGenerateDwarf + '(-gw)';
|
|
chkUseHeaptrc.Caption := dlgCOHeaptrc+' (-gh)';
|
|
chkUseValgrind.Caption := dlgCOValgrind+' (-gv)';
|
|
chkGenGProfCode.Caption := dlgGPROF+' (-pg)';
|
|
chkSymbolsStrip.Caption := dlgCOStrip+' (-Xs)';
|
|
chkUseExternalDbgSyms.Caption := dlgExtSymb +' (-Xg)';
|
|
|
|
grpLinkLibraries.Caption := dlgLinkLibraries;
|
|
chkLinkSmart.Caption := dlgLinkSmart+' (-XX)';
|
|
|
|
TargetSpecificsGrpBox.Caption := lisCOTargetOSSpecificOptions;
|
|
chkWin32GraphicApp.Caption := dlgWin32GUIApp+' (-WG)';
|
|
|
|
grpOptions.Caption := dlgCOOpts+' (-k)';
|
|
chkOptionsLinkOpt.Caption := dlgPassOptsLinker;
|
|
edtOptionsLinkOpt.Text := '';
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupVerbosityTab
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupVerbosityTab(Page: integer);
|
|
begin
|
|
// Setup the Messages Tab
|
|
MainNoteBook.Page[Page].Caption:= dlgCOVerbosity;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
with grpVerbosity do begin
|
|
Caption := dlgVerbosity;
|
|
AutoSize:=true;
|
|
|
|
Items.Add(dlgCOShowErr+' (-ve)');
|
|
Items.Add(dlgHintsParameterSenderNotUsed+' (none)');
|
|
Items.Add(dlgShowWarnings+' (-vw)');
|
|
Items.Add(dlgShowDebugInfo+' (-vd)');
|
|
Items.Add(dlgShowNotes+' (-vn)');
|
|
Items.Add(dlgShowUsedFiles+' (-vu)');
|
|
Items.Add(dlgShowHint+' (-vh)');
|
|
Items.Add(dlgShowTriedFiles+' (-vt)');
|
|
Items.Add(dlgShowGeneralInfo+' (-vi)');
|
|
Items.Add(dlgShowDefinedMacros+' (-vm)');
|
|
Items.Add(dlgShowCompilingLineNumbers+' (-vl)');
|
|
Items.Add(dlgShowCompiledProcedures+' (-vp)');
|
|
Items.Add(dlgShowProcsError+' (-vb)');
|
|
Items.Add(dlgShowConditionals+' (-vc)');
|
|
Items.Add(dlgShowEverything+' (-va)');
|
|
Items.Add(dlgShowExecutableInfo+' (-vx)');
|
|
Items.Add(dlgShowSummary+' (none)');
|
|
Items.Add(dlgShowNothing+' (-v0)');
|
|
Items.Add(dlgHintsUnused+' (none)');
|
|
Items.Add(dlgWriteFPCLogo+' (-l)');
|
|
end;
|
|
|
|
grpErrorCnt.Caption := dlgStopAfterNrErr+' (-Se)';
|
|
edtErrorCnt.Text := '';
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetupOtherTab(Page: integer);
|
|
begin
|
|
MainNoteBook.Page[Page].Caption:= dlgCOOther;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
grpConfigFile.Caption := dlgConfigFiles;
|
|
chkConfigFile.Caption := dlgUseFpcCfg+' (If not checked: -n)';
|
|
chkCustomConfigFile.Caption := dlgUseCustomConfig+' (@)';
|
|
edtConfigPath.Text := '';
|
|
|
|
grpCustomOptions.Caption:=lisCustomOptions2;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetupMacrosTab(Page: integer);
|
|
begin
|
|
MacrosPage:=MainNoteBook.Pages[Page];
|
|
MacrosPage.Caption:='Build macros';
|
|
{$IFDEF EnableBuildModes}
|
|
CategoryTreeView.Items.AddObject(nil,MacrosPage.Caption,MacrosPage);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TfrmCompilerOptions.SetupInheritedTab(Page: integer);
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupInheritedTab(Page: integer);
|
|
begin
|
|
MainNoteBook.Page[Page].Caption:= dlgCOInherited;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
InhNoteLabel.Caption:=lisAdditionalCompilerOptionsInheritedFromPackages;
|
|
|
|
with InhTreeView do begin
|
|
Options:=Options+[tvoReadOnly, tvoRightClickSelect, tvoShowRoot,
|
|
tvoKeepCollapsedNodes];
|
|
Images := IDEImages.Images_16;
|
|
end;
|
|
|
|
InhItemMemo.Text:=lisSelectANode;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetupCompilationTab(Page: integer);
|
|
// the real edit width is calculated in the groupbox resize
|
|
// here the controls are given initial sizes to avoid jumpy controls
|
|
|
|
begin
|
|
MainNoteBook.Page[Page].Caption:= dlgCOCompilation;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
chkCreateMakefile.Caption := dlgCOCreateMakefile;
|
|
|
|
ExecuteBeforeGroupBox.Caption := lisCOExecuteBefore;
|
|
chkExecBeforeBuild.Caption := lisCOCallOnBuild;
|
|
chkExecBeforeCompile.Caption := lisCOCallOnCompile;
|
|
chkExecBeforeRun.Caption := lisCOCallOnRun;
|
|
ExecuteBeforeCommandEdit.Text:='';
|
|
ExecuteBeforeCommandLabel.Caption:=lisCOCommand;
|
|
ExecuteBeforeScanFPCCheckBox.Caption := lisCOScanForFPCMessages;
|
|
ExecuteBeforeScanMakeCheckBox.Caption := lisCOScanForMakeMessages;
|
|
ExecuteBeforeShowAllCheckBox.Caption := lisCOShowAllMessages;
|
|
lblRunIfExecBefore.Caption := lisCOCallOn;
|
|
|
|
grpCompiler.Caption := lisCompiler;
|
|
chkCompilerBuild.Caption := lisCOCallOnBuild;
|
|
chkCompilerBuild.Checked := True;
|
|
chkCompilerCompile.Caption := lisCOCallOnCompile;
|
|
chkCompilerCompile.Checked := True;
|
|
chkCompilerRun.Caption := lisCOCallOnRun;
|
|
chkCompilerRun.Checked := True;
|
|
edtCompiler.Text:='';
|
|
lblCompiler.Caption:=lisCOCommand;
|
|
lblRunIfCompiler.Caption := lisCOCallOn;
|
|
|
|
ExecuteAfterGroupBox.Caption := lisCOExecuteAfter;
|
|
chkExecAfterBuild.Caption := lisCOCallOnBuild;
|
|
chkExecAfterCompile.Caption := lisCOCallOnCompile;
|
|
chkExecAfterRun.Caption := lisCOCallOnRun;
|
|
ExecuteAfterCommandEdit.Text:='';
|
|
ExecuteAfterCommandLabel.Caption:=lisCOCommand;
|
|
ExecuteAfterScanFPCCheckBox.Caption := lisCOScanForFPCMessages;
|
|
ExecuteAfterScanMakeCheckBox.Caption := lisCOScanForMakeMessages;
|
|
ExecuteAfterShowAllCheckBox.Caption := lisCOShowAllMessages;
|
|
lblRunIfExecAfter.Caption := lisCOCallOn;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupSearchPathsTab
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupSearchPathsTab(Page: integer);
|
|
var
|
|
LCLInterface: TLCLPlatform;
|
|
s: String;
|
|
begin
|
|
// Setup the Search Paths Tab
|
|
MainNoteBook.Page[Page].Caption:= dlgSearchPaths;
|
|
fPathsTVNode:=CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
lblOtherUnits.Caption := dlgOtherUnitFiles;
|
|
OtherUnitsPathEditBtn:=TPathEditorButton.Create(Self);
|
|
with OtherUnitsPathEditBtn do begin
|
|
Name:='OtherUnitsPathEditBtn';
|
|
Caption:='...';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtOtherUnits);
|
|
AnchorParallel(akBottom,0,edtOtherUnits);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
OnClick:=@PathEditBtnClick;
|
|
OnExecuted:=@PathEditBtnExecuted;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtOtherUnits.AnchorToNeighbour(akRight,0,OtherUnitsPathEditBtn);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
lblIncludeFiles.Caption := dlgCOIncFiles;
|
|
IncludeFilesPathEditBtn:=TPathEditorButton.Create(Self);
|
|
with IncludeFilesPathEditBtn do begin
|
|
Name:='IncludeFilesPathEditBtn';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtIncludeFiles);
|
|
AnchorParallel(akBottom,0,edtIncludeFiles);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
Caption:='...';
|
|
OnClick:=@PathEditBtnClick;
|
|
OnExecuted:=@PathEditBtnExecuted;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtIncludeFiles.AnchorToNeighbour(akRight,0,IncludeFilesPathEditBtn);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
lblOtherSources.Caption := dlgCOSources;
|
|
OtherSourcesPathEditBtn:=TPathEditorButton.Create(Self);
|
|
with OtherSourcesPathEditBtn do begin
|
|
Name:='OtherSourcesPathEditBtn';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtOtherSources);
|
|
AnchorParallel(akBottom,0,edtOtherSources);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
Caption:='...';
|
|
OnClick:=@PathEditBtnClick;
|
|
OnExecuted:=@PathEditBtnExecuted;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtOtherSources.AnchorToNeighbour(akRight,0,OtherSourcesPathEditBtn);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
lblLibraries.Caption := dlgCOLibraries;
|
|
LibrariesPathEditBtn:=TPathEditorButton.Create(Self);
|
|
with LibrariesPathEditBtn do begin
|
|
Name:='LibrariesPathEditBtn';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtLibraries);
|
|
AnchorParallel(akBottom,0,edtLibraries);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
Caption:='...';
|
|
OnClick:=@PathEditBtnClick;
|
|
OnExecuted:=@PathEditBtnExecuted;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtLibraries.AnchorToNeighbour(akRight,0,LibrariesPathEditBtn);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
lblUnitOutputDir.Caption := dlgUnitOutp;
|
|
btnUnitOutputDir:=TButton.Create(Self);
|
|
with btnUnitOutputDir do begin
|
|
Name:='btnUnitOutputDir';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtUnitOutputDir);
|
|
AnchorParallel(akBottom,0,edtUnitOutputDir);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
Caption:='...';
|
|
OnClick:=@FileBrowseBtnClick;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtUnitOutputDir.AnchorToNeighbour(akRight,0,btnUnitOutputDir);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
lblDebugPath.Caption := dlgCODebugPath;
|
|
DebugPathEditBtn:=TPathEditorButton.Create(Self);
|
|
with DebugPathEditBtn do begin
|
|
Name:='DebugPathEditBtn';
|
|
Anchors:=[akRight,akTop,akBottom];
|
|
AnchorParallel(akTop,0,edtDebugPath);
|
|
AnchorParallel(akBottom,0,edtDebugPath);
|
|
AnchorParallel(akRight,6,PathPage);
|
|
AutoSize:=true;
|
|
Caption:='...';
|
|
OnClick:=@PathEditBtnClick;
|
|
OnExecuted:=@PathEditBtnExecuted;
|
|
Parent:=PathPage;
|
|
end;
|
|
edtDebugPath.AnchorToNeighbour(akRight,0,DebugPathEditBtn);
|
|
|
|
{------------------------------------------------------------}
|
|
|
|
LCLWidgetTypeLabel.Caption:=Format(lisCOVarious, [lisLCLWidgetType]);
|
|
with LCLWidgetTypeComboBox do begin
|
|
with Items do begin
|
|
BeginUpdate;
|
|
s:=LCLPlatformDisplayNames[GetDefaultLCLWidgetType];
|
|
Add(Format(lisCOdefault,[s]));
|
|
for LCLInterface:=Low(TLCLPlatform) to High(TLCLPlatform) do begin
|
|
Items.Add(LCLPlatformDisplayNames[LCLInterface]);
|
|
end;
|
|
EndUpdate;
|
|
end;
|
|
ItemIndex:=1;
|
|
Constraints.MinWidth:=150;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetupBuildModesTab(Page: integer);
|
|
begin
|
|
// Setup the Build Modes Tab
|
|
MainNoteBook.Page[Page].Caption:='Build modes';
|
|
{$IFDEF EnableBuildModes}
|
|
fBuildModesTVNode:=CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
{$ENDIF}
|
|
|
|
fBuildModeFrame:=TBuildModesEditorFrame.Create(Self);
|
|
fBuildModeFrame.Setup(nil);
|
|
with fBuildModeFrame do begin
|
|
Name:='fBuildModeFrame';
|
|
Align:=alClient;
|
|
Parent:=BuildModesPage;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TfrmCompilerOptions SetupButtonBar
|
|
------------------------------------------------------------------------------}
|
|
procedure TfrmCompilerOptions.SetupButtonBar;
|
|
begin
|
|
// Setup the Button Bar
|
|
btnShowOptions.Caption := dlgCOShowOptions;
|
|
btnCheck.Caption := lisCompTest;
|
|
btnOK.Caption := lisOk;
|
|
btnCancel.Caption := dlgCancel;
|
|
btnCheck.Caption := dlgCCOTest;
|
|
HelpButton.Caption := lisMenuHelp;
|
|
btnLoadSave.Hint := dlgCOLoadSave;
|
|
btnLoadSave.Caption := '...';
|
|
btnLoadSave.LoadGlyphFromStock(idButtonSave);
|
|
if btnLoadSave.Glyph.Empty then
|
|
btnLoadSave.LoadGlyphFromLazarusResource('laz_save');
|
|
end;
|
|
|
|
function TfrmCompilerOptions.CheckSearchPath(const Context,
|
|
ExpandedPath: string; Level: TCheckCompileOptionsMsgLvl): boolean;
|
|
var
|
|
CurPath: String;
|
|
p: Integer;
|
|
HasChars: TCCOSpecialChars;
|
|
ErrorMsg: String;
|
|
begin
|
|
Result:=false;
|
|
|
|
//DebugLn(['TfrmCompilerOptions.CheckSearchPath Context=',Context,' ExpandedPath=',ExpandedPath,' Level=',ord(Level)]);
|
|
|
|
// check for *
|
|
if ord(Level)<=ord(ccomlHints) then begin
|
|
if System.Pos('*',ExpandedPath)>0 then begin
|
|
if MessageDlg('Hint','The '+Context+' contains a star * character.'#13
|
|
+'Lazarus uses this as normal character and does not expand this as file mask.',
|
|
mtWarning,[mbOk,mbCancel],0) <> mrOk then exit;
|
|
end;
|
|
end;
|
|
|
|
// check for non existing directories
|
|
if ord(Level)<=ord(ccomlWarning) then begin
|
|
p:=1;
|
|
repeat
|
|
//DebugLn(['CheckSearchPath ',ExpandedPath,' ',p,' ',length(ExpandedPath)]);
|
|
CurPath:=GetNextDirectoryInSearchPath(ExpandedPath,p);
|
|
if (CurPath<>'') and (not IDEMacros.StrHasMacros(CurPath))
|
|
and (FilenameIsAbsolute(CurPath)) then begin
|
|
if not DirPathExistsCached(CurPath) then begin
|
|
if MessageDlg('Warning','The '+Context+' contains a not existing directory:'#13
|
|
+CurPath,
|
|
mtWarning,[mbIgnore,mbCancel],0) <> mrIgnore then exit;
|
|
end;
|
|
end;
|
|
until p>length(ExpandedPath);
|
|
end;
|
|
|
|
// check for special characters
|
|
if (not IDEMacros.StrHasMacros(CurPath)) then begin
|
|
FindSpecialCharsInPath(ExpandedPath,HasChars);
|
|
if ord(Level)<=ord(ccomlWarning) then begin
|
|
if ord(Level)>=ord(ccomlErrors) then begin
|
|
ErrorMsg:=SpecialCharsToStr(HasChars*[ccoscSpecialChars,ccoscNewLine]);
|
|
end else begin
|
|
ErrorMsg:=SpecialCharsToStr(HasChars);
|
|
end;
|
|
if ErrorMsg<>'' then begin
|
|
if MessageDlg('Warning',Context+#13+ErrorMsg,
|
|
mtWarning,[mbOk,mbCancel],0) <> mrOk then exit;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
Result:=true;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.chkCustomConfigFileClick(Sender: TObject);
|
|
begin
|
|
edtConfigPath.Enabled:=chkCustomConfigFile.Checked;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.PathEditBtnClick(Sender: TObject);
|
|
var AButton: TPathEditorButton;
|
|
OldPath, Templates: string;
|
|
begin
|
|
if Sender is TPathEditorButton then begin
|
|
AButton:=TPathEditorButton(Sender);
|
|
if AButton=OtherUnitsPathEditBtn then begin
|
|
OldPath:=edtOtherUnits.Text;
|
|
Templates:=SetDirSeparators(
|
|
'$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)'
|
|
+';$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)'
|
|
+';$(LazarusDir)/components/codetools/units/$(TargetCPU)-$(TargetOS)'
|
|
+';$(LazarusDir)/components/custom'
|
|
+';$(LazarusDir)/packager/units/$(TargetCPU)-$(TargetOS)'
|
|
);
|
|
end else
|
|
if AButton=IncludeFilesPathEditBtn then begin
|
|
OldPath:=edtIncludeFiles.Text;
|
|
Templates:='include'
|
|
+';inc';
|
|
end else
|
|
if AButton=OtherSourcesPathEditBtn then begin
|
|
OldPath:=edtOtherSources.Text;
|
|
Templates:=SetDirSeparators(
|
|
'$(LazarusDir)/lcl'
|
|
+';$(LazarusDir)/lcl/interfaces/$(LCLWidgetType)'
|
|
+';$(LazarusDir)/components/synedit'
|
|
+';$(LazarusDir)/components/codetools'
|
|
);
|
|
end else
|
|
if AButton=LibrariesPathEditBtn then begin
|
|
OldPath:=edtLibraries.Text;
|
|
Templates:=SetDirSeparators('/usr/X11R6/lib;/sw/lib');
|
|
end else
|
|
if AButton=DebugPathEditBtn then begin
|
|
OldPath:=edtDebugPath.Text;
|
|
Templates:=SetDirSeparators(
|
|
'$(LazarusDir)/lcl/include'
|
|
+';$(LazarusDir)/lcl/interfaces/$(LCLWidgetType)'
|
|
+';$(LazarusDir)/include'
|
|
);
|
|
end else
|
|
exit;
|
|
AButton.CurrentPathEditor.BaseDirectory:=CompilerOpts.BaseDirectory;
|
|
AButton.CurrentPathEditor.Path:=OldPath;
|
|
AButton.CurrentPathEditor.Templates:=SetDirSeparators(Templates);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.PathEditBtnExecuted(Sender: TObject);
|
|
|
|
function CheckPath(const Context, NewPath: string): boolean;
|
|
var
|
|
ExpandedPath: String;
|
|
BaseDir: String;
|
|
begin
|
|
BaseDir:=CompilerOpts.BaseDirectory;
|
|
ExpandedPath:=TrimSearchPath(NewPath,BaseDir);
|
|
Result:=CheckSearchPath(Context,ExpandedPath,ccomlHints);
|
|
end;
|
|
|
|
var AButton: TPathEditorButton;
|
|
NewPath: string;
|
|
begin
|
|
if Sender is TPathEditorButton then begin
|
|
AButton:=TPathEditorButton(Sender);
|
|
if AButton.CurrentPathEditor.ModalResult<>mrOk then exit;
|
|
NewPath:=AButton.CurrentPathEditor.Path;
|
|
if CompilerOpts<>nil then
|
|
NewPath:=CompilerOpts.ShortenPath(NewPath,false);
|
|
if AButton=OtherUnitsPathEditBtn then begin
|
|
if CheckPath(lblOtherUnits.Caption,NewPath) then
|
|
edtOtherUnits.Text:=NewPath;
|
|
end else
|
|
if AButton=IncludeFilesPathEditBtn then begin
|
|
if CheckPath(lblIncludeFiles.Caption,NewPath) then
|
|
edtIncludeFiles.Text:=NewPath;
|
|
end else
|
|
if AButton=OtherSourcesPathEditBtn then begin
|
|
if CheckPath(lblOtherSources.Caption,NewPath) then
|
|
edtOtherSources.Text:=NewPath;
|
|
end else
|
|
if AButton=LibrariesPathEditBtn then begin
|
|
if CheckPath(lblLibraries.Caption,NewPath) then
|
|
edtLibraries.Text:=NewPath;
|
|
end else
|
|
if AButton=DebugPathEditBtn then begin
|
|
if CheckPath(lblDebugPath.Caption,NewPath) then
|
|
edtDebugPath.Text:=NewPath;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.frmCompilerOptionsClose(Sender: TObject;
|
|
var CloseAction: TCloseAction);
|
|
begin
|
|
IDEDialogLayoutList.SaveLayout(Self);
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetReadOnly(const AValue: boolean);
|
|
begin
|
|
if FReadOnly=AValue then exit;
|
|
FReadOnly:=AValue;
|
|
btnOk.Enabled:=not FReadOnly;
|
|
btnCheck.Enabled:=not FReadOnly;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetupConfigMsgTab(Page: integer);
|
|
begin
|
|
MainNotebook.Page[Page].Caption := dlgCOCfgCmpMessages;
|
|
CategoryTreeView.Items.AddObject(nil,MainNoteBook.Page[Page].Caption,MainNoteBook.Page[Page]);
|
|
|
|
grpCompilerMessages.Caption := dlgCompilerMessage;
|
|
chkUseMsgFile.Caption := dlgUseMsgFile;
|
|
editMsgFileName.Caption := '';
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.chklistCompMsgClick(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i := 0 to chklistCompMsg.Count - 1 do
|
|
TCompilerMessageConfig(chklistCompMsg.Items.Objects[i]).Ignored := not chklistCompMsg.Checked[i];
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.chkUseMsgFileChange(Sender: TObject);
|
|
begin
|
|
SetCompilerMessages;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.btnBrowseMsgClick(Sender: TObject);
|
|
var
|
|
dlg : TOpenDialog;
|
|
begin
|
|
dlg := TOpenDialog.Create(Self);
|
|
try
|
|
dlg.Filter := dlgBrowseMsgFilter;
|
|
if not dlg.Execute then Exit;
|
|
editMsgFileName.Caption := dlg.FileName;
|
|
SetCompilerMessages;
|
|
finally
|
|
dlg.Free
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmCompilerOptions.SetCompilerMessages;
|
|
const
|
|
MaxIndexLen = 5;
|
|
var
|
|
i : Integer;
|
|
j : Integer;
|
|
topidx : Integer;
|
|
m : TCompilerMessageConfig;
|
|
|
|
const
|
|
//todo: should be translated
|
|
MsgTypeStr : array [TFPCErrorType] of String = ('-','H','N','W','E','F','P');
|
|
|
|
function IntToStrLen(idx, strlen: integer): string;
|
|
var
|
|
s : string;
|
|
begin
|
|
Result := IntToStr(idx);
|
|
if length(Result) < strlen then begin
|
|
SetLength(s, strlen - length(Result));
|
|
FillChar(s[1], length(s), '0');
|
|
Result := s + Result;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
topidx := chklistCompMsg.TopIndex;
|
|
chklistCompMsg.Items.BeginUpdate;
|
|
try
|
|
if chkUseMsgFile.Checked and FileExistsUTF8(editMsgFileName.Caption) and (editMsgFileName.Caption <> '') then begin
|
|
try
|
|
// FPC messages file is expected to be UTF8 encoded, no matter for the current code page is
|
|
TempMessages.LoadMsgFile(editMsgFileName.Caption);
|
|
except
|
|
TempMessages.SetDefault;
|
|
end;
|
|
end else
|
|
TempMessages.SetDefault;
|
|
|
|
chklistCompMsg.Clear;
|
|
chklistCompMsg.Items.Clear;
|
|
for i := 0 to TempMessages.Count - 1 do
|
|
begin
|
|
m := TempMessages.Msg[i];
|
|
if m.MsgType in [etNote, etHint, etWarning] then
|
|
begin
|
|
j := chklistCompMsg.Items.AddObject( Format('(%s) %s', [MsgTypeStr[m.MsgType], m.GetUserText]), m);
|
|
chklistCompMsg.Checked[j] := not m.Ignored;
|
|
end;
|
|
end;
|
|
|
|
finally
|
|
chklistCompMsg.Items.EndUpdate;
|
|
chkListCompMsg.TopIndex := topidx;
|
|
end;
|
|
end;
|
|
|
|
function TfrmCompilerOptions.GetUseAsDefault: Boolean;
|
|
begin
|
|
Result := chkUseAsDefault.Checked;
|
|
end;
|
|
|
|
end.
|