IDE/lazbuild: moved macros to TBuildManager

git-svn-id: trunk@9814 -
This commit is contained in:
mattias 2006-09-05 10:39:25 +00:00
parent 29c4abf8ee
commit 2e614998a5
7 changed files with 407 additions and 270 deletions

View File

@ -33,13 +33,49 @@ unit BaseBuildManager;
interface
uses
Classes, SysUtils;
Classes, SysUtils, Project;
type
{ TBaseBuildManager }
TBaseBuildManager = class
public
constructor Create;
destructor Destroy; override;
function GetTargetOS(UseCache: boolean): string; virtual; abstract;
function GetTargetCPU(UseCache: boolean): string; virtual; abstract;
function GetLCLWidgetType(UseCache: boolean): string; virtual; abstract;
function GetRunCommandLine: string; virtual; abstract;
function GetProjectPublishDir: string; virtual; abstract;
function GetProjectTargetFilename: string; virtual; abstract;
function GetTestProjectFilename: string; virtual; abstract;
function GetTestUnitFilename(AnUnitInfo: TUnitInfo): string; virtual; abstract;
function GetTestBuildDirectory: string; virtual; abstract;
function IsTestUnitFilename(const AFilename: string): boolean; virtual; abstract;
function GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string; virtual; abstract;
end;
var
BuildBoss: TBaseBuildManager = nil;
implementation
{ TBaseBuildManager }
constructor TBaseBuildManager.Create;
begin
BuildBoss:=Self;
inherited Create;
end;
destructor TBaseBuildManager.Destroy;
begin
inherited Destroy;
BuildBoss:=nil;
end;
end.

View File

