IDE: pass reason for compile project and package dependencies as string

git-svn-id: trunk@36653 -
This commit is contained in:
mattias 2012-04-07 12:03:17 +00:00
parent 8425f35288
commit 4609a3fe68
2 changed files with 70 additions and 22 deletions

View File

@ -907,7 +907,7 @@ type
function DoSaveForBuild(AReason: TCompileReason): TModalResult; override;
function DoCheckIfProjectNeedsCompilation(AProject: TProject;
const CompilerFilename, CompilerParams, SrcFilename: string;
out NeedBuildAllFlag: boolean): TModalResult;
out NeedBuildAllFlag: boolean; var Note: string): TModalResult;
function DoBuildProject(const AReason: TCompileReason;
Flags: TProjectBuildFlags): TModalResult; override;
function UpdateProjectPOFile(AProject: TProject): TModalResult;
@ -11726,8 +11726,8 @@ begin
end;
function TMainIDE.DoCheckIfProjectNeedsCompilation(AProject: TProject;
const CompilerFilename, CompilerParams, SrcFilename: string;
out NeedBuildAllFlag: boolean): TModalResult;
const CompilerFilename, CompilerParams, SrcFilename: string; out
NeedBuildAllFlag: boolean; var Note: string): TModalResult;
var
StateFilename: String;
StateFileAge: LongInt;
@ -11749,6 +11749,7 @@ begin
if Result<>mrOk then exit;
if not (lpsfStateFileLoaded in AProject.StateFlags) then begin
DebugLn('TMainIDE.CheckIfPackageNeedsCompilation No state file for ',AProject.IDAsString);
Note+='State file "'+StateFilename+'" of '+AProject.IDAsString+' is missing.'+LineEnding;
exit(mrYes);
end;
@ -11758,6 +11759,9 @@ begin
if FileExistsCached(SrcFilename) and (StateFileAge<FileAgeCached(SrcFilename)) then
begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation SrcFile outdated ',AProject.IDAsString);
Note+='Source file "'+SrcFilename+'" of '+AProject.IDAsString+' outdated:'+LineEnding
+' source age='+FileAgeToStr(FileAgeCached(SrcFilename))+LineEnding
+' state file age='+FileAgeToStr(StateFileAge)+LineEnding;
exit(mrYes);
end;
@ -11766,22 +11770,32 @@ begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Compiler filename changed for ',AProject.IDAsString);
DebugLn(' Old="',AProject.LastCompilerFilename,'"');
DebugLn(' Now="',CompilerFilename,'"');
Note+='Compiler filename changed for '+AProject.IDAsString+':'+LineEnding
+' Old="'+AProject.LastCompilerFilename+'"'+LineEnding
+' Now="'+CompilerFilename+'"'+LineEnding;
exit(mrYes);
end;
if not FileExistsUTF8(CompilerFilename) then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Compiler filename not found for ',AProject.IDAsString);
if not FileExistsCached(CompilerFilename) then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Compiler file not found for ',AProject.IDAsString);
DebugLn(' File="',CompilerFilename,'"');
Note+='Compiler file "'+CompilerFilename+'" not found for '+AProject.IDAsString+'.'+LineEnding;
exit(mrYes);
end;
if FileAgeCached(CompilerFilename)<>AProject.LastCompilerFileDate then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Compiler file changed for ',AProject.IDAsString);
DebugLn(' File="',CompilerFilename,'"');
Note+='Compiler file "'+CompilerFilename+'" for '+AProject.IDAsString+' changed:'+LineEnding
+' Old="'+FileAgeToStr(AProject.LastCompilerFileDate)+'"'+LineEnding
+' Now="'+FileAgeToStr(FileAgeCached(CompilerFilename))+'"'+LineEnding;
exit(mrYes);
end;
if CompilerParams<>AProject.LastCompilerParams then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Compiler params changed for ',AProject.IDAsString);
DebugLn(' Old="',AProject.LastCompilerParams,'"');
DebugLn(' Now="',CompilerParams,'"');
Note+='Compiler params changed for '+AProject.IDAsString+':'+LineEnding
+' Old="'+AProject.LastCompilerParams+'"'+LineEnding
+' Now="'+CompilerParams+'"'+LineEnding;
exit(mrYes);
end;
@ -11793,15 +11807,19 @@ begin
Result:=PackageGraph.CheckCompileNeedDueToDependencies(AProject,
AProject.FirstRequiredDependency,
not (pfUseDesignTimePackages in AProject.Flags),
StateFileAge);
StateFileAge,Note);
if Result<>mrNo then exit;
// check project files
AnUnitInfo:=AProject.FirstPartOfProject;
while AnUnitInfo<>nil do begin
if FileExistsCached(AnUnitInfo.Filename) then begin
if (not AnUnitInfo.IsVirtual) and FileExistsCached(AnUnitInfo.Filename) then
begin
if (StateFileAge<FileAgeCached(AnUnitInfo.Filename)) then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Src has changed ',AProject.IDAsString,' ',AnUnitInfo.Filename);
Note+='File "'+AnUnitInfo.Filename+'" of '+AProject.IDAsString+' is newer than state file:'+LineEnding
+' file age="'+FileAgeToStr(FileAgeCached(AnUnitInfo.Filename))+'"'+LineEnding
+' state file age="'+FileAgeToStr(StateFileAge)+'"'+LineEnding;
exit(mrYes);
end;
if AnUnitInfo.ComponentName<>'' then begin
@ -11809,6 +11827,9 @@ begin
if FileExistsCached(LFMFilename)
and (StateFileAge<FileAgeCached(LFMFilename)) then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation LFM has changed ',AProject.IDAsString,' ',LFMFilename);
Note+='File "'+LFMFilename+'" of '+AProject.IDAsString+' is newer than state file:'+LineEnding
+' file age="'+FileAgeToStr(FileAgeCached(LFMFilename))+'"'+LineEnding
+' state file age="'+FileAgeToStr(StateFileAge)+'"'+LineEnding;
exit(mrYes);
end;
end;
@ -11820,9 +11841,13 @@ begin
AnUnitInfo:=AProject.FirstUnitWithEditorIndex;
while AnUnitInfo<>nil do begin
if (not AnUnitInfo.IsPartOfProject)
and (not AnUnitInfo.IsVirtual)
and FileExistsCached(AnUnitInfo.Filename)
and (StateFileAge<FileAgeCached(AnUnitInfo.Filename)) then begin
DebugLn('TMainIDE.CheckIfProjectNeedsCompilation Editor Src has changed ',AProject.IDAsString,' ',AnUnitInfo.Filename);
Note+='Editor file "'+AnUnitInfo.Filename+'" is newer than state file:'+LineEnding
+' file age="'+FileAgeToStr(FileAgeCached(AnUnitInfo.Filename))+'"'+LineEnding
+' state file age="'+FileAgeToStr(StateFileAge)+'"'+LineEnding;
exit(mrYes);
end;
AnUnitInfo:=AnUnitInfo.NextUnitWithEditorIndex;
@ -11979,6 +12004,7 @@ var
err : TFPCErrorType;
TargetExeDirectory: String;
FPCVersion, FPCRelease, FPCPatch: integer;
Note: String;
begin
if Project1.MainUnitInfo=nil then begin
// this project has no source to compile
@ -12074,9 +12100,10 @@ begin
// and check if a 'build all' is needed
NeedBuildAllFlag:=false;
if (AReason in Project1.CompilerOptions.CompileReasons) then begin
Note:='';
Result:=DoCheckIfProjectNeedsCompilation(Project1,
CompilerFilename,CompilerParams,
SrcFilename,NeedBuildAllFlag);
SrcFilename,NeedBuildAllFlag,Note);
if (pbfOnlyIfNeeded in Flags)
and (not (pfAlwaysBuild in Project1.Flags)) then begin
if Result=mrNo then begin

