mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 00:40:03 +01:00 
			
		
		
		
	IDE: Optimize DefineTemplates updates for packages and project.
git-svn-id: trunk@64405 -
This commit is contained in:
		
							parent
							
								
									00e7a5c92b
								
							
						
					
					
						commit
						b092cee8be
					
				@ -602,7 +602,7 @@ type
 | 
			
		||||
    procedure RemoveTemplatesOwnedBy(TheOwner: TObject;
 | 
			
		||||
                               const MustFlags, NotFlags: TDefineTemplateFlags);
 | 
			
		||||
    procedure ReplaceChild(ParentTemplate, NewDefineTemplate: TDefineTemplate;
 | 
			
		||||
                           const ChildName: string);
 | 
			
		||||
                           const ChildName: string; AClearCache: boolean=true);
 | 
			
		||||
    procedure ReplaceRootSameName(ADefineTemplate: TDefineTemplate);
 | 
			
		||||
    procedure ReplaceRootSameName(const Name: string;
 | 
			
		||||
                                  ADefineTemplate: TDefineTemplate);
 | 
			
		||||
@ -6007,8 +6007,8 @@ begin
 | 
			
		||||
  if HadDefines then ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TDefineTree.ReplaceChild(ParentTemplate,
 | 
			
		||||
  NewDefineTemplate: TDefineTemplate; const ChildName: string);
 | 
			
		||||
procedure TDefineTree.ReplaceChild(ParentTemplate, NewDefineTemplate: TDefineTemplate;
 | 
			
		||||
  const ChildName: string; AClearCache: boolean);
 | 
			
		||||
// if there is a DefineTemplate with the same name then replace it
 | 
			
		||||
// else add as last
 | 
			
		||||
var OldDefineTemplate: TDefineTemplate;
 | 
			
		||||
@ -6016,9 +6016,9 @@ begin
 | 
			
		||||
  if (ChildName='') or (ParentTemplate=nil) then exit;
 | 
			
		||||
  OldDefineTemplate:=ParentTemplate.FindChildByName(ChildName);
 | 
			
		||||
  if OldDefineTemplate<>nil then begin
 | 
			
		||||
    if not OldDefineTemplate.IsEqual(NewDefineTemplate,true,false) then begin
 | 
			
		||||
    if AClearCache
 | 
			
		||||
    and not OldDefineTemplate.IsEqual(NewDefineTemplate,true,false) then
 | 
			
		||||
      ClearCache;
 | 
			
		||||
    end;
 | 
			
		||||
    if NewDefineTemplate<>nil then
 | 
			
		||||
      NewDefineTemplate.InsertBehind(OldDefineTemplate);
 | 
			
		||||
    if OldDefineTemplate=FFirstDefineTemplate then
 | 
			
		||||
@ -6026,7 +6026,8 @@ begin
 | 
			
		||||
    OldDefineTemplate.Unbind;
 | 
			
		||||
    OldDefineTemplate.Free;
 | 
			
		||||
  end else begin
 | 
			
		||||
    ClearCache;
 | 
			
		||||
    if AClearCache then
 | 
			
		||||
      ClearCache;
 | 
			
		||||
    ParentTemplate.AddChild(NewDefineTemplate);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -648,10 +648,13 @@ end;
 | 
			
		||||
procedure TExpressionEvaluator.RemoveDoubles(OnGetSameString: TOnGetSameString);
 | 
			
		||||
var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
  V: String;
 | 
			
		||||
begin
 | 
			
		||||
  for i:=0 to FCount-1 do begin
 | 
			
		||||
    OnGetSameString(FNames[i]);
 | 
			
		||||
    OnGetSameString(FValues[i]);
 | 
			
		||||
    V:=FValues[i];
 | 
			
		||||
    if V<>'' then
 | 
			
		||||
      OnGetSameString(V);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,6 @@ function CreateProjectTemplateWithID(const ProjectID: string): TDefineTemplate;
 | 
			
		||||
// packages
 | 
			
		||||
function FindPackagesTemplate: TDefineTemplate;
 | 
			
		||||
function FindPackageTemplateWithID(const PkgID: string): TDefineTemplate;
 | 
			
		||||
function CreatePackagesTemplate: TDefineTemplate;
 | 
			
		||||
function CreatePackageTemplateWithID(const PkgID: string): TDefineTemplate;
 | 
			
		||||
 | 
			
		||||