@ -35,7 +35,7 @@ interface
uses
Classes, SysUtils,
// LCL
LCLProc, Dialogs,
LCLProc, Dialogs, FileUtil,
// codetools
CodeToolManager, DefineTemplates,
// IDEIntf
@ -59,9 +59,35 @@ type
var Abort: boolean): string;
function MacroFuncProject(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjectUnitPath(Data: Pointer): boolean;
function MacroFuncProjectIncPath(Data: Pointer): boolean;
function MacroFuncProjectSrcPath(Data: Pointer): boolean;
function MacroFuncLCLWidgetType(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncTargetCPU(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncTargetOS(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncParams(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjFile(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjPath(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncTargetFile(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncTargetCmdLine(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncRunCmdLine(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjPublishDir(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjUnitPath(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjIncPath(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function MacroFuncProjSrcPath(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
function CTMacroFuncProjectUnitPath(Data: Pointer): boolean;
function CTMacroFuncProjectIncPath(Data: Pointer): boolean;
function CTMacroFuncProjectSrcPath(Data: Pointer): boolean;
procedure OnCmdLineCreate(var CmdLine: string; var Abort: boolean);
protected
OverrideTargetOS: string;
@ -76,9 +102,18 @@ type
procedure SetupTransferMacros;
procedure SetupCompilerInterface;
function GetTargetOS(UseCache: boolean): string;
function GetTargetCPU(UseCache: boolean): string;
function GetLCLWidgetType(UseCache: boolean): string;
function GetTargetOS(UseCache: boolean): string; override;
function GetTargetCPU(UseCache: boolean): string; override;
function GetLCLWidgetType(UseCache: boolean): string; override;
function GetRunCommandLine: string; override;
function GetProjectPublishDir: string; override;
function GetProjectTargetFilename: string; override;
function GetTestProjectFilename: string; override;
function GetTestUnitFilename(AnUnitInfo: TUnitInfo): string; override;
function GetTestBuildDirectory: string; override;
function IsTestUnitFilename(const AFilename: string): boolean; override;
function GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string; override;
procedure GetFPCCompilerParamsForEnvironmentTest(out Params: string);
procedure RescanCompilerDefines(OnlyIfCompilerChanged: boolean);
@ -89,7 +124,7 @@ type
end;
var
BuildBoss: TBuildManager = nil;
MainBuildBoss: TBuildManager = nil;
TheCompiler: TCompiler = nil;
TheOutputFilter: TOutputFilter = nil;
@ -107,16 +142,20 @@ begin
GlobalMacroList.SubstituteStr(Result,CompilerOptionMacroPlatformIndependent)
else
GlobalMacroList.SubstituteStr(Result,CompilerOptionMacroNormal);
if System.Pos('CompPath',UnparsedValue)>0 then
DebugLn(['TBuildManager.OnSubstituteCompilerOption UnparsedValue="',UnparsedValue,'" Result="',Result,'" ',GlobalMacroList.FindByName('CompPath')<>nil]);
end;
constructor TBuildManager.Create;
begin
MainBuildBoss:=Self;
inherited Create;
end;
destructor TBuildManager.Destroy;
begin
inherited Destroy;
MainBuildBoss:=nil;
end;
procedure TBuildManager.SetupTransferMacros;
@ -132,15 +171,41 @@ begin
GlobalMacroList.Add(TTransferMacro.Create('MakeExe','',
lisMakeExe,@MacroFuncMakeExe,[]));
GlobalMacroList.Add(TTransferMacro.Create('Project','',
lisProjectMacroProperties,@MacroFuncProject,[]));
lisProjectMacroProperties,@MacroFuncProject,[]));
GlobalMacroList.Add(TTransferMacro.Create('LCLWidgetType','',
lisLCLWidgetType,@MacroFuncLCLWidgetType,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetCPU','',
lisTargetCPU,@MacroFuncTargetCPU,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetOS','',
lisTargetOS,@MacroFuncTargetOS,[]));
GlobalMacroList.Add(TTransferMacro.Create('Params','',
lisCommandLineParamsOfProgram,@MacroFuncParams,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjFile','',
lisProjectFilename,@MacroFuncProjFile,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjPath','',
lisProjectDirectory,@MacroFuncProjPath,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetFile','',
lisTargetFilenameOfProject,@MacroFuncTargetFile,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetCmdLine','',
lisTargetFilenamePlusParams,@MacroFuncTargetCmdLine,[]));
GlobalMacroList.Add(TTransferMacro.Create('RunCmdLine','',
lisLaunchingCmdLine,@MacroFuncRunCmdLine,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjPublishDir','',
lisPublishProjDir,@MacroFuncProjPublishDir,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjUnitPath','',
lisProjectUnitPath,@MacroFuncProjUnitPath,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjIncPath','',
lisProjectIncPath,@MacroFuncProjIncPath,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjSrcPath','',
lisProjectSrcPath,@MacroFuncProjSrcPath,[]));
// codetools macro functions
CodeToolBoss.DefineTree.MacroFunctions.AddExtended(
'PROJECTUNITPATH',nil,@MacroFuncProjectUnitPath);
'PROJECTUNITPATH',nil,@CTMacroFuncProjectUnitPath);
CodeToolBoss.DefineTree.MacroFunctions.AddExtended(
'PROJECTINCPATH',nil,@MacroFuncProjectIncPath);
'PROJECTINCPATH',nil,@CTMacroFuncProjectIncPath);
CodeToolBoss.DefineTree.MacroFunctions.AddExtended(
'PROJECTSRCPATH',nil,@MacroFuncProjectSrcPath);
'PROJECTSRCPATH',nil,@CTMacroFuncProjectSrcPath);
end;
procedure TBuildManager.SetupCompilerInterface;
@ -194,6 +259,113 @@ begin
Result:=GetDefaultLCLWidgetType;
end;
function TBuildManager.GetRunCommandLine: string;
var
TargetFileName: string;
begin
if Project1.RunParameterOptions.UseLaunchingApplication then
Result := Project1.RunParameterOptions.LaunchingApplicationPathPlusParams
else
Result := '';
if Result=''
then begin
Result:=Project1.RunParameterOptions.CmdLineParams;
if GlobalMacroList.SubstituteStr(Result) then begin
TargetFileName:='"'+GetProjectTargetFilename+'"';
if Result='' then
Result:=TargetFileName
else
Result:=TargetFilename+' '+Result;
end else
Result:='';
end else begin
if not GlobalMacroList.SubstituteStr(Result) then Result:='';
end;
end;
function TBuildManager.GetProjectPublishDir: string;
begin
if Project1=nil then begin
Result:='';
exit;
end;
Result:=Project1.PublishOptions.DestinationDirectory;
if GlobalMacroList.SubstituteStr(Result) then begin
if FilenameIsAbsolute(Result) then begin
Result:=AppendPathDelim(TrimFilename(Result));
end else begin
Result:='';
end;
end else begin
Result:='';
end;
end;
function TBuildManager.GetProjectTargetFilename: string;
begin
Result:='';
if Project1=nil then exit;
Result:=Project1.RunParameterOptions.HostApplicationFilename;
if Result='' then begin
if Project1.IsVirtual then
Result:=GetTestProjectFilename
else begin
if Project1.MainUnitID>=0 then begin
Result:=
Project1.CompilerOptions.CreateTargetFilename(Project1.MainFilename)
end;
end;
end;
end;
function TBuildManager.GetTestProjectFilename: string;
begin
Result:='';
if Project1=nil then exit;
if (Project1.MainUnitID<0) then exit;
Result:=GetTestUnitFilename(Project1.MainUnitInfo);
if Result='' then exit;
Result:=Project1.CompilerOptions.CreateTargetFilename(Result);
end;
function TBuildManager.GetTestUnitFilename(AnUnitInfo: TUnitInfo): string;
var
TestDir: String;
begin
Result:='';
if AnUnitInfo=nil then exit;
TestDir:=GetTestBuildDirectory;
if TestDir='' then exit;
Result:=ExtractFilename(AnUnitInfo.Filename);
if Result='' then exit;
Result:=TestDir+Result;
end;
function TBuildManager.GetTestBuildDirectory: string;
begin
Result:=EnvironmentOptions.GetTestBuildDirectory;
end;
function TBuildManager.IsTestUnitFilename(const AFilename: string): boolean;
var
TestDir: string;
begin
Result:=false;
if Project1.IsVirtual then begin
TestDir:=GetTestBuildDirectory;
Result:=CompareFileNames(TestDir,ExtractFilePath(AFilename))=0;
end;
end;
function TBuildManager.GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string;
begin
if Project1.IsVirtual then
Result:=GetTestUnitFilename(AnUnitInfo)
else
Result:=AnUnitInfo.Filename;
end;
procedure TBuildManager.GetFPCCompilerParamsForEnvironmentTest(out
Params: string);
var
@ -349,7 +521,128 @@ begin
end;
end;
function TBuildManager.MacroFuncProjectUnitPath(Data: Pointer): boolean;
function TBuildManager.MacroFuncLCLWidgetType(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(LCL_PLATFORM)'
else
Result:=GetLCLWidgetType(true);
end;
function TBuildManager.MacroFuncTargetCPU(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(CPU_TARGET)'
else
Result:=GetTargetCPU(true);
end;
function TBuildManager.MacroFuncTargetOS(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(OS_TARGET)'
else
Result:=GetTargetOS(true);
end;
function TBuildManager.MacroFuncParams(const Param: string; const Data: PtrInt;
var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.RunParameterOptions.CmdLineParams
else
Result:='';
end;
function TBuildManager.MacroFuncProjFile(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.MainFilename
else
Result:='';
end;
function TBuildManager.MacroFuncProjPath(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.ProjectDirectory
else
Result:='';
end;
function TBuildManager.MacroFuncTargetFile(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=GetProjectTargetFilename
else
Result:='';
end;
function TBuildManager.MacroFuncTargetCmdLine(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then begin
Result:=Project1.RunParameterOptions.CmdLineParams;
if Result='' then
Result:=GetProjectTargetFilename
else
Result:=GetProjectTargetFilename+' '+Result;
end else
Result:='';
end;
function TBuildManager.MacroFuncRunCmdLine(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=GetRunCommandLine
else
Result:='';
end;
function TBuildManager.MacroFuncProjPublishDir(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=GetProjectPublishDir
else
Result:='';
end;
function TBuildManager.MacroFuncProjUnitPath(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.CompilerOptions.GetUnitPath(false)
else
Result:='';
end;
function TBuildManager.MacroFuncProjIncPath(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.CompilerOptions.GetIncludePath(false)
else
Result:='';
end;
function TBuildManager.MacroFuncProjSrcPath(const Param: string;
const Data: PtrInt; var Abort: boolean): string;
begin
if Project1<>nil then
Result:=Project1.CompilerOptions.GetSrcPath(false)
else
Result:='';
end;
function TBuildManager.CTMacroFuncProjectUnitPath(Data: Pointer): boolean;
var
FuncData: PReadFunctionData;
begin
@ -357,12 +650,11 @@ begin
Result:=false;
if Project1<>nil then begin
FuncData^.Result:=Project1.CompilerOptions.GetUnitPath(false);
//DebugLn('TMainIDE.MacroFuncProjectSrcPath "',FuncData^.Result,'"');
Result:=true;
end;
end;
function TBuildManager.MacroFuncProjectIncPath(Data: Pointer): boolean;
function TBuildManager.CTMacroFuncProjectIncPath(Data: Pointer): boolean;
var
FuncData: PReadFunctionData;
begin
@ -374,7 +666,7 @@ begin
end;
end;
function TBuildManager.MacroFuncProjectSrcPath(Data: Pointer): boolean;
function TBuildManager.CTMacroFuncProjectSrcPath(Data: Pointer): boolean;
var
FuncData: PReadFunctionData;
begin
@ -382,7 +674,6 @@ begin
Result:=false;
if Project1<>nil then begin
FuncData^.Result:=Project1.CompilerOptions.GetSrcPath(false);
//DebugLn('TMainIDE.OnMacroFuncProjectSrcPath "',FuncData^.Result,'"');
Result:=true;
end;
end;

View File

@ -49,11 +49,12 @@ uses
CompilerOptions, EditorOptions, EnvironmentOpts, KeyMapping, UnitEditor,
ProjectDefs, Project, IDEProcs, InputHistory, Debugger,
IDEOptionDefs, LazarusIDEStrConsts,
MainBar, MainIntf, MainBase, BaseDebugManager,
MainBar, MainIntf, MainBase, BaseBuildManager,
SourceMarks,
DebuggerDlg, Watchesdlg, BreakPointsdlg, LocalsDlg, WatchPropertyDlg,
CallStackDlg, EvaluateDlg, DBGOutputForm,
GDBMIDebugger, SSHGDBMIDebugger, ProcessDebugger;
GDBMIDebugger, SSHGDBMIDebugger, ProcessDebugger,
BaseDebugManager;
type
@ -1638,7 +1639,7 @@ begin
Result := False;
if (Project1.MainUnitID < 0) or Destroying then Exit;
LaunchingCmdLine := MainIDE.GetRunCommandLine;
LaunchingCmdLine := BuildBoss.GetRunCommandLine;
SplitCmdLine(LaunchingCmdLine,LaunchingApplication, LaunchingParams);
if not FileIsExecutable(LaunchingApplication)
then begin
@ -1719,7 +1720,7 @@ begin
Project1.RunParameterOptions.AssignEnvironmentTo(FDebugger.Environment);
NewWorkingDir:=Project1.RunParameterOptions.WorkingDirectory;
if NewWorkingDir='' then
NewWorkingDir:=ExtractFilePath(MainIDE.GetProjectTargetFilename);
NewWorkingDir:=ExtractFilePath(BuildBoss.GetProjectTargetFilename);
FDebugger.WorkingDir:=CleanAndExpandDirectory(NewWorkingDir);
// set filename after workingdir
FDebugger.FileName := LaunchingApplication;
@ -1937,7 +1938,7 @@ begin
if not ActiveUnitInfo.Source.IsVirtual
then UnitFilename:=ActiveUnitInfo.Filename
else UnitFilename:=MainIDE.GetTestUnitFilename(ActiveUnitInfo);
else UnitFilename:=BuildBoss.GetTestUnitFilename(ActiveUnitInfo);
DebugLn('TDebugManager.DoRunToCursor C');
FDebugger.RunTo(ExtractFilename(UnitFilename),

View File

@ -173,6 +173,7 @@ begin
APackage:=LoadPackage(AFilename);
if APackage=nil then
Error(ErrorLoadPackageFailed, 'unable to load package "'+AFilename+'"');
end;
function TLazBuildApplication.LoadPackage(const AFilename: string): TLazPackage;
@ -194,7 +195,8 @@ begin
end;
// check Package Name
if (Result.Name='') or (not IsValidIdent(Result.Name)) then begin
Error(ErrorPackageNameInvalid, Format(lisPkgMangThePackageNameOfTheFileIsInvalid,
Error(ErrorPackageNameInvalid,
Format(lisPkgMangThePackageNameOfTheFileIsInvalid,
['"', Result.Name,'"', #13, '"', Result.Filename, '"']));
end;
// check if Package with same name is already loaded
@ -220,7 +222,7 @@ begin
CreatePrimaryConfigPath;
BuildBoss:=TBuildManager.Create;
MainBuildBoss:=TBuildManager.Create;
LoadEnvironmentOptions;
InteractiveSetup:=false;
SetupCompilerFilename(InteractiveSetup);
@ -228,7 +230,7 @@ begin
SetupMacros;
SetupPackageSystem;
SetupOutputFilter;
BuildBoss.SetupCompilerInterface;
MainBuildBoss.SetupCompilerInterface;
fInitResult:=true;
end;
@ -259,7 +261,7 @@ end;
procedure TLazBuildApplication.SetupMacros;
begin
BuildBoss.SetupTransferMacros;
MainBuildBoss.SetupTransferMacros;
end;
procedure TLazBuildApplication.SetupPackageSystem;
@ -295,7 +297,7 @@ begin
FreeThenNil(GlobalMacroList);
FreeThenNil(IDEMacros);
FreeThenNil(EnvironmentOptions);
FreeThenNil(BuildBoss);
FreeThenNil(MainBuildBoss);
FreeAndNil(Files);
inherited Destroy;

View File

@ -456,7 +456,7 @@ type
const PersistentClassName, AncestorClassName, Identifier: string;
var IsDefined: boolean);
procedure CodeToolBossPrepareTree(Sender: TObject);
function MacroFunctionProject(Data: Pointer): boolean;
function CTMacroFunctionProject(Data: Pointer): boolean;
procedure OnCompilerGraphStampIncreased;
// MessagesView events
@ -815,13 +815,6 @@ type
// methods for debugging, compiling and external tools
function GetTestBuildDirectory: string; override;
function GetProjectTargetFilename: string; override;
function GetTestProjectFilename: string;
function GetTestUnitFilename(AnUnitInfo: TUnitInfo): string; override;
function GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string;
function IsTestUnitFilename(const AFilename: string): boolean; override;
function GetRunCommandLine: string; override;
function GetProjPublishDir: string;
procedure OnMacroSubstitution(TheMacro: TTransferMacro; var s: string;
const Data: PtrInt;
var Handled, Abort: boolean);
@ -1035,7 +1028,7 @@ begin
SetupDialogs;
BuildBoss:=TBuildManager.Create;
MainBuildBoss:=TBuildManager.Create;
// load options
CreatePrimaryConfigPath;
@ -1083,7 +1076,7 @@ begin
// setup the IDE components
LoadMenuShortCuts;
SetupOutputFilter;
BuildBoss.SetupCompilerInterface;
MainBuildBoss.SetupCompilerInterface;
SetupObjectInspector;
SetupFormEditor;
SetupSourceNotebook;
@ -1178,7 +1171,7 @@ begin
DebugLn('[TMainIDE.Destroy] B -> inherited Destroy... ',ClassName);
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.Destroy B ');{$ENDIF}
FreeThenNil(SourceNotebook);
FreeThenNil(BuildBoss);
FreeThenNil(MainBuildBoss);
inherited Destroy;
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.Destroy C ');{$ENDIF}
@ -1553,7 +1546,7 @@ end;
procedure TMainIDE.SetupTransferMacros;
begin
BuildBoss.SetupTransferMacros;
MainBuildBoss.SetupTransferMacros;
GlobalMacroList.OnSubstitution:=@OnMacroSubstitution;
// source editor
@ -1561,34 +1554,6 @@ begin
lisSaveCurrentEditorFile,nil,[tmfInteractive]));
GlobalMacroList.Add(TTransferMacro.Create('SaveAll','',
lisSaveAllModified,nil,[tmfInteractive]));
// project
GlobalMacroList.Add(TTransferMacro.Create('LCLWidgetType','',
lisLCLWidgetType,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetCPU','',
lisTargetCPU,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetOS','',
lisTargetOS,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('Params','',
lisCommandLineParamsOfProgram,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjFile','',
lisProjectFilename,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjPath','',
lisProjectDirectory,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetFile','',
lisTargetFilenameOfProject,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('TargetCmdLine','',
lisTargetFilenamePlusParams,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('RunCmdLine','',
lisLaunchingCmdLine,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjPublishDir','',
lisPublishProjDir,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjUnitPath','',
lisProjectUnitPath,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjIncPath','',
lisProjectIncPath,nil,[]));
GlobalMacroList.Add(TTransferMacro.Create('ProjSrcPath','',
lisProjectSrcPath,nil,[]));
end;
procedure TMainIDE.SetupCodeMacros;
@ -3206,7 +3171,7 @@ begin
frmCompilerOptions.OnTest:=@OnCompilerOptionsDialogTest;
frmCompilerOptions.OnImExportCompilerOptions:=@OnCompilerOptionsImExport;
if frmCompilerOptions.ShowModal=mrOk then begin
BuildBoss.RescanCompilerDefines(true);
MainBuildBoss.RescanCompilerDefines(true);
Project1.DefineTemplates.AllChanged;
IncreaseCompilerGraphStamp;
end;
@ -3597,7 +3562,7 @@ Begin
if MacroValueChanged then CodeToolBoss.DefineTree.ClearCache;
if FPCCompilerChanged or FPCSrcDirChanged then begin
BuildBoss.RescanCompilerDefines(false);
MainBuildBoss.RescanCompilerDefines(false);
end;
// save to disk
@ -3645,7 +3610,7 @@ end;
procedure TMainIDE.mnuEnvRescanFPCSrcDirClicked(Sender: TObject);
begin
BuildBoss.RescanCompilerDefines(false);
MainBuildBoss.RescanCompilerDefines(false);
end;
procedure TMainIDE.SaveEnvironment;
@ -4082,7 +4047,7 @@ begin
if ComponentSavingOk then begin
if ResourceCode=nil then begin
if (sfSaveToTestDir in Flags) then
UnitSaveFilename:=GetTestUnitFilename(AnUnitInfo)
UnitSaveFilename:=MainBuildBoss.GetTestUnitFilename(AnUnitInfo)
else
UnitSaveFilename:=AnUnitInfo.Filename;
ResTestFilename:=ChangeFileExt(UnitSaveFilename,ResourceFileExt);
@ -4250,7 +4215,7 @@ begin
if not Result=mrOk then exit;
end;
end else begin
TestFilename:=GetTestUnitFilename(AnUnitInfo);
TestFilename:=MainBuildBoss.GetTestUnitFilename(AnUnitInfo);
Result:=DoSaveCodeBufferToFile(ResourceCode,
ChangeFileExt(TestFilename,
ExtractFileExt(ResourceCode.Filename)),
@ -5317,7 +5282,7 @@ begin
UpdateCaption;
EnvironmentOptions.LastSavedProjectFile:=Project1.ProjectInfoFile;
EnvironmentOptions.Save(false);
BuildBoss.RescanCompilerDefines(true);
MainBuildBoss.RescanCompilerDefines(true);
// load required packages
PkgBoss.OpenProjectDependencies(Project1,true);
@ -5699,7 +5664,7 @@ begin
end;
end else begin
// save source to test directory
TestFilename:=GetTestUnitFilename(ActiveUnitInfo);
TestFilename:=MainBuildBoss.GetTestUnitFilename(ActiveUnitInfo);
if TestFilename<>'' then begin
Result:=ActiveUnitInfo.WriteUnitSourceToFile(TestFilename);
if Result<>mrOk then exit;
@ -6578,7 +6543,7 @@ Begin
end;
// rebuild codetools defines
BuildBoss.RescanCompilerDefines(true);
MainBuildBoss.RescanCompilerDefines(true);
// (i.e. remove old project specific things and create new)
IncreaseCompilerParseStamp;
Project1.DefineTemplates.AllChanged;
@ -6688,7 +6653,7 @@ begin
if not MainUnitInfo.NeedsSaveToDisk then
SkipSavingMainSource:=true;
end else
DestFilename:=GetTestUnitFilename(MainUnitInfo);
DestFilename:=MainBuildBoss.GetTestUnitFilename(MainUnitInfo);
if not SkipSavingMainSource then begin
Result:=DoSaveCodeBufferToFile(MainUnitInfo.Source, DestFilename,
not (sfSaveToTestDir in Flags));
@ -6971,7 +6936,7 @@ begin
// publish project
//debugln('TMainIDE.DoPublishProject B');
Result:=DoPublishModule(Project1.PublishOptions,Project1.ProjectDirectory,
GetProjPublishDir);
MainBuildBoss.GetProjectPublishDir);
end;
function TMainIDE.DoImExportCompilerOptions(Sender: TObject): TModalResult;
@ -7215,7 +7180,7 @@ begin
for i:=0 to Project1.UnitCount-1 do begin
AnUnitInfo:=Project1.Units[i];
if (AnUnitInfo.IsPartOfProject) and (not AnUnitInfo.IsVirtual) then begin
DestFilename:=GetTargetUnitFilename(AnUnitInfo);
DestFilename:=MainBuildBoss.GetTargetUnitFilename(AnUnitInfo);
Result:=DoCheckAmbiguousSources(DestFilename,true);
if Result<>mrOk then exit;
end;
@ -7481,9 +7446,14 @@ begin
SrcFilename:=CreateRelativePath(Project1.MainUnitInfo.Filename,WorkingDir);
end else begin
WorkingDir:=GetTestBuildDirectory;
SrcFilename:=GetTestUnitFilename(Project1.MainUnitInfo);
SrcFilename:=MainBuildBoss.GetTestUnitFilename(Project1.MainUnitInfo);
end;
CompilerFilename:=Project1.CompilerOptions.CompilerPath;
GlobalMacroList.SubstituteStr(CompilerFilename);
DebugLn(['TMainIDE.DoBuildProject A Project1.GetCompilerFilename="',Project1.GetCompilerFilename,'" CompilerFilename="',CompilerFilename,'" CompilerPath="',Project1.CompilerOptions.CompilerPath,'"']);
CompilerFilename:=Project1.GetCompilerFilename;
DebugLn(['TMainIDE.DoBuildProject CompilerFilename="',CompilerFilename,'" CompilerPath="',Project1.CompilerOptions.CompilerPath,'"']);
CompilerParams:=Project1.CompilerOptions.MakeOptionsString(SrcFilename,nil,[])
+' '+PrepareCmdLineOption(SrcFilename);
//DebugLn('TMainIDE.DoBuildProject WorkingDir="',WorkingDir,'" SrcFilename="',SrcFilename,'" CompilerFilename="',CompilerFilename,'" CompilerParams="',CompilerParams,'"');
@ -7610,7 +7580,7 @@ begin
then Exit;
// Check project build
ProgramFilename := GetProjectTargetFilename;
ProgramFilename := MainBuildBoss.GetProjectTargetFilename;
if not FileExists(ProgramFilename)
then begin
MessageDlg(lisFileNotFound,
@ -7839,7 +7809,7 @@ begin
MessagesView.BeginBlock;
try
BuildBoss.SetBuildTargetIDE;
MainBuildBoss.SetBuildTargetIDE;
// first compile all lazarus components (LCL, SynEdit, CodeTools, ...)
SourceNotebook.ClearErrorLines;
@ -7914,7 +7884,7 @@ begin
if Result<>mrOk then exit;
finally
BuildBoss.SetBuildTarget('','','');
MainBuildBoss.SetBuildTarget('','','');
DoCheckFilesOnDisk;
MessagesView.EndBlock;
@ -9147,80 +9117,6 @@ begin
end else if MacroName='saveall' then begin
Abort:=(DoSaveAll([sfCheckAmbiguousFiles])<>mrOk);
s:='';
end else if MacroName='projfile' then begin
if Project1<>nil then
s:=Project1.MainFilename
else
s:='';
end else if MacroName='projpath' then begin
if Project1<>nil then
s:=Project1.ProjectDirectory
else
s:='';
end else if MacroName='projunitpath' then begin
if Project1<>nil then
s:=Project1.CompilerOptions.GetUnitPath(false)
else
s:='';
end else if MacroName='projincpath' then begin
if Project1<>nil then
s:=Project1.CompilerOptions.GetIncludePath(false)
else
s:='';
end else if MacroName='projsrcpath' then begin
if Project1<>nil then
s:=Project1.CompilerOptions.GetSrcPath(false)
else
s:='';
end else if MacroName='projpublishdir' then begin
if Project1<>nil then
s:=Project1.PublishOptions.DestinationDirectory
else
s:='';
end else if MacroName='lclwidgettype' then begin
if Data=CompilerOptionMacroPlatformIndependent then
s:='%(LCL_PLATFORM)'
else
s:=BuildBoss.GetLCLWidgetType(true);
end else if MacroName='targetcpu' then begin
if Data=CompilerOptionMacroPlatformIndependent then
s:='%(CPU_TARGET)'
else
s:=BuildBoss.GetTargetCPU(true);
end else if MacroName='targetos' then begin
if Data=CompilerOptionMacroPlatformIndependent then
s:='%(OS_TARGET)'
else
s:=BuildBoss.GetTargetOS(true);
end else if MacroName='params' then begin
if Project1<>nil then
s:=Project1.RunParameterOptions.CmdLineParams
else
s:='';
end else if MacroName='targetfile' then begin
if Project1<>nil then
s:=GetProjectTargetFilename
else
s:='';
end else if MacroName='targetcmdline' then begin
if Project1<>nil then begin
s:=Project1.RunParameterOptions.CmdLineParams;
if s='' then
s:=GetProjectTargetFilename
else
s:=GetProjectTargetFilename+' '+s;
end else
s:='';
end else if MacroName='runcmdline' then begin
if Project1<>nil then
s:=GetRunCommandLine
else
s:='';
end else if MacroName='projpublishdir' then begin
if Project1<>nil then
s:=GetProjPublishDir
else
s:='';
end else
Handled:=false;
end;
@ -9295,7 +9191,7 @@ begin
end;
OpenFlags:=[ofOnlyIfExists,ofRegularFile];
if IsTestUnitFilename(Filename) then begin
if MainBuildBoss.IsTestUnitFilename(Filename) then begin
SearchedFilename := ExtractFileName(Filename);
Include(OpenFlags,ofVirtualFile);
end else begin
@ -9406,7 +9302,7 @@ begin
if AFilename='' then exit;
LogCaretXY:= SearchResultsView.GetSourcePositon;
OpenFlags:=[ofOnlyIfExists,ofRegularFile];
if IsTestUnitFilename(AFilename) then begin
if MainBuildBoss.IsTestUnitFilename(AFilename) then begin
SearchedFilename := ExtractFileName(AFilename);
Include(OpenFlags,ofVirtualFile);
end else begin
@ -9514,103 +9410,7 @@ end;
function TMainIDE.GetTestBuildDirectory: string;
begin
Result:=EnvironmentOptions.GetTestBuildDirectory;
end;
function TMainIDE.GetProjectTargetFilename: string;
begin
Result:='';
if Project1=nil then exit;
Result:=Project1.RunParameterOptions.HostApplicationFilename;
if Result='' then begin
if Project1.IsVirtual then
Result:=GetTestProjectFilename
else begin
if Project1.MainUnitID>=0 then begin
Result:=
Project1.CompilerOptions.CreateTargetFilename(Project1.MainFilename)
end;
end;
end;
end;
function TMainIDE.GetTestProjectFilename: string;
begin
Result:='';
if (Project1.MainUnitID<0) then exit;
Result:=GetTestUnitFilename(Project1.MainUnitInfo);
if Result='' then exit;
Result:=Project1.CompilerOptions.CreateTargetFilename(Result);
end;
function TMainIDE.GetTestUnitFilename(AnUnitInfo: TUnitInfo): string;
var TestDir: string;
begin
Result:='';
if AnUnitInfo=nil then exit;
TestDir:=GetTestBuildDirectory;
if TestDir='' then exit;
Result:=ExtractFilename(AnUnitInfo.Filename);
if Result='' then exit;
Result:=TestDir+Result;
end;
function TMainIDE.GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string;
begin
if Project1.IsVirtual then
Result:=GetTestUnitFilename(AnUnitInfo)
else
Result:=AnUnitInfo.Filename;
end;
function TMainIDE.IsTestUnitFilename(const AFilename: string): boolean;
var
TestDir: string;
begin
Result:=false;
if Project1.IsVirtual then begin
TestDir:=GetTestBuildDirectory;
Result:=CompareFileNames(TestDir,ExtractFilePath(AFilename))=0;
end;
end;
function TMainIDE.GetRunCommandLine: string;
var
TargetFileName: string;
begin
if Project1.RunParameterOptions.UseLaunchingApplication then
Result := Project1.RunParameterOptions.LaunchingApplicationPathPlusParams
else
Result := '';
if Result=''
then begin
Result:=Project1.RunParameterOptions.CmdLineParams;
if GlobalMacroList.SubstituteStr(Result) then begin
TargetFileName:='"'+GetProjectTargetFilename+'"';
if Result='' then
Result:=TargetFileName
else
Result:=TargetFilename+' '+Result;
end else
Result:='';
end else begin
if not GlobalMacroList.SubstituteStr(Result) then Result:='';
end;
end;
function TMainIDE.GetProjPublishDir: string;
begin
Result:=Project1.PublishOptions.DestinationDirectory;
if GlobalMacroList.SubstituteStr(Result) then begin
if FilenameIsAbsolute(Result) then begin
Result:=AppendPathDelim(TrimFilename(Result));
end else begin
Result:='';
end;
end else begin
Result:='';
end;
Result:=MainBuildBoss.GetTestBuildDirectory;
end;
function TMainIDE.FindUnitFile(const AFilename: string): string;
@ -10170,7 +9970,7 @@ begin
CodeToolBoss.DefineTree.OnPrepareTree:=@CodeToolBossPrepareTree;
CodeToolBoss.DefineTree.MacroFunctions.AddExtended(
'PROJECT',nil,@MacroFunctionProject);
'PROJECT',nil,@CTMacroFunctionProject);
CodeToolsOpts.AssignTo(CodeToolBoss);
if (not FileExists(EnvironmentOptions.CompilerFilename)) then begin
@ -10206,13 +10006,13 @@ begin
// start the compiler and ask for his settings
TargetOS:='';
TargetProcessor:='';
BuildBoss.CurDefinesCompilerFilename:=EnvironmentOptions.CompilerFilename;
BuildBoss.CurDefinesCompilerOptions:='';
BuildBoss.GetFPCCompilerParamsForEnvironmentTest(
BuildBoss.CurDefinesCompilerOptions);
MainBuildBoss.CurDefinesCompilerFilename:=EnvironmentOptions.CompilerFilename;
MainBuildBoss.CurDefinesCompilerOptions:='';
MainBuildBoss.GetFPCCompilerParamsForEnvironmentTest(
MainBuildBoss.CurDefinesCompilerOptions);
//DebugLn('TMainIDE.InitCodeToolBoss CurDefinesCompilerOptions="',CurDefinesCompilerOptions,'"');
ADefTempl:=CreateFPCTemplate(BuildBoss.CurDefinesCompilerFilename,
BuildBoss.CurDefinesCompilerOptions,
ADefTempl:=CreateFPCTemplate(MainBuildBoss.CurDefinesCompilerFilename,
MainBuildBoss.CurDefinesCompilerOptions,
CreateCompilerTestPascalFilename,CompilerUnitSearchPath,
TargetOS,TargetProcessor,CodeToolsOpts);
AddTemplate(ADefTempl,false,
@ -10404,7 +10204,7 @@ begin
end;
end;
function TMainIDE.MacroFunctionProject(Data: Pointer): boolean;
function TMainIDE.CTMacroFunctionProject(Data: Pointer): boolean;
var
FuncData: PReadFunctionData;
Param: String;

View File

@ -138,10 +138,6 @@ type
procedure DoCommand(EditorCommand: integer); virtual; abstract;
function GetProjectTargetFilename: string; virtual; abstract;
function GetTestUnitFilename(AnUnitInfo: TUnitInfo): string; virtual; abstract;
function IsTestUnitFilename(const AFilename: string): boolean; virtual; abstract;
function GetRunCommandLine: string; virtual; abstract;
procedure GetIDEFileState(Sender: TObject; const AFilename: string;
NeededFlags: TIDEFileStateFlags;
var ResultFlags: TIDEFileStateFlags); virtual; abstract;

View File

@ -313,6 +313,9 @@ begin
exit;
end;
end;
if MacroName='CompPath' then begin
writeln('TTransferMacroList.SubstituteStr MacroName=',MacroName,' Handled=',Handled);
end;
if (not Handled) and (AMacro<>nil) and (Assigned(AMacro.MacroFunction))
then begin
MacroStr:=AMacro.MacroFunction(MacroParam,Data,Abort);
@ -337,7 +340,15 @@ begin
end;
if (not Handled) and (AMacro<>nil) then begin
// standard macro
MacroStr:=AMacro.Value;
if Assigned(AMacro.MacroFunction) then begin
MacroStr:=AMacro.MacroFunction('',Data,Abort);
if Abort then begin
Result:=false;
exit;
end;
end else begin
MacroStr:=AMacro.Value;
end;
Handled:=true;
end;
end;