lazbuild: added options --build-twice

This commit is contained in:
mattias 2024-10-13 18:45:40 +02:00
parent 8ba0de5d29
commit 9be9ac65d7
4 changed files with 29 additions and 20 deletions

View File

@ -240,6 +240,7 @@ type
TPkgCompileFlag = (
pcfOnlyIfNeeded,
pcfCleanCompile, // append -B to the compiler options
pcfCompileTwice, // compile a second time and check if some unit was compiled again
pcfGroupCompile,
pcfDoNotCompileDependencies,
pcfDoNotCompilePackage,

View File

@ -69,6 +69,7 @@ type
FBuildIDEOptions: string;
FBuildModeOverride: String;
FBuildRecursive: boolean;
FBuildTwice: boolean;
fCompilerInCfg: string;
fCompilerOverride: String;
fCPUOverride: String;
@ -175,6 +176,7 @@ type
property PackageAction: TPkgAction read FPackageAction write FPackageAction;
property BuildAll: boolean read FBuildAll write FBuildAll;// build all files of project/package
property BuildTwice: boolean read FBuildTwice write FBuildTwice;// build all packages twice
property BuildRecursive: boolean read FBuildRecursive // apply BuildAll flag to dependencies
write FBuildRecursive;
property SkipDependencies: boolean read FSkipDependencies
@ -517,6 +519,8 @@ begin
Include(Flags,pcfCleanCompile)
else
Include(Flags,pcfOnlyIfNeeded);
if BuildTwice then
Include(Flags,pcfCompileTwice);
if BuildRecursive and BuildAll then
Include(Flags,pcfCompileDependenciesClean);
if SkipDependencies then
@ -731,7 +735,7 @@ begin
if (BuildRecursive and BuildAll) or Clean then
CompilePolicy:=pupOnRebuildingAll;
CurResult:=PackageGraph.CompileRequiredPackages(nil,
PackageGraph.FirstInstallDependency,false,CompilePolicy);
PackageGraph.FirstInstallDependency,false,BuildTwice,CompilePolicy);
if CurResult<>mrOk then exit;
finally
@ -892,7 +896,7 @@ var
CompilePolicy:=pupOnRebuildingAll;
if PackageGraph.CompileRequiredPackages(nil,Project1.FirstRequiredDependency,
not (pfUseDesignTimePackages in Project1.Flags),
CompilePolicy)<>mrOk
BuildTwice,CompilePolicy)<>mrOk
then
PrintErrorAndHalt(ErrorBuildFailed, 'Project dependencies of "' + AFilename + '"');
end;
@ -1622,7 +1626,8 @@ begin
LongOptions.Add('add-package');
LongOptions.Add('add-package-link');
LongOptions.Add('build-all');
LongOptions.Add('build-ide::');
LongOptions.Add('build-ide::'); // value is optional
LongOptions.Add('build-twice');
LongOptions.Add('recursive');
LongOptions.Add('skip-dependencies');
LongOptions.Add('widgetset:');
@ -1708,6 +1713,10 @@ begin
BuildAll:=true;
PrintInfo('Parameter: --build-all');
end;
if HasOption('build-twice') then begin
BuildTwice:=true;
PrintInfo('Parameter: --build-twice');
end;
if HasShortOrLongOpt('r','recursive') then begin
BuildAll:=true;
BuildRecursive:=true;
@ -1817,6 +1826,9 @@ begin
writeln('-B, --build-all');
w(lisBuildAllFilesOfProjectPackageIDE);
writeln('');
writeln('--build-twice');
w('compile package twice and check if any unit was compiled again');
writeln('');
writeln('-r, --recursive');
w(lisApplyBuildFlagsBToDependenciesToo);
writeln('');

View File