// miscellaneous
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								ide/main.pp
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ide/main.pp
									
									
									
									
									
								
							@ -5212,7 +5212,7 @@ begin
 | 
			
		||||
    UpdateCaption;
 | 
			
		||||
    if Assigned(ProjInspector) then
 | 
			
		||||
      ProjInspector.UpdateTitle;
 | 
			
		||||
    Project1.DefineTemplates.AllChanged;
 | 
			
		||||
    Project1.DefineTemplates.AllChanged(false);
 | 
			
		||||
    IncreaseCompilerParseStamp;
 | 
			
		||||
 | 
			
		||||
    if Project1.UseAsDefault then
 | 
			
		||||
@ -9785,8 +9785,8 @@ begin
 | 
			
		||||
  if FIDECodeToolsDefines=ctdNeedUpdate then begin
 | 
			
		||||
    FIDECodeToolsDefines:=ctdUpdating;
 | 
			
		||||
    if Project1<>nil then
 | 
			
		||||
      Project1.DefineTemplates.AllChanged;
 | 
			
		||||
    PkgBoss.RebuildDefineTemplates;
 | 
			
		||||
      Project1.DefineTemplates.AllChanged(false);
 | 
			
		||||
    PackageGraph.RebuildDefineTemplates;
 | 
			
		||||
    FIDECodeToolsDefines:=ctdReady;
 | 
			
		||||
    //DebugLn('TMainIDE.CodeToolBossPrepareTree CompilerGraphStamp=',dbgs(CompilerGraphStamp));
 | 
			
		||||
    {$IFDEF VerboseAddProjPkg}
 | 
			
		||||
@ -9905,12 +9905,12 @@ end;
 | 
			
		||||
 | 
			
		||||
procedure TMainIDE.CompilerParseStampIncHandler;
 | 
			
		||||
begin
 | 
			
		||||
  if FIDECodeToolsDefines=ctdUpdating then exit;
 | 
			
		||||
  if (FIDECodeToolsDefines=ctdUpdating) or (not FIDEStarted) then exit;
 | 
			
		||||
  {$IFDEF VerboseAddProjPkg}
 | 
			
		||||
  DebugLn(['TMainIDE.OnCompilerParseStampIncreased ']);
 | 
			
		||||
  {$ENDIF}
 | 
			
		||||
  FIDECodeToolsDefines:=ctdNeedUpdate;
 | 
			
		||||
  CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
  //CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TMainIDE.CodeToolBossScannerInit(Self: TCodeToolManager; Scanner: TLinkScanner);
 | 
			
		||||
 | 
			
		||||
@ -564,7 +564,7 @@ type
 | 
			
		||||
    procedure FixTemplateOrder;
 | 
			
		||||
  protected
 | 
			
		||||
    procedure UpdateMain; override;
 | 
			
		||||
    procedure UpdateSrcDirIfDef; override;
 | 
			
		||||
    function UpdateSrcDirIfDef: Boolean; override;
 | 
			
		||||
    procedure UpdateSourceDirectories; override;
 | 
			
		||||
    procedure UpdateOutputDirectory; override;
 | 
			
		||||
    procedure UpdateDefinesForCustomDefines; override;
 | 
			
		||||
@ -572,7 +572,7 @@ type
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create(AOwner: IProjPack);
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
    procedure AllChanged; override;
 | 
			
		||||
    procedure AllChanged(AActivating: boolean); override;
 | 
			
		||||
    procedure UpdateGlobalValues;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
@ -6476,9 +6476,9 @@ begin
 | 
			
		||||
  // ClearCache is here unnessary, because it is only a block
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.UpdateSrcDirIfDef;
 | 
			
		||||
function TProjectDefineTemplates.UpdateSrcDirIfDef: Boolean;
 | 
			
		||||
// Returns the changed state
 | 
			
		||||
var
 | 
			
		||||
  Changed: Boolean;
 | 
			
		||||
  NamespacesDefTempl: TDefineTemplate;
 | 
			
		||||
  UnitPathDefTempl: TDefineTemplate;
 | 
			
		||||
  IncPathDefTempl: TDefineTemplate;
 | 
			
		||||
@ -6497,7 +6497,7 @@ begin
 | 
			
		||||
    FMain.AddChild(FSrcDirectories);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  Changed:=false;
 | 
			
		||||
  Result:=false;
 | 
			
		||||
  IfValue:='defined(#ProjectSrcMark'+Owner.IDAsWord+')';
 | 
			
		||||
  if (Owner as TProject) = Project1 then
 | 
			
		||||
    IfValue:=IfValue+' or defined('+UseDefaultsFlagName+')';
 | 
			
		||||
