From 0272ffb1cc61259739f57933f3e57d4c0d4ec764 Mon Sep 17 00:00:00 2001 From: mattias Date: Wed, 21 Dec 2011 12:38:16 +0000 Subject: [PATCH] IDE: macros: fixed nested macros, bug #20941 git-svn-id: trunk@34348 - --- ide/compileroptions.pp | 22 ++++++++++++++-------- ide/main.pp | 3 +++ ide/project.pp | 19 +++++-------------- packager/packagedefs.pas | 19 +++++++++++-------- packager/packagesystem.pas | 1 - 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/ide/compileroptions.pp b/ide/compileroptions.pp index 73b2df5a76..59907e47d1 100644 --- a/ide/compileroptions.pp +++ b/ide/compileroptions.pp @@ -3771,29 +3771,35 @@ begin s:=OptionText; // parse locally (macros depending on owner, like pkgdir and build macros) - //DebugLn(['TParsedCompilerOptions.DoParseOption local "',s,'" ...']); if Assigned(OnLocalSubstitute) then - s:=OnLocalSubstitute(s,PlatformIndependent); - // parse globally (general macros) - //DebugLn(['TParsedCompilerOptions.DoParseOption global "',s,'" ...']); - s:=ParseString(Self,s,PlatformIndependent); + begin + //DebugLn(['TParsedCompilerOptions.DoParseOption local "',s,'" ...']); + s:=OnLocalSubstitute(s,PlatformIndependent) + end else + begin + //DebugLn(['TParsedCompilerOptions.DoParseOption global "',s,'" ...']); + s:=ParseString(Self,s,PlatformIndependent); + end; //DebugLn(['TParsedCompilerOptions.DoParseOption complete "',s,'" ...']); // improve if Option=pcosBaseDir then // base directory s:=AppendPathDelim(TrimFilename(s)) - else if Option in ParsedCompilerFilenames then begin + else if Option in ParsedCompilerFilenames then + begin // make filename absolute MakeFilenameAbsolute(s); end - else if Option in ParsedCompilerDirectories then begin + else if Option in ParsedCompilerDirectories then + begin // make directory absolute s:=TrimFilename(s); if Option<>pcosBaseDir then MakeFilenameAbsolute(s); s:=AppendPathDelim(s); end - else if Option in ParsedCompilerSearchPaths then begin + else if Option in ParsedCompilerSearchPaths then + begin // make search paths absolute BaseDirectory:=GetBaseDir; s:=TrimSearchPath(s,BaseDirectory); diff --git a/ide/main.pp b/ide/main.pp index 105402687e..f95453751d 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -13550,6 +13550,9 @@ var MacroLName:string; begin if TheMacro=nil then begin DebugLn('WARNING: Macro not defined: "'+MacroName+'".'); + {$IFDEF VerboseMacroNotDefined} + DumpStack; + {$ENDIF} s:=''; //MessageDlg('Unknown Macro','Macro not defined: "'+s+'".',mtError,[mbAbort],0); Handled:=true; diff --git a/ide/project.pp b/ide/project.pp index ef808220df..da9e7539e5 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -2548,7 +2548,6 @@ begin FBookmarks := TProjectBookmarkList.Create; FMacroEngine:=TTransferMacroList.Create; - FMacroEngine.MarkUnhandledMacros:=false; FMacroEngine.OnSubstitution:=@OnMacroEngineSubstitution; FBuildModes:=TProjectBuildModes.Create(nil); FBuildModes.LazProject:=Self; @@ -5510,17 +5509,9 @@ begin end; // check local macros - {if CompareText(MacroName,'PkgOutDir')=0 then begin - Handled:=true; - if Data=CompilerOptionMacroNormal then - s:=CompilerOptions.ParsedOpts.GetParsedValue(pcosOutputDir) - else - s:=CompilerOptions.ParsedOpts.GetParsedPIValue(pcosOutputDir); - end - else if CompareText(MacroName,'PkgDir')=0 then begin - Handled:=true; - s:=FDirectory; - end;} + + // check global macros + GlobalMacroList.ExecuteMacro(MacroName,s,Data,Handled,Abort,Depth); end; function TProject.SearchFile(const ShortFilename: string; @@ -5779,8 +5770,8 @@ begin CompOpts:=TProjectCompilerOptions(Owner); //debugln(['TProjectCompilationToolOptions.SubstituteMacros ',DbgSName(Owner),' ',CompOpts.LazProject<>nil]); s:=CompOpts.SubstituteProjectMacros(s,false); - end; - inherited SubstituteMacros(s); + end else + inherited SubstituteMacros(s); end; procedure TProjectCompilationToolOptions.Clear; diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index 3eb57af9cc..ea2076aa7e 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -1598,13 +1598,11 @@ begin if fFullFilenameStamp<>CompilerParseStamp then begin fFullFilename:=Filename; fFullFilenameStamp:=CompilerParseStamp; - if LazPackage<>nil then begin - // substitute locally - LazPackage.SubstitutePkgMacros(fFullFilename,false); - end; - // substitute globally - IDEMacros.SubstituteMacros(fFullFilename); - fFullFilename:=CleanAndExpandFilename(fFullFilename); + if LazPackage<>nil then + LazPackage.SubstitutePkgMacros(fFullFilename,false) + else + IDEMacros.SubstituteMacros(fFullFilename); + fFullFilename:=TrimAndExpandFilename(fFullFilename); end; Result:=fFullFilename; end; @@ -2135,15 +2133,21 @@ begin s:=CompilerOptions.ParsedOpts.GetParsedValue(pcosOutputDir) else s:=CompilerOptions.ParsedOpts.GetParsedPIValue(pcosOutputDir); + exit; end else if CompareText(MacroName,'PkgDir')=0 then begin Handled:=true; s:=FDirectory; + exit; end else if CompareText(MacroName,'PkgName')=0 then begin Handled:=true; s:=Name; + exit; end; + + // check global macros + GlobalMacroList.ExecuteMacro(MacroName,s,Data,Handled,Abort,Depth); end; procedure TLazPackage.SetUserReadOnly(const AValue: boolean); @@ -2511,7 +2515,6 @@ begin FFiles:=TFPList.Create; FRemovedFiles:=TFPList.Create; FMacros:=TTransferMacroList.Create; - FMacros.MarkUnhandledMacros:=false; FMacros.OnSubstitution:=@OnMacroListSubstitution; FCompilerOptions:=TPkgCompilerOptions.Create(Self); FLazCompilerOptions:=FCompilerOptions; diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index 2e2db5a8e2..c8a6f46de1 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -4337,7 +4337,6 @@ begin // (this way the fallback creates the same amount of target directories) Dir:=APackage.CompilerOptions.ParsedOpts.UnparsedValues[pcosOutputDir]; Dir:=APackage.SubstitutePkgMacros(Dir,false); - GlobalMacroList.SubstituteStr(Dir); if FilenameIsAbsolute(Dir) then begin // it is not relative => create a default one Dir:='$(TargetOS)-$(TargetCPU)';