diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 91150a5995..188d79f5a9 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -772,6 +772,7 @@ type function GetUnitPaths: string; function GetFPCVerNumbers(out FPCVersion, FPCRelease, FPCPatch: integer): boolean; function GetFPCVer: string; // e.g. 2.7.1 + function GetFPC_FULLVERSION: integer; // e.g. 20701 function IndexOfUsedCfgFile: integer; procedure IncreaseChangeStamp; property ChangeStamp: integer read FChangeStamp; @@ -7867,6 +7868,24 @@ begin Result:=''; end; +function TFPCTargetConfigCache.GetFPC_FULLVERSION: integer; +var + v: String; + FPCVersion: integer; + FPCRelease: integer; + FPCPatch: integer; +begin + if Defines<>nil then + Result:=StrToIntDef(Defines['FPC_FULLVERSION'],0) + else + Result:=0; + if Result=0 then begin + v:={$I %FPCVERSION%}; + SplitFPCVersion(v,FPCVersion,FPCRelease,FPCPatch); + Result:=(FPCVersion*100+FPCRelease)*100+FPCPatch; + end; +end; + function TFPCTargetConfigCache.IndexOfUsedCfgFile: integer; begin if ConfigFiles=nil then exit(-1); diff --git a/ide/buildmanager.pas b/ide/buildmanager.pas index 2b8f868e97..8aa5424ca1 100644 --- a/ide/buildmanager.pas +++ b/ide/buildmanager.pas @@ -64,6 +64,7 @@ type FFPCSrcScans: TFPCSrcScans; // Macro FPCVer FFPCVer: string; + FFPC_FULLVERSION: integer; FFPCVerChangeStamp: integer; // Macro InstantFPCCache FMacroInstantFPCCache: string; @@ -87,6 +88,8 @@ type var {%H-}Abort: boolean): string; function MacroFuncFPCVer(const {%H-}Param: string; const {%H-}Data: PtrInt; var {%H-}Abort: boolean): string; + function MacroFuncFPC_FULLVERSION(const {%H-}Param: string; const {%H-}Data: PtrInt; + var {%H-}Abort: boolean): string; function MacroFuncLCLWidgetType(const {%H-}Param: string; const Data: PtrInt; var {%H-}Abort: boolean): string; function MacroFuncLazVer(const {%H-}Param: string; const Data: PtrInt; @@ -370,6 +373,8 @@ begin lisSrcOS,@MacroFuncSrcOS,[])); GlobalMacroList.Add(TTransferMacro.Create('FPCVer','', lisFPCVersionEG222, @MacroFuncFPCVer, [])); + GlobalMacroList.Add(TTransferMacro.Create('FPC_FULLVERSION','', + lisFPCFullVersionEG20701, @MacroFuncFPC_FULLVERSION, [])); GlobalMacroList.Add(TTransferMacro.Create('Params','', lisCommandLineParamsOfProgram,@MacroFuncParams,[])); GlobalMacroList.Add(TTransferMacro.Create('ProjFile','', @@ -2034,7 +2039,7 @@ end; function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt; var Abort: boolean): string; - function Compute: string; + procedure Compute; var TargetOS: String; TargetCPU: String; @@ -2042,9 +2047,10 @@ function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt; ConfigCache: TFPCTargetConfigCache; s: string; begin + FFPC_FULLVERSION:=0; if OverrideFPCVer<>'' then - exit(OverrideFPCVer); - Result:={$I %FPCVERSION%}; // Version.Release.Patch + FFPCVer:=OverrideFPCVer; + FFPCVer:={$I %FPCVERSION%}; // Version.Release.Patch if CodeToolBoss<>nil then begin // fetch the FPC version from the current compiler // Not from the fpc.exe, but from the real compiler @@ -2062,22 +2068,31 @@ function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt; then exit; end; - Result:=ConfigCache.GetFPCVer; + FFPCVer:=ConfigCache.GetFPCVer; + FFPC_FULLVERSION:=ConfigCache.GetFPC_FULLVERSION; end; end; begin if FFPCVerChangeStamp<>CompilerParseStamp then begin - FFPCVer:=Compute; + Compute; FFPCVerChangeStamp:=CompilerParseStamp; - {$IFDEF VerboseFPCSrcScan} - debugln(['TBuildManager.MacroFuncFPCVer ',FFPCVer]); - {$ENDIF} + { $IFDEF VerboseFPCSrcScan} + debugln(['TBuildManager.MacroFuncFPCVer FPCVer=',FFPCVer,' FPC_FULLVERSION=',FFPC_FULLVERSION]); + { $ENDIF} end; Result:=FFPCVer; end; +function TBuildManager.MacroFuncFPC_FULLVERSION(const Param: string; + const Data: PtrInt; var Abort: boolean): string; +begin + if FFPCVerChangeStamp<>CompilerParseStamp then + MacroFuncFPCVer(Param,Data,Abort); + Result:=IntToStr(FFPC_FULLVERSION); +end; + function TBuildManager.MacroFuncParams(const Param: string; const Data: PtrInt; var Abort: boolean): string; begin diff --git a/ide/compileroptions.pp b/ide/compileroptions.pp index 1889bb0f36..b5c6df0e74 100644 --- a/ide/compileroptions.pp +++ b/ide/compileroptions.pp @@ -138,10 +138,14 @@ type { TIDECfgScriptEngine } TIDECfgScriptEngine = class(TCTConfigScriptEngine) + private + FProjValuesAvailable: boolean; protected function IsCustomFunction(FunctionName: PChar): boolean; override; procedure RunCustomSimpleFunction(FunctionName: PChar; Value: PCTCfgScriptVariable); override; + public + property ProjValuesAvailable: boolean read FProjValuesAvailable write FProjValuesAvailable; end; type @@ -1018,6 +1022,7 @@ begin 'G': if (CompareIdentifiers(FunctionName,'GetIDEValue')=0) or (CompareIdentifiers(FunctionName,'GetEnv')=0) + or (ProjValuesAvailable and (CompareIdentifiers(FunctionName,'GetProjValue')=0)) then exit(true); end; Result:=false; @@ -1027,6 +1032,7 @@ procedure TIDECfgScriptEngine.RunCustomSimpleFunction(FunctionName: PChar; Value: PCTCfgScriptVariable); var VarName: String; + s: String; begin case UpChars[FunctionName^] of 'G': @@ -1049,6 +1055,16 @@ begin begin VarName:=GetCTCSVariableAsString(Value); SetCTCSVariableAsString(Value,GetEnvironmentVariableUTF8(VarName)); + end else if ProjValuesAvailable + and (CompareIdentifiers(FunctionName,'GetProjValue')=0) then + begin + VarName:=GetCTCSVariableAsString(Value); + if CompareIdentifiers(PChar(VarName),'FPC_FULLVERSION')=0 then + begin + s:='$(FPC_FULLVERSION)'; + GlobalMacroList.SubstituteStr(s); + SetCTCSVariableAsNumber(Value,StrToIntDef(s,0)); + end; end; end; end; diff --git a/ide/frames/compiler_other_options.pas b/ide/frames/compiler_other_options.pas index bedb9d24e8..61493ea604 100644 --- a/ide/frames/compiler_other_options.pas +++ b/ide/frames/compiler_other_options.pas @@ -542,6 +542,8 @@ begin AddWord('GetIDEValue(''LCLWidgetType'')'); AddWord('GetEnv(''USER'')'); AddWord('GetEnv(''HOME'')'); + if FCompOptions is TPkgCompilerOptions then + AddWord('GetProjValue(''FPC_FULLVERSION'')'); // add result variables for pcov:=low(ParsedCompilerOptsVars) to high(ParsedCompilerOptsVars) do diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 8d30ed4ddb..6863bb9046 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -4953,6 +4953,7 @@ resourcestring lisTheUnitSearchPathOfContainsTheSourceDirectoryOfPac = 'The unit search ' +'path of "%s" contains the source directory "%s" of package %s'; lisFPCVersionEG222 = 'FPC Version (e.g. 2.2.2)'; + lisFPCFullVersionEG20701 = 'FPC version as one number (e.g. 20701)'; lisLAZVer = 'Lazarus Version (e.g. 1.2.4)'; lisMissingIdentifiers = 'Missing identifiers'; lisChooseAFPDocLink = 'Choose a FPDoc link'; diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index ea78c9d8c8..271d1c64aa 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -4093,6 +4093,7 @@ begin inherited Create(AOwner); if AOwner<>nil then FLazPackage := AOwner as TLazPackage; + ParsedOpts.MacroValues.ProjValuesAvailable:=true; end; class function TPkgCompilerOptions.GetGroupCaption: string; diff --git a/packager/packagelinks.pas b/packager/packagelinks.pas index b666514cab..2899c0a328 100644 --- a/packager/packagelinks.pas +++ b/packager/packagelinks.pas @@ -94,7 +94,7 @@ type procedure SetFilename(const AValue: string); procedure SetOrigin(const AValue: TPkgLinkOrigin); public - constructor Create; + constructor Create; override; destructor Destroy; override; function MakeSense: boolean; function GetEffectiveFilename: string; diff --git a/packager/pkglinksdlg.pas b/packager/pkglinksdlg.pas index af93d84704..38426dce5b 100644 --- a/packager/pkglinksdlg.pas +++ b/packager/pkglinksdlg.pas @@ -53,7 +53,7 @@ type FLPKInfo: TLPKInfo; FVisible: boolean; public - constructor Create; + constructor Create; override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; property Origin;