@ -6532,15 +6532,13 @@ begin
 | 
			
		||||
      da_Define);
 | 
			
		||||
    FSrcDirIf.AddChild(SrcPathDefTempl);
 | 
			
		||||
 | 
			
		||||
    Changed:=true;
 | 
			
		||||
    Result:=true;
 | 
			
		||||
  end else begin
 | 
			
		||||
    if FSrcDirIf.Value<>IfValue then begin
 | 
			
		||||
      FSrcDirIf.Value:=IfValue;
 | 
			
		||||
      Changed:=true;
 | 
			
		||||
      Result:=true;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
  if Changed then
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.UpdateOutputDirectory;
 | 
			
		||||
@ -6576,7 +6574,7 @@ begin
 | 
			
		||||
    FOutputSrcPath.SetDefineOwner(Proj,false);
 | 
			
		||||
    FOutputSrcPath.SetFlags([dtfAutoGenerated],[],false);
 | 
			
		||||
    CodeToolBoss.DefineTree.ReplaceChild(FOutputDir,FOutputSrcPath,
 | 
			
		||||
      FOutputSrcPath.Name);
 | 
			
		||||
      FOutputSrcPath.Name, not (ptfLoading in FFlags));
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -6656,8 +6654,8 @@ begin
 | 
			
		||||
      // add directory
 | 
			
		||||
      FSrcDirectories.AddChild(SrcDirDefTempl);
 | 
			
		||||
    end;
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
 | 
			
		||||
    if not (ptfLoading in FFlags) then
 | 
			
		||||
      CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
  finally
 | 
			
		||||
    NewSourceDirs.Free;
 | 
			
		||||
  end;
 | 
			
		||||
@ -6667,14 +6665,12 @@ procedure TProjectDefineTemplates.UpdateDefinesForCustomDefines;
 | 
			
		||||
var
 | 
			
		||||
  OptionsDefTempl: TDefineTemplate;
 | 
			
		||||
  NewCustomOptions: String;
 | 
			
		||||
  Changed: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  if (not Owner.NeedsDefineTemplates) or (not Active) then exit;
 | 
			
		||||
 | 
			
		||||
  // check if something has changed
 | 
			
		||||
  NewCustomOptions:=Owner.BaseCompilerOptions.GetOptionsForCTDefines;
 | 
			
		||||
  if (FLastCustomOptions=NewCustomOptions) then exit;
 | 
			
		||||
  Changed:=false;
 | 
			
		||||
 | 
			
		||||
  FLastCustomOptions:=NewCustomOptions;
 | 
			
		||||
  OptionsDefTempl:=CodeToolBoss.DefinePool.CreateFPCCommandLineDefines(
 | 
			
		||||
@ -6682,16 +6678,15 @@ begin
 | 
			
		||||
  if OptionsDefTempl=nil then begin
 | 
			
		||||
    // no custom options -> delete old template
 | 
			
		||||
    if FSrcDirIf<>nil then begin
 | 
			
		||||
      if FSrcDirIf.DeleteChild('Custom Options') then
 | 
			
		||||
        Changed:=true;
 | 
			
		||||
      if FSrcDirIf.DeleteChild('Custom Options') and not (ptfLoading in FFlags) then
 | 
			
		||||
        CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
    end;
 | 
			
		||||
  end else begin
 | 
			
		||||
    UpdateSrcDirIfDef;
 | 
			
		||||
    FSrcDirIf.ReplaceChild(OptionsDefTempl);
 | 
			
		||||
    Changed:=true;
 | 
			
		||||
    if not (ptfLoading in FFlags) then
 | 
			
		||||
      CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
  end;
 | 
			
		||||
  if Changed then
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.FixTemplateOrder;
 | 
			
		||||
@ -6702,16 +6697,15 @@ end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.ClearFlags;
 | 
			
		||||
begin
 | 
			
		||||
  FFlags:=FFlags+[ptfFlagsChanged];
 | 
			
		||||
  FFlags:=FFlags+[ptfCustomDefinesChanged];
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.AllChanged;
 | 
			
		||||
procedure TProjectDefineTemplates.AllChanged(AActivating: boolean);
 | 
			
		||||
begin
 | 
			
		||||
  UpdateSrcDirIfDef;
 | 
			
		||||
  SourceDirectoriesChanged;
 | 
			
		||||
  CustomDefinesChanged;
 | 
			
		||||
  UpdateGlobalValues;
 | 
			
		||||
  UpdateSrcDirIfDef;
 | 
			
		||||
  CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjectDefineTemplates.UpdateGlobalValues;
 | 
			
		||||
 | 
			
		||||
@ -3613,7 +3613,6 @@ begin
 | 
			
		||||
      MainBuildBoss.SetBuildTargetProject1(false);
 | 
			
		||||
      // (i.e. remove old project specific things and create new)
 | 
			
		||||
      IncreaseCompilerParseStamp;
 | 
			
		||||
      Project1.DefineTemplates.AllChanged;
 | 
			
		||||
      Project1.DefineTemplates.Active:=true;
 | 
			
		||||
      DebugBoss.Reset;
 | 
			
		||||
    finally
 | 
			
		||||
@ -7448,7 +7447,6 @@ begin
 | 
			
		||||
  // load required packages
 | 
			
		||||
  PkgBoss.OpenProjectDependencies(Project1, MainIDE.IDEStarted);
 | 
			
		||||
 | 
			
		||||
  Project1.DefineTemplates.AllChanged;
 | 
			
		||||
  //DebugLn('CompleteLoadingProjectInfo ',Project1.IDAsString);
 | 
			
		||||
  Project1.DefineTemplates.Active:=true;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -127,7 +127,6 @@ type
 | 
			
		||||
        ): TModalResult; virtual; abstract;
 | 
			
		||||
    function CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions): TModalResult; virtual; abstract;
 | 
			
		||||
    procedure DoShowPackageGraphPathList(PathList: TFPList); virtual; abstract;
 | 
			
		||||
    procedure RebuildDefineTemplates; virtual; abstract;
 | 
			
		||||
    procedure LazarusSrcDirChanged; virtual; abstract;
 | 
			
		||||
 | 
			
		||||
    // package compilation
 | 
			
		||||
 | 
			
		||||