@ -429,7 +429,7 @@ type
{%H-}Flags: TPkgCompileFlags; ShowAbort: boolean): TModalResult;
function CompileRequiredPackages(APackage: TLazPackage;
FirstDependency: TPkgDependency;
SkipDesignTimePackages: boolean;
SkipDesignTimePackages, BuildTwice: boolean;
Policy: TPackageUpdatePolicy): TModalResult;
function CompilePackage(APackage: TLazPackage; Flags: TPkgCompileFlags;
ShowAbort: boolean;
@ -2210,10 +2210,7 @@ begin
begin
FoundCompiling:=true;
if CompareFilenames(Msg.Filename,MainFilename)<>0 then
begin
debugln(['Warning: (lazarus) [TLazPackageGraph.ExtToolBuildStopped] on second compile of "',aPackage.Name,'" the unit "',Msg.GetShortFilename,'" was recompiled']);
break;
end;
end;
end;
if not FoundCompiling then
@ -2228,10 +2225,7 @@ begin
FoundCompiling:=true;
aFilename:=ExtractFilename(copy(Msg.Msg,length(FPCCompilingPattern)+1));
if CompareFilenames(aFilename,MainFilename)<>0 then
begin
debugln(['Warning: (lazarus) [TLazPackageGraph.ExtToolBuildStopped] on second compile of "',aPackage.Name,'" the unit "',aFilename,'" was recompiled']);
break;
end;
end;
end;
end;
@ -4155,7 +4149,7 @@ begin
end;
function TLazPackageGraph.CompileRequiredPackages(APackage: TLazPackage;
FirstDependency: TPkgDependency; SkipDesignTimePackages: boolean;
FirstDependency: TPkgDependency; SkipDesignTimePackages, BuildTwice: boolean;
Policy: TPackageUpdatePolicy): TModalResult;
var
BuildItems: TObjectList;
@ -4217,6 +4211,8 @@ begin
Flags:=[pcfDoNotCompileDependencies,pcfDoNotSaveEditorFiles,pcfGroupCompile];
if SkipDesignTimePackages then
Include(Flags,pcfSkipDesignTimePackages);
if BuildTwice then
Include(Flags,pcfCompileTwice);
if Policy=pupAsNeeded then
Include(Flags,pcfOnlyIfNeeded)
else
@ -4421,8 +4417,8 @@ function TLazPackageGraph.CompilePackage(APackage: TLazPackage;
Proc.Executable:=CompilerFilename;
Proc.Parameters:=CompilerParams;
if NeedBuildAll then
PkgCompileTool.Process.Parameters.Add('-B')
else if Run>0 then
PkgCompileTool.Process.Parameters.Add('-B');
if Run>0 then
begin
for i:=Proc.Parameters.Count-1 downto 0 do
if Proc.Parameters[i]='-B' then
@ -4437,7 +4433,7 @@ var
FPCParser: TFPCParser;
CompilerFilename: String;
CompilePolicy: TPackageUpdatePolicy;
NeedBuildAllFlag, NeedBuildAll, CompileTwice: Boolean;
NeedBuildAllFlag, NeedBuildAll: Boolean;
CompilerParams, CmdLineParams: TStrings;
Note: String;
WorkingDir: String;
@ -4464,7 +4460,8 @@ begin
else
CompilePolicy:=pupAsNeeded;
Result:=CompileRequiredPackages(APackage,nil,
pcfSkipDesignTimePackages in Flags,CompilePolicy);
pcfSkipDesignTimePackages in Flags,pcfCompileTwice in Flags,
CompilePolicy);
if Result<>mrOk then begin
DebugLn(['Error: (lazarus) Compile required packages failed: ',APackage.IDAsString]);
exit;
@ -4618,19 +4615,17 @@ begin
FHasCompiledFpmakePackages := True;
end;
CompileTwice:={$IFDEF EnableCompilePkgTwice}true{$ELSE}false{$ENDIF};
ExtToolData:=nil;
ExtToolData2:=nil;
PkgCompileTool:=nil;
PkgCompileTool2:=nil;
try
aTitle:=Format(lisPkgMangCompilePackage, [APackage.IDAsString]);
if CompileTwice then
if pcfCompileTwice in Flags then
aTitle:=aTitle+' (first time)';
SetupCompileTool(0,PkgCompileTool,ExtToolData,aTitle,Note,CompilerFilename,CompilerParams,NeedBuildAll);
if CompileTwice then
if pcfCompileTwice in Flags then
begin
aTitle:=Format(lisPkgMangCompilePackage, [APackage.IDAsString])+' (second time)';
SetupCompileTool(1,PkgCompileTool2,ExtToolData2,aTitle,Note,CompilerFilename,CompilerParams,NeedBuildAll);

View File

@ -4167,6 +4167,7 @@ begin
Result:=PackageGraph.CompileRequiredPackages(nil,
AProject.FirstRequiredDependency,
not (pfUseDesignTimePackages in AProject.Flags),
pcfCompileTwice in Flags,
CompilePolicy);
if Result<>mrOk then exit;
end;
@ -6170,7 +6171,7 @@ begin
CompilePolicy:=pupAsNeeded;
if pcfCompileDependenciesClean in Flags then
CompilePolicy:=pupOnRebuildingAll;
Result:=PackageGraph.CompileRequiredPackages(nil,Dependencies,false,
Result:=PackageGraph.CompileRequiredPackages(nil,Dependencies,false,pcfCompileTwice in Flags,
CompilePolicy);
if Result<>mrOk then begin
if ConsoleVerbosity>0 then