View File

@ -284,11 +284,11 @@ type
function LoadPackageCompiledState(APackage: TLazPackage;
IgnoreErrors, ShowAbort: boolean): TModalResult;
function CheckCompileNeedDueToFPCUnits(TheOwner: TObject;
StateFileAge: longint): boolean;
StateFileAge: longint; var Note: string): boolean;
function CheckCompileNeedDueToDependencies(TheOwner: TObject;
FirstDependency: TPkgDependency;
SkipDesignTimePackages: boolean; StateFileAge: longint
): TModalResult;
FirstDependency: TPkgDependency;
SkipDesignTimePackages: boolean; StateFileAge: longint;
var Note: string): TModalResult;
function CheckIfPackageNeedsCompilation(APackage: TLazPackage;
SkipDesignTimePackages: boolean;
out NeedBuildAllFlag: boolean; var Note: string): TModalResult;
@ -2753,7 +2753,7 @@ begin
end;
function TLazPackageGraph.CheckCompileNeedDueToFPCUnits(TheOwner: TObject;
StateFileAge: longint): boolean;
StateFileAge: longint; var Note: string): boolean;
var
AProject: TLazProject;
Pkg: TLazPackage;
@ -2795,6 +2795,9 @@ begin
Filename:=Item^.Value;
if FileAgeCached(Filename)>StateFileAge then begin
debugln(['TLazPackageGraph.CheckCompileNeedDueToFPCUnits FPC unit "',Filename,'" is newer than state file of ',ID]);
Note+='FPC unit "'+Filename+'" is newer than state file of '+ID+':'+LineEnding
+' unit age='+FileAgeToStr(FileAgeCached(Filename))+LineEnding
+' state file age='+FileAgeToStr(StateFileAge)+LineEnding;
exit(true);
end;
Node:=CfgCache.Units.Tree.FindSuccessor(Node);
@ -2803,7 +2806,7 @@ end;
function TLazPackageGraph.CheckCompileNeedDueToDependencies(TheOwner: TObject;
FirstDependency: TPkgDependency; SkipDesignTimePackages: boolean;
StateFileAge: longint): TModalResult;
StateFileAge: longint; var Note: string): TModalResult;
function GetOwnerID: string;
begin
@ -2820,7 +2823,7 @@ begin
if Dependency=nil then begin
// no dependencies
// => check FPC units
if CheckCompileNeedDueToFPCUnits(TheOwner,StateFileAge) then
if CheckCompileNeedDueToFPCUnits(TheOwner,StateFileAge,Note) then
exit(mrYes);
Result:=mrNo;
exit;
@ -2836,16 +2839,23 @@ begin
// check compile state file of required package
if not RequiredPackage.AutoCreated then begin
Result:=LoadPackageCompiledState(RequiredPackage,false,true);
if Result<>mrOk then exit;
if Result<>mrOk then begin
Note+='unable to load state file of '+RequiredPackage.IDAsString;
exit;
end;
Result:=mrYes;
o:=RequiredPackage.GetOutputDirType;
if not RequiredPackage.LastCompile[o].StateFileLoaded then begin
DebugLn('TPkgManager.CheckCompileNeedDueToDependencies Missing state file for ',RequiredPackage.IDAsString,': ',RequiredPackage.GetStateFilename);
Note+='Package '+RequiredPackage.IDAsString+' has no state file "'+RequiredPackage.GetStateFilename+'".'+LineEnding;
exit;
end;
if StateFileAge<RequiredPackage.LastCompile[o].StateFileDate then begin
DebugLn('TPkgManager.CheckCompileNeedDueToDependencies ',
' State file of ',RequiredPackage.IDAsString,' is newer than state file of ',GetOwnerID);
Note+='State file of '+RequiredPackage.IDAsString+' is newer than state file of '+GetOwnerID+LineEnding
+' '+RequiredPackage.IDAsString+'='+FileAgeToStr(RequiredPackage.LastCompile[o].StateFileDate)+LineEnding
+' '+GetOwnerID+'='+FileAgeToStr(StateFileAge)+LineEnding;
exit;
end;
end;
@ -2859,9 +2869,13 @@ begin
and FileExistsCached(OtherStateFile)
and (FileAgeCached(OtherStateFile)>StateFileAge) then begin
DebugLn('TPkgManager.CheckCompileNeedDueToDependencies ',
' OtherState of ',RequiredPackage.IDAsString,' file "',OtherStateFile,'" (',
' State file of ',RequiredPackage.IDAsString,' "',OtherStateFile,'" (',
FileAgeToStr(FileAgeCached(OtherStateFile)),')'
,' is newer than State file ',GetOwnerID,'(',FileAgeToStr(StateFileAge),')');
,' is newer than state file ',GetOwnerID,'(',FileAgeToStr(StateFileAge),')');
Note+='State file of used package is newer than state file:'+LineEnding
+' Used package '+RequiredPackage.IDAsString+', file="'+OtherStateFile+'", '
+' age='+FileAgeToStr(FileAgeCached(OtherStateFile))+LineEnding
+' package '+GetOwnerID+', age='+FileAgeToStr(StateFileAge)+LineEnding;
Result:=mrYes;
exit;
end;
@ -2898,7 +2912,10 @@ begin
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
true,SkipDesignTimePackages,
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
if Result=mrNo then exit; // the current output is valid
if Result=mrNo then begin
// the current output is valid
exit;
end;
// the current output directory needs compilation
if APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride='' then
@ -2911,11 +2928,14 @@ begin
exit;
end;
debugln(['TLazPackageGraph.CheckIfPackageNeedsCompilation normal output dir is not writable: ',OutputDir]);
Note+='Normal output directory is not writable.'+LineEnding;
// the normal output directory is not writable
// => try the fallback directory
NewOutputDir:=GetFallbackOutputDir(APackage);
if (NewOutputDir=OutputDir) or (NewOutputDir='') then exit;
if (NewOutputDir=OutputDir) or (NewOutputDir='') then begin
Note+='Normal output directory is not writable. There is no fallback.'+LineEnding;
exit;
end;
Note+='Normal output directory is not writable, switching to fallback.'+LineEnding;
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=NewOutputDir;
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
true,SkipDesignTimePackages,
@ -3150,7 +3170,8 @@ begin
if CheckDependencies then begin
// check all required packages
Result:=CheckCompileNeedDueToDependencies(APackage,
APackage.FirstRequiredDependency,SkipDesignTimePackages,StateFileAge);
APackage.FirstRequiredDependency,SkipDesignTimePackages,StateFileAge,
Note);
if Result<>mrNo then begin
DependenciesChanged:=true;
exit;