@ -405,7 +405,7 @@ type
 | 
			
		||||
  private
 | 
			
		||||
  protected
 | 
			
		||||
    procedure UpdateMain; override;
 | 
			
		||||
    procedure UpdateSrcDirIfDef; override;
 | 
			
		||||
    function UpdateSrcDirIfDef: Boolean; override;
 | 
			
		||||
    procedure UpdateSourceDirectories; override;
 | 
			
		||||
    procedure UpdateOutputDirectory; override;
 | 
			
		||||
    procedure UpdateDefinesForCustomDefines; override;
 | 
			
		||||
@ -413,7 +413,7 @@ type
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create(AOwner: IProjPack);
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
    procedure AllChanged; override;
 | 
			
		||||
    procedure AllChanged(AActivating: boolean); override;
 | 
			
		||||
  end;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
@ -589,6 +589,7 @@ type
 | 
			
		||||
    procedure SetAutoInstall(AValue: TPackageInstallType); override;
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create; override;
 | 
			
		||||
    constructor CreateAndClear;
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
    procedure AssignOptions(Source: TPersistent); override;
 | 
			
		||||
    // IDE options
 | 
			
		||||
@ -742,7 +743,8 @@ type
 | 
			
		||||
    property FPDocPaths: string read FFPDocPaths write SetFPDocPaths;
 | 
			
		||||
    property FPDocPackageName: string read FFPDocPackageName write SetFPDocPackageName;
 | 
			
		||||
    property License: string read FLicense write SetLicense;
 | 
			
		||||
    property LPKSource: TCodeBuffer read FLPKSource write SetLPKSource;// see Missing, can be nil when file on disk was removed or point to a different codebuffer during rename
 | 
			
		||||
    // see Missing, can be nil when file on disk was removed or point to a different codebuffer during rename
 | 
			
		||||
    property LPKSource: TCodeBuffer read FLPKSource write SetLPKSource;
 | 
			
		||||
    property LPKSourceChangeStep: integer read FLPKSourceChangeStep write FLPKSourceChangeStep;
 | 
			
		||||
    property Macros: TTransferMacroList read FMacros;
 | 
			
		||||
    property MainUnit: TPkgFile read FMainUnit;
 | 
			
		||||
@ -2626,10 +2628,15 @@ begin
 | 
			
		||||
  FDefineTemplates:=TLazPackageDefineTemplates.Create(Self);
 | 
			
		||||
  fPublishOptions:=TPublishPackageOptions.Create(Self);
 | 
			
		||||
  FProvides:=TStringList.Create;
 | 
			
		||||
  Clear;
 | 
			
		||||
  FUsageOptions.ParsedOpts.InvalidateParseOnChange:=true;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
constructor TLazPackage.CreateAndClear;
 | 
			
		||||
begin
 | 
			
		||||
  Create;
 | 
			
		||||
  Clear;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
destructor TLazPackage.Destroy;
 | 
			
		||||
begin
 | 
			
		||||
  Include(FFlags,lpfDestroying);
 | 
			
		||||
