IDE: fixed changing TargetOS/CPU to default while project is not default

git-svn-id: trunk@28959 -
This commit is contained in:
mattias 2011-01-11 13:13:02 +00:00
parent 60cbebdb4f
commit 6bdecb6e7a
5 changed files with 126 additions and 108 deletions

View File

@ -50,9 +50,9 @@ type
function GetBuildMacroOverride(const MacroName: string): string; virtual; abstract;
function GetBuildMacroOverrides: TStrings; virtual; abstract;
function GetTargetOS(UseCache: boolean): string; virtual; abstract;
function GetTargetCPU(UseCache: boolean): string; virtual; abstract;
function GetLCLWidgetType(UseCache: boolean): string; virtual; abstract;
function GetTargetOS: string; virtual; abstract;
function GetTargetCPU: string; virtual; abstract;
function GetLCLWidgetType: string; virtual; abstract;
function GetRunCommandLine: string; virtual; abstract;
function GetProjectPublishDir: string; virtual; abstract;
@ -65,7 +65,7 @@ type
function GetTargetUnitFilename(AnUnitInfo: TUnitInfo): string; virtual; abstract;
procedure RescanCompilerDefines(ResetBuildTarget, ClearCaches,
WaitTillDone: boolean); virtual; abstract;
WaitTillDone, Quiet: boolean); virtual; abstract;
function CheckAmbiguousSources(const AFilename: string;
Compiling: boolean): TModalResult; virtual; abstract;

View File

