mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 19:59:31 +02:00
IDE: move/copy multiple files via dnd from package editors/project inspector
git-svn-id: trunk@45977 -
This commit is contained in:
parent
bb6f12fb49
commit
b3807641a3
@ -183,12 +183,13 @@ type
|
|||||||
TPkgOpenFlags = set of TPkgOpenFlag;
|
TPkgOpenFlags = set of TPkgOpenFlag;
|
||||||
|
|
||||||
TPkgCompileFlag = (
|
TPkgCompileFlag = (
|
||||||
|
pcfOnlyIfNeeded,
|
||||||
pcfCleanCompile, // append -B to the compiler options
|
pcfCleanCompile, // append -B to the compiler options
|
||||||
|
pcfGroupCompile,
|
||||||
pcfDoNotCompileDependencies,
|
pcfDoNotCompileDependencies,
|
||||||
pcfDoNotCompilePackage,
|
pcfDoNotCompilePackage,
|
||||||
pcfCompileDependenciesClean,
|
pcfCompileDependenciesClean,
|
||||||
pcfSkipDesignTimePackages,
|
pcfSkipDesignTimePackages,
|
||||||
pcfOnlyIfNeeded,
|
|
||||||
pcfDoNotSaveEditorFiles,
|
pcfDoNotSaveEditorFiles,
|
||||||
pcfCreateMakefile,
|
pcfCreateMakefile,
|
||||||
pcfCreateFpmakeFile
|
pcfCreateFpmakeFile
|
||||||
|
@ -263,6 +263,7 @@ begin
|
|||||||
end
|
end
|
||||||
else if Item.Target is TLazPackage then begin
|
else if Item.Target is TLazPackage then begin
|
||||||
Pkg:=TLazPackage(Item.Target);
|
Pkg:=TLazPackage(Item.Target);
|
||||||
|
Pkg.Flags:=Pkg.Flags-[lpfNeedGroupCompile];
|
||||||
Item.Caption:=Pkg.IDAsString;
|
Item.Caption:=Pkg.IDAsString;
|
||||||
Item.Filename:=Pkg.Filename;
|
Item.Filename:=Pkg.Filename;
|
||||||
end;
|
end;
|
||||||
@ -303,8 +304,10 @@ begin
|
|||||||
Pkg:=TLazPackage(Item.Target);
|
Pkg:=TLazPackage(Item.Target);
|
||||||
Item.Note:='';
|
Item.Note:='';
|
||||||
NeedBuild:=PackageGraph.CheckIfPackageNeedsCompilation(
|
NeedBuild:=PackageGraph.CheckIfPackageNeedsCompilation(
|
||||||
Pkg,SkipDesignTimePackages,NeedBuildAll,Item.Note);
|
Pkg,SkipDesignTimePackages,true,NeedBuildAll,Item.Note);
|
||||||
if NeedBuild=mrYes then begin
|
if NeedBuild=mrYes then begin
|
||||||
|
debugln(['TIDEInfoNeedBuildDlg.CheckNeedBuild ',Pkg.Name]);
|
||||||
|
PackageGraph.SetFlagDependenciesNeedBuild(Pkg);
|
||||||
if NeedBuildAll then
|
if NeedBuildAll then
|
||||||
Item.NeedBuild:=inbClean
|
Item.NeedBuild:=inbClean
|
||||||
else
|
else
|
||||||
|
@ -463,7 +463,8 @@ type
|
|||||||
lpfDestroying, // set during destruction
|
lpfDestroying, // set during destruction
|
||||||
lpfLoading, // set during loading
|
lpfLoading, // set during loading
|
||||||
lpfSkipSaving, // Used by PkgBoss to skip saving
|
lpfSkipSaving, // Used by PkgBoss to skip saving
|
||||||
lpfCycle // Used by the PackageGraph to mark cycles
|
lpfCycle, // Used by the PackageGraph to mark cycles
|
||||||
|
lpfNeedGroupCompile // set during group compile, dependent packages need compile too
|
||||||
);
|
);
|
||||||
TLazPackageFlags = set of TLazPackageFlag;
|
TLazPackageFlags = set of TLazPackageFlag;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ uses
|
|||||||
Classes, SysUtils, FileProcs, FileUtil, LCLProc, Forms, Controls, Dialogs,
|
Classes, SysUtils, FileProcs, FileUtil, LCLProc, Forms, Controls, Dialogs,
|
||||||
Laz2_XMLCfg, LazLogger, LazFileUtils, InterfaceBase, LazUTF8,
|
Laz2_XMLCfg, LazLogger, LazFileUtils, InterfaceBase, LazUTF8,
|
||||||
// codetools
|
// codetools
|
||||||
AVL_Tree, DefineTemplates, CodeCache,
|
AVL_Tree, contnrs, DefineTemplates, CodeCache,
|
||||||
BasicCodeTools, CodeToolsStructs, NonPascalCodeTools, SourceChanger,
|
BasicCodeTools, CodeToolsStructs, NonPascalCodeTools, SourceChanger,
|
||||||
CodeToolManager, DirectoryCacher,
|
CodeToolManager, DirectoryCacher,
|
||||||
// IDEIntf,
|
// IDEIntf,
|
||||||
@ -184,7 +184,7 @@ type
|
|||||||
Verbose: boolean): boolean;
|
Verbose: boolean): boolean;
|
||||||
function GetPackageCompilerParams(APackage: TLazPackage): string;
|
function GetPackageCompilerParams(APackage: TLazPackage): string;
|
||||||
function CheckIfCurPkgOutDirNeedsCompile(APackage: TLazPackage;
|
function CheckIfCurPkgOutDirNeedsCompile(APackage: TLazPackage;
|
||||||
CheckDependencies, SkipDesignTimePackages: boolean;
|
CheckDependencies, SkipDesignTimePackages, GroupCompile: boolean;
|
||||||
out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean;
|
out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean;
|
||||||
var Note: string): TModalResult;
|
var Note: string): TModalResult;
|
||||||
procedure InvalidateStateFile(APackage: TLazPackage);
|
procedure InvalidateStateFile(APackage: TLazPackage);
|
||||||
@ -323,6 +323,7 @@ type
|
|||||||
Complete, MainPPUExists, ShowAbort: boolean): TModalResult;
|
Complete, MainPPUExists, ShowAbort: boolean): TModalResult;
|
||||||
function LoadPackageCompiledState(APackage: TLazPackage;
|
function LoadPackageCompiledState(APackage: TLazPackage;
|
||||||
IgnoreErrors, ShowAbort: boolean): TModalResult;
|
IgnoreErrors, ShowAbort: boolean): TModalResult;
|
||||||
|
procedure SetFlagDependenciesNeedBuild(Pkg: TLazPackage);
|
||||||
function CheckCompileNeedDueToFPCUnits(TheOwner: TObject;
|
function CheckCompileNeedDueToFPCUnits(TheOwner: TObject;
|
||||||
StateFileAge: longint; var Note: string): boolean;
|
StateFileAge: longint; var Note: string): boolean;
|
||||||
function CheckCompileNeedDueToDependencies(TheOwner: TObject;
|
function CheckCompileNeedDueToDependencies(TheOwner: TObject;
|
||||||
@ -330,7 +331,7 @@ type
|
|||||||
SkipDesignTimePackages: boolean; StateFileAge: longint;
|
SkipDesignTimePackages: boolean; StateFileAge: longint;
|
||||||
var Note: string): TModalResult;
|
var Note: string): TModalResult;
|
||||||
function CheckIfPackageNeedsCompilation(APackage: TLazPackage;
|
function CheckIfPackageNeedsCompilation(APackage: TLazPackage;
|
||||||
SkipDesignTimePackages: boolean;
|
SkipDesignTimePackages, GroupCompile: boolean;
|
||||||
out NeedBuildAllFlag: boolean; var Note: string): TModalResult;
|
out NeedBuildAllFlag: boolean; var Note: string): TModalResult;
|
||||||
function PreparePackageOutputDirectory(APackage: TLazPackage;
|
function PreparePackageOutputDirectory(APackage: TLazPackage;
|
||||||
CleanUp: boolean): TModalResult;
|
CleanUp: boolean): TModalResult;
|
||||||
@ -664,6 +665,7 @@ end;
|
|||||||
|
|
||||||
function TLazPkgGraphBuildItem.Add(Tool: TAbstractExternalTool): integer;
|
function TLazPkgGraphBuildItem.Add(Tool: TAbstractExternalTool): integer;
|
||||||
begin
|
begin
|
||||||
|
if Tool=nil then exit;
|
||||||
Tool.Reference(Self,'TLazPkgGraphBuildItem.Add');
|
Tool.Reference(Self,'TLazPkgGraphBuildItem.Add');
|
||||||
if Tool.Data is TLazPkgGraphExtToolData then
|
if Tool.Data is TLazPkgGraphExtToolData then
|
||||||
TLazPkgGraphExtToolData(Tool.Data).BuildItem:=Self;
|
TLazPkgGraphExtToolData(Tool.Data).BuildItem:=Self;
|
||||||
@ -3124,8 +3126,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function TLazPackageGraph.CheckIfPackageNeedsCompilation(APackage: TLazPackage;
|
function TLazPackageGraph.CheckIfPackageNeedsCompilation(APackage: TLazPackage;
|
||||||
SkipDesignTimePackages: boolean; out NeedBuildAllFlag: boolean; var
|
SkipDesignTimePackages, GroupCompile: boolean; out NeedBuildAllFlag: boolean;
|
||||||
Note: string): TModalResult;
|
var Note: string): TModalResult;
|
||||||
var
|
var
|
||||||
OutputDir: String;
|
OutputDir: String;
|
||||||
NewOutputDir: String;
|
NewOutputDir: String;
|
||||||
@ -3146,7 +3148,7 @@ begin
|
|||||||
|
|
||||||
// check the current output directory
|
// check the current output directory
|
||||||
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
||||||
true,SkipDesignTimePackages,
|
true,SkipDesignTimePackages,GroupCompile,
|
||||||
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
||||||
if Result=mrNo then begin
|
if Result=mrNo then begin
|
||||||
// the current output is valid
|
// the current output is valid
|
||||||
@ -3174,7 +3176,7 @@ begin
|
|||||||
Note+='Normal output directory is not writable, switching to fallback.'+LineEnding;
|
Note+='Normal output directory is not writable, switching to fallback.'+LineEnding;
|
||||||
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=NewOutputDir;
|
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=NewOutputDir;
|
||||||
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
||||||
true,SkipDesignTimePackages,
|
true,SkipDesignTimePackages,GroupCompile,
|
||||||
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
||||||
end else begin
|
end else begin
|
||||||
// the last compile was put to the fallback output directory
|
// the last compile was put to the fallback output directory
|
||||||
@ -3195,7 +3197,7 @@ begin
|
|||||||
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:='';
|
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:='';
|
||||||
OldNeedBuildAllFlag:=NeedBuildAllFlag;
|
OldNeedBuildAllFlag:=NeedBuildAllFlag;
|
||||||
DefResult:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
DefResult:=CheckIfCurPkgOutDirNeedsCompile(APackage,
|
||||||
true,SkipDesignTimePackages,
|
true,SkipDesignTimePackages,GroupCompile,
|
||||||
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
|
||||||
if DefResult=mrNo then begin
|
if DefResult=mrNo then begin
|
||||||
// switching back to the not writable output directory requires no compile
|
// switching back to the not writable output directory requires no compile
|
||||||
@ -3211,9 +3213,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile(
|
function TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile(
|
||||||
APackage: TLazPackage; CheckDependencies, SkipDesignTimePackages: boolean;
|
APackage: TLazPackage; CheckDependencies, SkipDesignTimePackages,
|
||||||
out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean;
|
GroupCompile: boolean; out NeedBuildAllFlag, ConfigChanged,
|
||||||
var Note: string): TModalResult;
|
DependenciesChanged: boolean; var Note: string): TModalResult;
|
||||||
// returns: mrYes, mrNo, mrCancel, mrAbort
|
// returns: mrYes, mrNo, mrCancel, mrAbort
|
||||||
var
|
var
|
||||||
StateFilename: String;
|
StateFilename: String;
|
||||||
@ -3278,6 +3280,13 @@ begin
|
|||||||
ConfigChanged:=true;
|
ConfigChanged:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if GroupCompile and (lpfNeedGroupCompile in APackage.Flags) then begin
|
||||||
|
debugln(['TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile dependencies will be rebuilt']);
|
||||||
|
Note:='Dependencies will be rebuilt';
|
||||||
|
DependenciesChanged:=true;
|
||||||
|
exit(mrYes);
|
||||||
|
end;
|
||||||
|
|
||||||
StateFileAge:=FileAgeUTF8(StateFilename);
|
StateFileAge:=FileAgeUTF8(StateFilename);
|
||||||
|
|
||||||
// check compiler and params
|
// check compiler and params
|
||||||
@ -3439,7 +3448,7 @@ begin
|
|||||||
Note);
|
Note);
|
||||||
if Result<>mrNo then begin
|
if Result<>mrNo then begin
|
||||||
DependenciesChanged:=true;
|
DependenciesChanged:=true;
|
||||||
exit;
|
exit(mrYes);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3502,6 +3511,13 @@ var
|
|||||||
Flags: TPkgCompileFlags;
|
Flags: TPkgCompileFlags;
|
||||||
ReqFlags: TPkgIntfRequiredFlags;
|
ReqFlags: TPkgIntfRequiredFlags;
|
||||||
CurPkg: TLazPackage;
|
CurPkg: TLazPackage;
|
||||||
|
BuildItems: TObjectList;
|
||||||
|
{$IFDEF EnableGroupCompile}
|
||||||
|
BuildItem: TLazPkgGraphBuildItem;
|
||||||
|
j: Integer;
|
||||||
|
Tool: TAbstractExternalTool;
|
||||||
|
ToolData: TLazPkgGraphExtToolData;
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
{$IFDEF VerbosePkgCompile}
|
{$IFDEF VerbosePkgCompile}
|
||||||
debugln('TLazPackageGraph.CompileRequiredPackages A MinPolicy=',dbgs(Policy),' SkipDesignTimePackages=',SkipDesignTimePackages);
|
debugln('TLazPackageGraph.CompileRequiredPackages A MinPolicy=',dbgs(Policy),' SkipDesignTimePackages=',SkipDesignTimePackages);
|
||||||
@ -3512,32 +3528,61 @@ begin
|
|||||||
GetAllRequiredPackages(APackage,FirstDependency,PkgList,ReqFlags,Policy);
|
GetAllRequiredPackages(APackage,FirstDependency,PkgList,ReqFlags,Policy);
|
||||||
if PkgList<>nil then begin
|
if PkgList<>nil then begin
|
||||||
//DebugLn('TLazPackageGraph.CompileRequiredPackages B Count=',IntToStr(PkgList.Count));
|
//DebugLn('TLazPackageGraph.CompileRequiredPackages B Count=',IntToStr(PkgList.Count));
|
||||||
|
BuildItems:=nil;
|
||||||
BeginUpdate(false);
|
BeginUpdate(false);
|
||||||
try
|
try
|
||||||
Flags:=[pcfDoNotCompileDependencies,pcfDoNotSaveEditorFiles];
|
|
||||||
for i:=PkgList.Count-1 downto 0 do begin
|
for i:=PkgList.Count-1 downto 0 do begin
|
||||||
CurPkg:=TLazPackage(PkgList[i]);
|
CurPkg:=TLazPackage(PkgList[i]);
|
||||||
if SkipDesignTimePackages and (CurPkg.PackageType=lptDesignTime) then
|
if SkipDesignTimePackages and (CurPkg.PackageType=lptDesignTime) then
|
||||||
PkgList.Delete(i);
|
PkgList.Delete(i);
|
||||||
|
CurPkg.Flags:=CurPkg.Flags+[lpfNeedGroupCompile];
|
||||||
end;
|
end;
|
||||||
if Assigned(OnBeforeCompilePackages) then
|
if Assigned(OnBeforeCompilePackages) then
|
||||||
begin
|
begin
|
||||||
Result:=OnBeforeCompilePackages(PkgList);
|
Result:=OnBeforeCompilePackages(PkgList);
|
||||||
if Result<>mrOk then exit;
|
if Result<>mrOk then exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// prepare output directories, basic checks
|
||||||
|
Flags:=[pcfDoNotCompileDependencies,pcfDoNotSaveEditorFiles,pcfGroupCompile];
|
||||||
|
if SkipDesignTimePackages then
|
||||||
|
Include(Flags,pcfSkipDesignTimePackages);
|
||||||
if Policy=pupAsNeeded then
|
if Policy=pupAsNeeded then
|
||||||
Include(Flags,pcfOnlyIfNeeded)
|
Include(Flags,pcfOnlyIfNeeded)
|
||||||
else
|
else
|
||||||
Include(Flags,pcfCleanCompile);
|
Include(Flags,pcfCleanCompile);
|
||||||
if SkipDesignTimePackages then
|
BuildItems:=TObjectList.Create(true);
|
||||||
Include(Flags,pcfSkipDesignTimePackages);
|
for i:=0 to PkgList.Count-1 do begin
|
||||||
i:=0;
|
CurPkg:=TLazPackage(PkgList[i]);
|
||||||
while i<PkgList.Count do begin
|
{$IFDEF EnableGroupCompile}
|
||||||
Result:=CompilePackage(TLazPackage(PkgList[i]),Flags,false);
|
BuildItem:=TLazPkgGraphBuildItem.Create(nil);
|
||||||
|
BuildItems.Add(BuildItem);
|
||||||
|
{$ELSE}
|
||||||
|
BuildItem:=nil;
|
||||||
|
{$ENDIF}
|
||||||
|
Result:=CompilePackage(CurPkg,Flags,false,BuildItem);
|
||||||
if Result<>mrOk then exit;
|
if Result<>mrOk then exit;
|
||||||
inc(i);
|
end;
|
||||||
|
|
||||||
|
// execute
|
||||||
|
for i:=0 to BuildItems.Count-1 do begin
|
||||||
|
BuildItem:=TLazPkgGraphBuildItem(BuildItems[i]);
|
||||||
|
for j:=0 to BuildItem.Count-1 do begin
|
||||||
|
Tool:=BuildItem[j];
|
||||||
|
debugln(['TLazPackageGraph.CompileRequiredPackages ',Tool.Title]);
|
||||||
|
if Tool.Data is TLazPkgGraphExtToolData then
|
||||||
|
ToolData:=TLazPkgGraphExtToolData(Tool.Data)
|
||||||
|
else
|
||||||
|
ToolData:=nil;
|
||||||
|
Tool.Execute;
|
||||||
|
Tool.WaitForExit;
|
||||||
|
if (Tool.ErrorMessage<>'') or ((ToolData<>nil) and (ToolData.ErrorMessage<>''))
|
||||||
|
then
|
||||||
|
exit(mrCancel);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
|
FreeAndNil(BuildItems);
|
||||||
FreeAndNil(PkgList);
|
FreeAndNil(PkgList);
|
||||||
EndUpdate;
|
EndUpdate;
|
||||||
end;
|
end;
|
||||||
@ -3548,6 +3593,24 @@ begin
|
|||||||
Result:=mrOk;
|
Result:=mrOk;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TLazPackageGraph.SetFlagDependenciesNeedBuild(Pkg: TLazPackage);
|
||||||
|
// set flag lpfNeedGroupCompile in all dependent packages
|
||||||
|
var
|
||||||
|
ADependency: TPkgDependency;
|
||||||
|
begin
|
||||||
|
if Pkg=nil then exit;
|
||||||
|
if lpfNeedGroupCompile in Pkg.Flags then exit;
|
||||||
|
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild START=',Pkg.Name]);
|
||||||
|
Pkg.Flags:=Pkg.Flags+[lpfNeedGroupCompile];
|
||||||
|
ADependency:=Pkg.FirstUsedByDependency;
|
||||||
|
while ADependency<>nil do begin
|
||||||
|
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild UsedBy=',ADependency.RequiredPackage<>nil]);
|
||||||
|
SetFlagDependenciesNeedBuild(ADependency.RequiredPackage);
|
||||||
|
ADependency:=ADependency.NextUsedByDependency;
|
||||||
|
end;
|
||||||
|
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild END=',Pkg.Name]);
|
||||||
|
end;
|
||||||
|
|
||||||
function TLazPackageGraph.CompilePackage(APackage: TLazPackage;
|
function TLazPackageGraph.CompilePackage(APackage: TLazPackage;
|
||||||
Flags: TPkgCompileFlags; ShowAbort: boolean; BuildItem: TLazPkgGraphBuildItem
|
Flags: TPkgCompileFlags; ShowAbort: boolean; BuildItem: TLazPkgGraphBuildItem
|
||||||
): TModalResult;
|
): TModalResult;
|
||||||
@ -3606,6 +3669,7 @@ begin
|
|||||||
Note:='';
|
Note:='';
|
||||||
Result:=CheckIfPackageNeedsCompilation(APackage,
|
Result:=CheckIfPackageNeedsCompilation(APackage,
|
||||||
pcfSkipDesignTimePackages in Flags,
|
pcfSkipDesignTimePackages in Flags,
|
||||||
|
pcfGroupCompile in Flags,
|
||||||
NeedBuildAllFlag,Note);
|
NeedBuildAllFlag,Note);
|
||||||
if Note<>'' then
|
if Note<>'' then
|
||||||
Note:='Compile reason: '+Note;
|
Note:='Compile reason: '+Note;
|
||||||
@ -3622,8 +3686,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
try
|
try
|
||||||
if (LazarusIDE<>nil) then
|
if (BuildItem=nil) and (LazarusIDE<>nil) then
|
||||||
LazarusIDE.MainBarSubTitle:=APackage.Name;
|
LazarusIDE.MainBarSubTitle:=APackage.Name;
|
||||||
|
|
||||||
|
if pcfGroupCompile in Flags then
|
||||||
|
SetFlagDependenciesNeedBuild(APackage);
|
||||||
|
|
||||||
// auto increase version
|
// auto increase version
|
||||||
// ToDo
|
// ToDo
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user