@ -4348,8 +4355,7 @@ begin
 | 
			
		||||
  Result:=LazPackage.IDAsString;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TPkgAdditionalCompilerOptions.
 | 
			
		||||
  GetBaseCompilerOptions: TBaseCompilerOptions;
 | 
			
		||||
function TPkgAdditionalCompilerOptions.GetBaseCompilerOptions: TBaseCompilerOptions;
 | 
			
		||||
begin
 | 
			
		||||
  Result:=LazPackage.CompilerOptions;
 | 
			
		||||
end;
 | 
			
		||||
@ -4374,13 +4380,14 @@ begin
 | 
			
		||||
                  ptfCustomDefinesChanged];
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TLazPackageDefineTemplates.AllChanged;
 | 
			
		||||
procedure TLazPackageDefineTemplates.AllChanged(AActivating: boolean);
 | 
			
		||||
begin
 | 
			
		||||
  IDChanged;
 | 
			
		||||
  UpdateSrcDirIfDef;// always create the SrcDirIfDef for IDE add-ons
 | 
			
		||||
  if not AActivating then // Create the SrcDirIfDef for IDE add-ons
 | 
			
		||||
    UpdateSrcDirIfDef;    // (Will be called from other methods during activation)
 | 
			
		||||
  SourceDirectoriesChanged;
 | 
			
		||||
  CustomDefinesChanged;
 | 
			
		||||
  OutputDirectoryChanged;
 | 
			
		||||
  CustomDefinesChanged;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TLazPackageDefineTemplates.UpdateMain;
 | 
			
		||||
@ -4397,9 +4404,8 @@ begin
 | 
			
		||||
  // ClearCache is here unnessary, because it is only a block
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TLazPackageDefineTemplates.UpdateSrcDirIfDef;
 | 
			
		||||
function TLazPackageDefineTemplates.UpdateSrcDirIfDef: Boolean;
 | 
			
		||||
var
 | 
			
		||||
  Changed: Boolean;
 | 
			
		||||
  NewVariable: String;
 | 
			
		||||
  UnitPathDefTempl: TDefineTemplate;
 | 
			
		||||
  IncPathDefTempl: TDefineTemplate;
 | 
			
		||||
@ -4416,7 +4422,7 @@ begin
 | 
			
		||||
      da_Block);
 | 
			
		||||
    FMain.AddChild(FSrcDirectories);
 | 
			
		||||
  end;
 | 
			
		||||
  Changed:=false;
 | 
			
		||||
  Result:=false;
 | 
			
		||||
  if FSrcDirIf=nil then begin
 | 
			
		||||
    FSrcDirIf:=TDefineTemplate.Create('Source Directory Additions',
 | 
			
		||||
      'Additional defines for package source directories',
 | 
			
		||||
@ -4433,8 +4439,7 @@ begin
 | 
			
		||||
      '#IncPath','$(#IncPath);$PkgIncPath('+Owner.IDAsString+')',
 | 
			
		||||
      da_Define);
 | 
			
		||||
    FSrcDirIf.AddChild(IncPathDefTempl);
 | 
			
		||||
 | 
			
		||||
    Changed:=true;
 | 
			
		||||
    Result:=true;
 | 
			
		||||
  end else begin
 | 
			
		||||
    NewVariable:='#PkgSrcMark'+Owner.IDAsWord;
 | 
			
		||||
    if NewVariable<>FSrcDirIf.Variable then begin
 | 
			
		||||
@ -4447,12 +4452,9 @@ begin
 | 
			
		||||
      IncPathDefTempl:=FSrcDirIf.FindChildByName('IncPath');
 | 
			
		||||
      if IncPathDefTempl<>nil then
 | 
			
		||||
        IncPathDefTempl.Value:='$(#IncPath);$PkgIncPath('+Owner.IDAsString+')';
 | 
			
		||||
 | 
			
		||||
      Changed:=true;
 | 
			
		||||
      Result:=true;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
  if Changed then
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TLazPackageDefineTemplates.UpdateOutputDirectory;
 | 
			
		||||