@ -124,6 +124,9 @@ type
CompOptions: TBaseCompilerOptions): TModalResult;
procedure SetUnitSetCache(const AValue: TFPCUnitSetCache);
protected
fTargetOS: string;
fTargetCPU: string;
fLCLWidgetType: string;
OverrideTargetOS: string;
OverrideTargetCPU: string;
OverrideLCLWidgetType: string;
@ -145,9 +148,9 @@ type
function GetBuildMacroOverride(const MacroName: string): string; override;
function GetBuildMacroOverrides: TStrings; override;
function GetTargetOS(UseCache: boolean): string; override;
function GetTargetCPU(UseCache: boolean): string; override;
function GetLCLWidgetType(UseCache: boolean): string; override;
function GetTargetOS: string; override;
function GetTargetCPU: string; override;
function GetLCLWidgetType: string; override;
function GetRunCommandLine: string; override;
function GetProjectPublishDir: string; override;
@ -161,7 +164,7 @@ type
procedure UpdateEnglishErrorMsgFilename;
procedure RescanCompilerDefines(ResetBuildTarget, ClearCaches,
WaitTillDone: boolean); override;
WaitTillDone, Quiet: boolean); override;
procedure LoadFPCDefinesCaches;
procedure SaveFPCDefinesCaches;
property UnitSetCache: TFPCUnitSetCache read FUnitSetCache write SetUnitSetCache;
@ -185,7 +188,9 @@ type
// methods for building IDE (will be changed when project groups are there)
procedure SetBuildTarget(const TargetOS, TargetCPU, LCLWidgetType: string;
ScanFPCSrc: TBMScanFPCSources);
ScanFPCSrc: TBMScanFPCSources; Quiet: boolean);
procedure SetBuildTargetProject1(Quiet: boolean;
ScanFPCSrc: TBMScanFPCSources = bmsfsBackground);
procedure SetBuildTargetIDE;
function BuildTargetIDEIsDefault: boolean;
@ -242,6 +247,9 @@ begin
FFPCVerChangeStamp:=InvalidParseStamp;
MainBuildBoss:=Self;
inherited Create(AOwner);
fTargetOS:=GetDefaultTargetOS;
fTargetCPU:=GetDefaultTargetCPU;
fLCLWidgetType:=LCLPlatformDirNames[GetDefaultLCLWidgetType];
FUnitSetChangeStamp:=TFPCUnitSetCache.GetInvalidChangeStamp;
OnBackupFileInteractive:=@BackupFile;
@ -374,47 +382,20 @@ begin
Result.Values['LCLWidgetType']:=OverrideLCLWidgetType;
end;
function TBuildManager.GetTargetOS(UseCache: boolean): string;
function TBuildManager.GetTargetOS: string;
begin
if OverrideTargetOS<>'' then
Result:=OverrideTargetOS
else if (Project1<>nil) and (not UseCache) then
Result:=Project1.CompilerOptions.TargetOS
else
Result:='';
if (Result='') or (SysUtils.CompareText(Result,'default')=0) then
Result:=GetDefaultTargetOS;
Result:=GetFPCTargetOS(Result);
Result:=fTargetOS;
end;
function TBuildManager.GetTargetCPU(UseCache: boolean): string;
function TBuildManager.GetTargetCPU: string;
begin
if OverrideTargetCPU<>'' then
Result:=OverrideTargetCPU
else if (Project1<>nil) and (not UseCache) then
Result:=Project1.CompilerOptions.TargetCPU
else
Result:='';
if (Result='') or (SysUtils.CompareText(Result,'default')=0) then
Result:=GetDefaultTargetCPU;
Result:=GetFPCTargetCPU(Result);
Result:=fTargetCPU;
//debugln(['TBuildManager.GetTargetCPU ',Result]);
end;
function TBuildManager.GetLCLWidgetType(UseCache: boolean): string;
function TBuildManager.GetLCLWidgetType: string;
begin
if UseCache and (CodeToolBoss<>nil) then begin
Result:=CodeToolBoss.GlobalValues.Variables[ExternalMacroStart+'LCLWidgetType'];
end else begin
if OverrideLCLWidgetType<>'' then
Result:=OverrideLCLWidgetType
else if Project1<>nil then
Result:=lowercase(Project1.CompilerOptions.LCLWidgetType)
else
Result:='';
end;
if (Result='') or (Result='default') then
Result:=LCLPlatformDirNames[GetDefaultLCLWidgetType];
Result:=fLCLWidgetType;
end;
function TBuildManager.GetRunCommandLine: string;
@ -492,7 +473,7 @@ end;
function TBuildManager.GetProjectUsesAppBundle: Boolean;
begin
Result := (Project1.RunParameterOptions.HostApplicationFilename = '') and
(GetTargetOS(False) = 'darwin') and Project1.UseAppBundle;
(GetTargetOS = 'darwin') and Project1.UseAppBundle;
end;
function TBuildManager.GetTestProjectFilename(aProject: TProject): string;
@ -562,7 +543,7 @@ begin
end;
procedure TBuildManager.RescanCompilerDefines(ResetBuildTarget,
ClearCaches, WaitTillDone: boolean);
ClearCaches, WaitTillDone, Quiet: boolean);
var
TargetOS, TargetCPU: string;
CompilerFilename: String;
@ -610,15 +591,15 @@ begin
CodeToolBoss.FPCDefinesCache.SourceCaches.Clear;
end;
if ResetBuildTarget then
SetBuildTarget('','','',bmsfsSkip);
SetBuildTarget('','','',bmsfsSkip,true);
// start the compiler and ask for his settings
// provide an english message file
UpdateEnglishErrorMsgFilename;
// use current TargetOS, TargetCPU, compilerfilename and FPC source dir
TargetOS:=GetTargetOS(true);
TargetCPU:=GetTargetCPU(true);
TargetOS:=GetTargetOS;
TargetCPU:=GetTargetCPU;
CompilerFilename:=EnvironmentOptions.GetCompilerFilename;
FPCSrcDir:=EnvironmentOptions.GetFPCSourceDirectory; // needs FPCVer macro
@ -630,6 +611,7 @@ begin
' EnvFPCSrcDir=',EnvironmentOptions.FPCSourceDirectory,
' FPCSrcDir=',FPCSrcDir,
' WaitTillDone=',WaitTillDone,
' Quiet=',Quiet,
'']);
{$ENDIF}
@ -661,12 +643,13 @@ begin
// scan compiler, fpc sources and create indices for quick lookup
UnitSetCache.Init;
if (FUnitSetChangeStamp<>TFPCUnitSetCache.GetInvalidChangeStamp)
and (FUnitSetChangeStamp=UnitSetCache.ChangeStamp) then begin
if (FUnitSetChangeStamp=TFPCUnitSetCache.GetInvalidChangeStamp)
or (FUnitSetChangeStamp<>UnitSetCache.ChangeStamp) then begin
{$IFDEF VerboseFPCSrcScan}
debugln(['TBuildManager.RescanCompilerDefines nothing changed']);
{$ENDIF}
exit;
// save caches
SaveFPCDefinesCaches;
end;
FUnitSetChangeStamp:=UnitSetCache.ChangeStamp;
@ -681,9 +664,6 @@ begin
'']);
{$ENDIF}
// save caches
SaveFPCDefinesCaches;
// rebuild the define templates
// create template for FPC settings
ADefTempl:=CreateFPCTemplate(UnitSetCache,nil);
@ -707,16 +687,18 @@ begin
CodeToolBoss.DefineTree.ClearCache;
if not FoundSystemPPU then begin
IDEMessageDialog(lisCCOErrorCaption,
Format(lisTheProjectUsesTargetOSAndCPUTheSystemPpuForThisTar, [
TargetOS, TargetCPU, #13, #13]),
mtError,[mbOk]);
end else if (UnitSetCache<>nil) then begin
if UnitSetCache.GetFirstFPCCfg='' then begin
IDEMessageDialog(lisCCOWarningCaption,
lisTheCurrentFPCHasNoConfigFileItWillProbablyMissSome,
mtWarning,[mbOk]);
if not Quiet then begin
if not FoundSystemPPU then begin
IDEMessageDialog(lisCCOErrorCaption,
Format(lisTheProjectUsesTargetOSAndCPUTheSystemPpuForThisTar, [
TargetOS, TargetCPU, #13, #13]),
mtError,[mbOk]);
end else if (UnitSetCache<>nil) then begin
if UnitSetCache.GetFirstFPCCfg='' then begin
IDEMessageDialog(lisCCOWarningCaption,
lisTheCurrentFPCHasNoConfigFileItWillProbablyMissSome,
mtWarning,[mbOk]);
end;
end;
end;
end;
@ -1333,14 +1315,14 @@ end;
function TBuildManager.MacroFuncMakeExe(const Filename: string;
const Data: PtrInt; var Abort: boolean): string;
begin
Result:=MakeStandardExeFilename(GetTargetOS(true),Filename);
Result:=MakeStandardExeFilename(GetTargetOS,Filename);
//DebugLn('TMainIDE.MacroFuncMakeExe A ',Filename,' ',Result);
end;
function TBuildManager.MacroFuncMakeLib(const Filename: string;
const Data: PtrInt; var Abort: boolean): string;
begin
Result:=MakeStandardLibFilename(GetTargetOS(true),Filename);
Result:=MakeStandardLibFilename(GetTargetOS,Filename);
end;
function TBuildManager.MacroFuncProject(const Param: string; const Data: PtrInt;
@ -1372,7 +1354,7 @@ begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(LCL_PLATFORM)'
else
Result:=GetLCLWidgetType(true);
Result:=GetLCLWidgetType;
end;
function TBuildManager.MacroFuncTargetCPU(const Param: string;
@ -1381,7 +1363,7 @@ begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(CPU_TARGET)'
else
Result:=GetTargetCPU(true);
Result:=GetTargetCPU;
end;
function TBuildManager.MacroFuncTargetOS(const Param: string;
@ -1390,7 +1372,7 @@ begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(OS_TARGET)'
else
Result:=GetTargetOS(true);
Result:=GetTargetOS;
end;
function TBuildManager.MacroFuncIDEBuildOptions(const Param: string;
@ -1428,7 +1410,7 @@ begin
if Data=CompilerOptionMacroPlatformIndependent then
Result:='%(OS_TARGET)'
else
Result:=GetDefaultSrcOSForTargetOS(GetTargetOS(true));
Result:=GetDefaultSrcOSForTargetOS(GetTargetOS);
end;
function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt;
@ -1448,8 +1430,8 @@ function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt;
// Not from the fpc.exe, but from the real compiler
CompilerFilename:=EnvironmentOptions.GetCompilerFilename;
if CompilerFilename='' then exit;
TargetOS:=GetTargetOS(true);
TargetCPU:=GetTargetCPU(true);
TargetOS:=GetTargetOS;
TargetCPU:=GetTargetCPU;
ConfigCache:=CodeToolBoss.FPCDefinesCache.ConfigCaches.Find(
CompilerFilename,'',TargetOS,TargetCPU,true);
if ConfigCache=nil then exit;
@ -1867,43 +1849,78 @@ begin
end;
procedure TBuildManager.SetBuildTarget(const TargetOS, TargetCPU,
LCLWidgetType: string; ScanFPCSrc: TBMScanFPCSources);
LCLWidgetType: string; ScanFPCSrc: TBMScanFPCSources; Quiet: boolean);
var
OldTargetOS: String;
OldTargetCPU: String;
OldLCLWidgetType: String;
NewTargetOS: String;
NewTargetCPU: String;
NewLCLWidgetType: String;
FPCTargetChanged: Boolean;
LCLTargetChanged: Boolean;
begin
OldTargetOS:=GetTargetOS(true);
OldTargetCPU:=GetTargetCPU(true);
OldLCLWidgetType:=GetLCLWidgetType(true);
OldTargetOS:=fTargetOS;
OldTargetCPU:=fTargetCPU;
OldLCLWidgetType:=fLCLWidgetType;
OverrideTargetOS:=GetFPCTargetOS(TargetOS);
OverrideTargetCPU:=GetFPCTargetCPU(TargetCPU);
OverrideLCLWidgetType:=lowercase(LCLWidgetType);
NewTargetOS:=GetTargetOS(false);
NewTargetCPU:=GetTargetCPU(false);
NewLCLWidgetType:=GetLCLWidgetType(false);
FPCTargetChanged:=(OldTargetOS<>NewTargetOS)
or (OldTargetCPU<>NewTargetCPU);
LCLTargetChanged:=(OldLCLWidgetType<>NewLCLWidgetType);
// compute new TargetOS
if OverrideTargetOS<>'' then
fTargetOS:=OverrideTargetOS
else if Project1<>nil then
fTargetOS:=Project1.CompilerOptions.TargetOS
else
fTargetOS:='';
if (fTargetOS='') or (SysUtils.CompareText(fTargetOS,'default')=0) then
fTargetOS:=GetDefaultTargetOS;
fTargetOS:=GetFPCTargetOS(fTargetOS);
// compute new TargetCPU
if OverrideTargetCPU<>'' then
fTargetCPU:=OverrideTargetCPU
else if Project1<>nil then
fTargetCPU:=Project1.CompilerOptions.TargetCPU
else
fTargetCPU:='';
if (fTargetCPU='') or (SysUtils.CompareText(fTargetCPU,'default')=0) then
fTargetCPU:=GetDefaultTargetCPU;
fTargetCPU:=GetFPCTargetCPU(fTargetCPU);
// compute new LCLWidgetType
if OverrideLCLWidgetType<>'' then
fLCLWidgetType:=OverrideLCLWidgetType
else if Project1<>nil then
fLCLWidgetType:=Project1.CompilerOptions.LCLWidgetType
else
fLCLWidgetType:='';
if (fLCLWidgetType='') or (SysUtils.CompareText(fLCLWidgetType,'default')=0) then
fLCLWidgetType:=LCLPlatformDirNames[GetDefaultLCLWidgetType];
fLCLWidgetType:=lowercase(fLCLWidgetType);
FPCTargetChanged:=(OldTargetOS<>fTargetOS)
or (OldTargetCPU<>fTargetCPU)
or (CodeToolBoss.DefineTree.FindDefineTemplateByName(
StdDefTemplLazarusSrcDir,true)=nil);
LCLTargetChanged:=(OldLCLWidgetType<>fLCLWidgetType);
if FPCTargetChanged or LCLTargetChanged then begin
//DebugLn('TMainIDE.SetBuildTarget Old=',OldTargetCPU,'-',OldTargetOS,'-',OldLCLWidgetType,
// ' New=',NewTargetCPU,'-',NewTargetOS,'-',NewLCLWidgetType,' FPC=',dbgs(FPCTargetChanged),' LCL=',dbgs(LCLTargetChanged));
// ' New=',fTargetCPU,'-',fTargetOS,'-',fLCLWidgetType,' FPC=',dbgs(FPCTargetChanged),' LCL=',dbgs(LCLTargetChanged));
IncreaseBuildMacroChangeStamp;
end;
if LCLTargetChanged then
CodeToolBoss.SetGlobalValue(ExternalMacroStart+'LCLWidgetType',NewLCLWidgetType);
CodeToolBoss.SetGlobalValue(ExternalMacroStart+'LCLWidgetType',fLCLWidgetType);
if FPCTargetChanged and (ScanFPCSrc<>bmsfsSkip) then
RescanCompilerDefines(false,false,ScanFPCSrc=bmsfsWaitTillDone);
RescanCompilerDefines(false,false,ScanFPCSrc=bmsfsWaitTillDone,Quiet);
//if (PackageGraph<>nil) and (PackageGraph.CodeToolsPackage<>nil) then debugln(['TBuildManager.SetBuildTarget CODETOOLS OUTDIR=',PackageGraph.CodeToolsPackage.CompilerOptions.GetUnitOutPath(true,coptParsed),' ',PackageGraph.CodeToolsPackage.CompilerOptions.ParsedOpts.ParsedStamp[pcosOutputDir],' ',CompilerParseStamp]);
end;
procedure TBuildManager.SetBuildTargetProject1(Quiet: boolean;
ScanFPCSrc: TBMScanFPCSources);
begin
SetBuildTarget('','','',ScanFPCSrc,Quiet);
end;
procedure TBuildManager.SetBuildTargetIDE;
var
NewTargetOS: String;
@ -1920,7 +1937,7 @@ begin
if (NewTargetCPU='') or (NewTargetCPU='default') then
NewTargetCPU:=GetDefaultTargetCPU;
debugln(['TBuildManager.SetBuildTargetIDE OS=',NewTargetOS,' CPU=',NewTargetCPU,' WS=',NewLCLWidgetSet]);
SetBuildTarget(NewTargetOS,NewTargetCPU,NewLCLWidgetSet,bmsfsBackground);
SetBuildTarget(NewTargetOS,NewTargetCPU,NewLCLWidgetSet,bmsfsBackground,false);
end;
function TBuildManager.BuildTargetIDEIsDefault: boolean;

View File

@ -101,7 +101,7 @@ begin
//debugln(['TFPCSrcScan.OnFilesGathered BuildBoss.RescanCompilerDefines ...']);
if BuildBoss<>nil then
BuildBoss.RescanCompilerDefines(false,false,false);
BuildBoss.RescanCompilerDefines(false,false,false,true);
end;
FreeAndNil(Files);
// delete item in progress window

View File

@ -103,8 +103,8 @@ begin
GatherProjectOptions(sl);
GatherActiveOptions(sl);
TargetOS:=BuildBoss.GetTargetOS(true);
TargetCPU:=BuildBoss.GetTargetCPU(true);
TargetOS:=BuildBoss.GetTargetOS;
TargetCPU:=BuildBoss.GetTargetCPU;
CompilerFilename:=EnvironmentOptions.GetCompilerFilename;
FPCSrcDir:=EnvironmentOptions.GetFPCSourceDirectory; // needs FPCVer macro
UnitSetCache:=CodeToolBoss.FPCDefinesCache.FindUnitSet(
@ -132,8 +132,8 @@ var
WorkDir: String;
fs: TFileStream;
begin
TargetOS:=BuildBoss.GetTargetOS(true);
TargetCPU:=BuildBoss.GetTargetCPU(true);
TargetOS:=BuildBoss.GetTargetOS;
TargetCPU:=BuildBoss.GetTargetCPU;
CompilerFilename:=EnvironmentOptions.GetCompilerFilename;
CompilerOptions:='';
Cfg:=CodeToolBoss.FPCDefinesCache.ConfigCaches.Find(
@ -253,8 +253,8 @@ end;
procedure TIDEFPCInfoDialog.GatherActiveOptions(sl: TStrings);
begin
sl.Add('Active target:');
sl.Add('TargetOS='+BuildBoss.GetTargetOS(true));
sl.Add('TargetCPU='+BuildBoss.GetTargetCPU(true));
sl.Add('TargetOS='+BuildBoss.GetTargetOS);
sl.Add('TargetCPU='+BuildBoss.GetTargetCPU);
sl.Add('');
end;

View File

@ -3472,11 +3472,14 @@ begin
if (Index<0) or (Index>=Project1.BuildModes.Count) then exit;
NewMode:=Project1.BuildModes[Index];
if NewMode=Project1.ActiveBuildMode then exit;
if not (ToolStatus in [itNone,itDebugger]) then begin
IDEMessageDialog('Error','You can not change the build mode while compiling.',
mtError,[mbOk]);
exit;
end;
Project1.ActiveBuildMode:=NewMode;
MainBuildBoss.SetBuildTarget(Project1.CompilerOptions.TargetOS,
Project1.CompilerOptions.TargetCPU,Project1.CompilerOptions.LCLWidgetType,
bmsfsBackground);
MainBuildBoss.SetBuildTargetProject1(false);
end;
function TMainIDE.CreateDesignerForComponent(AnUnitInfo: TUnitInfo;
@ -4648,7 +4651,7 @@ begin
if MacroValueChanged then CodeToolBoss.DefineTree.ClearCache;
//debugln(['TMainIDE.DoEnvironmentOptionsAfterWrite FPCCompilerChanged=',FPCCompilerChanged,' FPCSrcDirChanged=',FPCSrcDirChanged,' LazarusSrcDirChanged=',LazarusSrcDirChanged]);
if FPCCompilerChanged or FPCSrcDirChanged then
MainBuildBoss.RescanCompilerDefines(true,false,false);
MainBuildBoss.SetBuildTargetProject1(false);
// update environment
UpdateDesigners;
@ -4813,9 +4816,7 @@ begin
if Restore then
AProject.RestoreBuildModes;
IncreaseCompilerParseStamp;
MainBuildBoss.SetBuildTarget(Project1.CompilerOptions.TargetOS,
Project1.CompilerOptions.TargetCPU,Project1.CompilerOptions.LCLWidgetType,
bmsfsBackground);
MainBuildBoss.SetBuildTargetProject1(false);
if (not Restore) and AProject.CompilerOptions.UseAsDefault then
begin
aFilename:=AppendPathDelim(GetPrimaryConfigPath)+DefaultProjectCompilerOptionsFilename;
@ -4845,7 +4846,7 @@ end;
procedure TMainIDE.mnuEnvRescanFPCSrcDirClicked(Sender: TObject);
begin
MainBuildBoss.RescanCompilerDefines(false,true,false);
MainBuildBoss.RescanCompilerDefines(false,true,false,false);
end;
procedure TMainIDE.SaveEnvironment;
@ -7854,7 +7855,7 @@ begin
EnvironmentOptions.LastSavedProjectFile:=Project1.ProjectInfoFile;
EnvironmentOptions.Save(false);
MainBuildBoss.RescanCompilerDefines(true,false,false);
MainBuildBoss.SetBuildTargetProject1(false);
// load required packages
PkgBoss.OpenProjectDependencies(Project1,true);
@ -9961,7 +9962,7 @@ begin
PkgBoss.AddDefaultDependencies(Project1);
// rebuild codetools defines
MainBuildBoss.RescanCompilerDefines(true,false,false);
MainBuildBoss.SetBuildTargetProject1(false);
// (i.e. remove old project specific things and create new)
IncreaseCompilerParseStamp;
@ -11134,7 +11135,7 @@ begin
// create application bundle
if Project1.UseAppBundle and (Project1.MainUnitID>=0)
and (MainBuildBoss.GetLCLWidgetType(true)=LCLPlatformDirNames[lpCarbon])
and (MainBuildBoss.GetLCLWidgetType=LCLPlatformDirNames[lpCarbon])
then begin
Result:=CreateApplicationBundle(TargetExeName, Project1.Title);
if not (Result in [mrOk,mrIgnore]) then exit;
@ -11666,7 +11667,7 @@ begin
if Result<>mrOk then exit;
finally
MainBuildBoss.SetBuildTarget('','','',bmsfsBackground);
MainBuildBoss.SetBuildTargetProject1(true);
DoCheckFilesOnDisk;
MessagesView.EndBlock;
@ -13894,7 +13895,7 @@ begin
// create defines for the lazarus sources
SetupLazarusDirectory(InteractiveSetup);
MainBuildBoss.RescanCompilerDefines(true,false,false);
MainBuildBoss.SetBuildTargetProject1(false);
// load include file relationships
AFilename:=AppendPathDelim(GetPrimaryConfigPath)+CodeToolsIncludeLinkFile;