@ -4484,7 +4486,7 @@ begin
 | 
			
		||||
    FOutputSrcPath.SetDefineOwner(LazPackage,false);
 | 
			
		||||
    FOutputSrcPath.SetFlags([dtfAutoGenerated],[],false);
 | 
			
		||||
    CodeToolBoss.DefineTree.ReplaceChild(FOutputDir,FOutputSrcPath,
 | 
			
		||||
      FOutputSrcPath.Name);
 | 
			
		||||
      FOutputSrcPath.Name, not (ptfLoading in FFlags));
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -4528,8 +4530,7 @@ begin
 | 
			
		||||
  // build source directory define templates
 | 
			
		||||
  FreeAndNil(fLastSourceDirectories);
 | 
			
		||||
  fLastSourceDirectories:=SearchPathToList(CurUnitPath);
 | 
			
		||||
  if (fLastSourceDirectories.Count>0)
 | 
			
		||||
  and ((FSrcDirIf=nil) or IDHasChanged) then
 | 
			
		||||
  if (fLastSourceDirectories.Count>0) and ((FSrcDirIf=nil) or IDHasChanged) then
 | 
			
		||||
    UpdateSrcDirIfDef;
 | 
			
		||||
  for i:=0 to fLastSourceDirectories.Count-1 do begin
 | 
			
		||||
    // create directory template
 | 
			
		||||
@ -4547,7 +4548,8 @@ begin
 | 
			
		||||
    // add directory
 | 
			
		||||
    FSrcDirectories.AddChild(SrcDirDefTempl);
 | 
			
		||||
  end;
 | 
			
		||||
  CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
  if not (ptfLoading in FFlags) then
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TLazPackageDefineTemplates.UpdateDefinesForCustomDefines;
 | 
			
		||||
@ -4567,13 +4569,12 @@ begin
 | 
			
		||||
  if OptionsDefTempl=nil then begin
 | 
			
		||||
    // no custom options -> delete old template
 | 
			
		||||
    if FSrcDirIf<>nil then begin
 | 
			
		||||
      if FSrcDirIf.DeleteChild('Custom Options') then
 | 
			
		||||
      if FSrcDirIf.DeleteChild('Custom Options') and not (ptfLoading in FFlags) then
 | 
			
		||||
        CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
    end;
 | 
			
		||||
  end else begin
 | 
			
		||||
    UpdateSrcDirIfDef;
 | 
			
		||||
    FSrcDirIf.ReplaceChild(OptionsDefTempl);
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -974,6 +974,7 @@ begin
 | 
			
		||||
      PkgLink.LPKFileDateValid:=true;
 | 
			
		||||
      XMLConfig:=TXMLConfig.Create(nil);
 | 
			
		||||
      NewPackage:=TLazPackage.Create;
 | 
			
		||||
      NewPackage.BeginUpdate;
 | 
			
		||||
      NewPackage.Filename:=AFilename;
 | 
			
		||||
      NewPackage.OnModifySilently := @PkgModify;
 | 
			
		||||
      Result:=LoadXMLConfigFromCodeBuffer(AFilename,XMLConfig,
 | 
			
		||||
@ -1007,6 +1008,8 @@ begin
 | 
			
		||||
    else
 | 
			
		||||
      ReplacePackage(OldPackage,NewPackage);
 | 
			
		||||
  finally
 | 
			
		||||
    if Assigned(NewPackage) then
 | 
			
		||||
      NewPackage.EndUpdate;
 | 
			
		||||
    if Result<>mrOk then
 | 
			
		||||
      NewPackage.Free;
 | 
			
		||||
    EndUpdate;
 | 
			
		||||
@ -1199,7 +1202,7 @@ var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  for i:=0 to Count-1 do
 | 
			
		||||
    Packages[i].DefineTemplates.AllChanged;
 | 
			
		||||
    Packages[i].DefineTemplates.AllChanged(false);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TLazPackageGraph.MacroFunctionPkgDir(const s: string;
 | 
			
		||||
@ -1826,7 +1829,7 @@ end;
 | 
			
		||||
function TLazPackageGraph.CreateNewPackage(const Prefix: string): TLazPackage;
 | 
			
		||||
begin
 | 
			
		||||
  BeginUpdate(true);
 | 
			
		||||
  Result:=TLazPackage.Create;
 | 
			
		||||
  Result:=TLazPackage.CreateAndClear;
 | 
			
		||||
  Result.OnModifySilently:=@PkgModify;
 | 
			
		||||
  Result.Name:=CreateUniquePkgName(Prefix,nil);
 | 
			
		||||
  AddPackage(Result);
 | 
			
		||||
@ -2039,7 +2042,7 @@ end;
 | 
			
		||||
 | 
			
		||||
function TLazPackageGraph.CreateDefaultPackage: TLazPackage;
 | 
			
		||||
begin
 | 
			
		||||
  Result:=TLazPackage.Create;
 | 
			
		||||
  Result:=TLazPackage.CreateAndClear;
 | 
			
		||||
  with Result do begin
 | 
			
		||||
    Missing:=true;
 | 
			
		||||
    UserReadOnly:=true;
 | 
			
		||||
@ -6067,7 +6070,7 @@ begin
 | 
			
		||||
    // a valid lpk file of the installed package can not be found
 | 
			
		||||
    IsBasePkg:=IsStaticBasePackage(Dependency.PackageName);
 | 
			
		||||
    // -> create a broken package
 | 
			
		||||
    BrokenPackage:=TLazPackage.Create;
 | 
			
		||||
    BrokenPackage:=TLazPackage.CreateAndClear;
 | 
			
		||||
    with BrokenPackage do begin
 | 
			
		||||
      BeginUpdate;
 | 
			
		||||
      Missing:=true;
 | 
			
		||||
 | 
			
		||||
@ -252,7 +252,6 @@ type
 | 
			
		||||
    procedure DoShowPackageGraph(Show: boolean);
 | 
			
		||||
    procedure DoShowPackageGraphPathList(PathList: TFPList); override;
 | 
			
		||||
    function CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions): TModalResult; override;
 | 
			
		||||
    procedure RebuildDefineTemplates; override;
 | 
			
		||||
    procedure LazarusSrcDirChanged; override;
 | 
			
		||||
    function GetPackageCount: integer; override;
 | 
			
		||||
    function GetPackages(Index: integer): TIDEPackage; override;
 | 
			
		||||
@ -3974,11 +3973,6 @@ begin
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TPkgManager.RebuildDefineTemplates;
 | 
			
		||||
begin
 | 
			
		||||
  PackageGraph.RebuildDefineTemplates;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TPkgManager.LazarusSrcDirChanged;
 | 
			
		||||
const
 | 
			
		||||
  LazDirMacro = '$(LazarusDir)';
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,8 @@ uses
 | 
			
		||||
  LazTracer, FileReferenceList,
 | 
			
		||||
  // Codetools
 | 
			
		||||
  DefineTemplates, CodeToolManager,
 | 
			
		||||
  // IdeIntf
 | 
			
		||||
  LazIDEIntf,
 | 
			
		||||
  // IDE
 | 
			
		||||
  CompilerOptions;
 | 
			
		||||
 | 
			
		||||
@ -44,8 +46,8 @@ type
 | 
			
		||||
  { TProjPackDefineTemplates }
 | 
			
		||||
 | 
			
		||||
  TProjPackDefineTemplatesFlag = (
 | 
			
		||||
    ptfLoading,
 | 
			
		||||
    ptfIsPackageTemplate,
 | 
			
		||||
    ptfFlagsChanged,
 | 
			
		||||
    ptfIDChanged,
 | 
			
		||||
    ptfSourceDirsChanged,
 | 
			
		||||
    ptfOutputDirChanged,
 | 
			
		||||
@ -56,6 +58,7 @@ type
 | 
			
		||||
  TProjPackDefineTemplates = class
 | 
			
		||||
  private
 | 
			
		||||
    FOwner: IProjPack;
 | 
			
		||||
    procedure InternalIDChanged;
 | 
			
		||||
  protected
 | 
			
		||||
    FActive: boolean;
 | 
			
		||||
    FSrcDirectories: TDefineTemplate;
 | 
			
		||||
@ -73,7 +76,7 @@ type
 | 
			
		||||
    fLastUnitPath: string;
 | 
			
		||||
    procedure SetActive(const AValue: boolean);
 | 
			
		||||
    procedure UpdateMain; virtual; abstract;
 | 
			
		||||
    procedure UpdateSrcDirIfDef; virtual; abstract;
 | 
			
		||||
    function UpdateSrcDirIfDef: Boolean; virtual; abstract;
 | 
			
		||||
    procedure UpdateSourceDirectories; virtual; abstract;
 | 
			
		||||
    procedure UpdateOutputDirectory; virtual; abstract;
 | 
			
		||||
    procedure UpdateDefinesForCustomDefines; virtual; abstract;
 | 
			
		||||
@ -84,11 +87,11 @@ type
 | 
			
		||||
    procedure Clear;
 | 
			
		||||
    procedure BeginUpdate;
 | 
			
		||||
    procedure EndUpdate;
 | 
			
		||||
    procedure AllChanged; virtual; abstract;
 | 
			
		||||
    procedure AllChanged(AActivating: boolean); virtual; abstract;
 | 
			
		||||
    procedure IDChanged;
 | 
			
		||||
    procedure SourceDirectoriesChanged;// a source directory was added/deleted
 | 
			
		||||
    procedure CustomDefinesChanged;    // the defines of the source dirs changed
 | 
			
		||||
    procedure OutputDirectoryChanged;// the path or the defines of the output dir changed
 | 
			
		||||
    procedure CustomDefinesChanged;    // the defines of the source dirs changed
 | 
			
		||||
  public
 | 
			
		||||
    property Owner: IProjPack read FOwner;
 | 
			
		||||
    property Main: TDefineTemplate read FMain;
 | 
			
		||||
@ -145,13 +148,15 @@ begin
 | 
			
		||||
  if FUpdateLock=0 then RaiseGDBException('TProjPackDefineTemplates.EndUpdate');
 | 
			
		||||
  dec(FUpdateLock);
 | 
			
		||||
  if FUpdateLock=0 then begin
 | 
			
		||||
    if ptfIsPackageTemplate in FFlags then begin
 | 
			
		||||
      if ptfIDChanged in FFlags then IDChanged;
 | 
			
		||||
    end;
 | 
			
		||||
    if ptfFlagsChanged in FFlags then CustomDefinesChanged;
 | 
			
		||||
    if not LazarusIDE.IDEStarted then
 | 
			
		||||
      Include(FFlags, ptfLoading);
 | 
			
		||||
    if FFlags * [ptfIsPackageTemplate,ptfIDChanged]  // AND
 | 
			
		||||
              = [ptfIsPackageTemplate,ptfIDChanged] then
 | 
			
		||||
      InternalIDChanged;
 | 
			
		||||
    if ptfSourceDirsChanged in FFlags then SourceDirectoriesChanged;
 | 
			
		||||
    if ptfOutputDirChanged in FFlags then OutputDirectoryChanged;
 | 
			
		||||
    if ptfCustomDefinesChanged in FFlags then CustomDefinesChanged;
 | 
			
		||||
    Exclude(FFlags, ptfLoading);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -160,22 +165,30 @@ begin
 | 
			
		||||
  if FActive=AValue then exit;
 | 
			
		||||
  FActive:=AValue;
 | 
			
		||||
  if FActive then
 | 
			
		||||
    AllChanged
 | 
			
		||||
    AllChanged(true)
 | 
			
		||||
  else
 | 
			
		||||
    Clear;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjPackDefineTemplates.InternalIDChanged;
 | 
			
		||||
// Called only from EndUpdate.
 | 
			
		||||
begin
 | 
			
		||||
  Exclude(FFlags,ptfIDChanged);
 | 
			
		||||
  UpdateMain;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjPackDefineTemplates.IDChanged;
 | 
			
		||||
begin
 | 
			
		||||
  if FUpdateLock>0 then begin
 | 
			
		||||
    Include(FFlags,ptfIDChanged);
 | 
			
		||||
    FFlags:=FFlags+[ptfIDChanged, ptfSourceDirsChanged, ptfOutputDirChanged,
 | 
			
		||||
                    ptfCustomDefinesChanged];
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
  Exclude(FFlags,ptfIDChanged);
 | 
			
		||||
  UpdateMain;
 | 
			
		||||
  UpdateOutputDirectory;
 | 
			
		||||
  UpdateSourceDirectories;
 | 
			
		||||
  UpdateDefinesForCustomDefines;
 | 
			
		||||
  SourceDirectoriesChanged;
 | 
			
		||||
  OutputDirectoryChanged;
 | 
			
		||||
  CustomDefinesChanged;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjPackDefineTemplates.SourceDirectoriesChanged;
 | 
			
		||||
@ -186,7 +199,6 @@ begin
 | 
			
		||||
  end;
 | 
			
		||||
  Exclude(FFlags,ptfSourceDirsChanged);
 | 
			
		||||
  UpdateSourceDirectories;
 | 
			
		||||
  CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjPackDefineTemplates.OutputDirectoryChanged;
 | 
			
		||||
@ -197,7 +209,6 @@ begin
 | 
			
		||||
  end;
 | 
			
		||||
  Exclude(FFlags,ptfOutputDirChanged);
 | 
			
		||||
  UpdateOutputDirectory;
 | 
			
		||||
  CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TProjPackDefineTemplates.CustomDefinesChanged;
 | 
			
		||||
@ -208,8 +219,6 @@ begin
 | 
			
		||||
  end;
 | 
			
		||||
  Exclude(FFlags,ptfCustomDefinesChanged);
 | 
			
		||||
  UpdateDefinesForCustomDefines; // maybe custom defines changed
 | 
			
		||||
  if ptfIsPackageTemplate in FFlags then
 | 
			
		||||
    CodeToolBoss.DefineTree.ClearCache;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user