|
@@ -65,6 +65,8 @@ var
|
|
|
TestOutputDir,
|
|
|
OutputDir : string;
|
|
|
CompilerBin,
|
|
|
+{ CompilerCPU and CompilerTarget are lowercased at start
|
|
|
+ to avoid need to call lowercase again and again ... }
|
|
|
CompilerCPU,
|
|
|
CompilerTarget,
|
|
|
CompilerVersion,
|
|
@@ -91,6 +93,9 @@ const
|
|
|
RemoteAddr : string = '';
|
|
|
RemotePath : string = '/tmp';
|
|
|
RemotePara : string = '';
|
|
|
+ RemoteShell : string = '';
|
|
|
+ RemoteShellBase : string = '';
|
|
|
+ RemoteShellNeedsExport : boolean = false;
|
|
|
rshprog : string = 'rsh';
|
|
|
rcpprog : string = 'rcp';
|
|
|
rquote : char = '''';
|
|
@@ -102,6 +107,7 @@ const
|
|
|
TargetHasDosStyleDirectories : boolean = false;
|
|
|
TargetAmigaLike : boolean = false;
|
|
|
TargetIsMacOS : boolean = false;
|
|
|
+ TargetIsUnix : boolean = false;
|
|
|
|
|
|
{ extracted from rtl/macos/macutils.inc }
|
|
|
|
|
@@ -266,6 +272,16 @@ begin
|
|
|
SplitFileName:=n+e;
|
|
|
end;
|
|
|
|
|
|
+Function SplitFileBase(const s:string):string;
|
|
|
+var
|
|
|
+ p : dirstr;
|
|
|
+ n : namestr;
|
|
|
+ e : extstr;
|
|
|
+begin
|
|
|
+ FSplit(s,p,n,e);
|
|
|
+ SplitFileBase:=n;
|
|
|
+end;
|
|
|
+
|
|
|
|
|
|
function ForceExtension(Const HStr,ext:String):String;
|
|
|
{
|
|
@@ -489,6 +505,8 @@ end;
|
|
|
|
|
|
|
|
|
function GetCompilerVersion:boolean;
|
|
|
+const
|
|
|
+ CompilerVersionDebugWritten : boolean = false;
|
|
|
begin
|
|
|
if CompilerVersion='' then
|
|
|
begin
|
|
@@ -497,36 +515,49 @@ begin
|
|
|
end
|
|
|
else
|
|
|
GetCompilerVersion:=true;
|
|
|
- if GetCompilerVersion then
|
|
|
- Verbose(V_Debug,'Compiler Version: "'+CompilerVersion+'"');
|
|
|
+ if GetCompilerVersion and not CompilerVersionDebugWritten then
|
|
|
+ begin
|
|
|
+ Verbose(V_Debug,'Compiler Version: "'+CompilerVersion+'"');
|
|
|
+ CompilerVersionDebugWritten:=true;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
|
function GetCompilerCPU:boolean;
|
|
|
+const
|
|
|
+ CompilerCPUDebugWritten : boolean = false;
|
|
|
begin
|
|
|
if CompilerCPU='' then
|
|
|
begin
|
|
|
GetCompilerCPU:=GetCompilerInfo(compcpu);
|
|
|
- CompilerCPU:=DefaultCompilerCPU;
|
|
|
+ CompilerCPU:=lowercase(DefaultCompilerCPU);
|
|
|
end
|
|
|
else
|
|
|
GetCompilerCPU:=true;
|
|
|
- if GetCompilerCPU then
|
|
|
- Verbose(V_Debug,'Compiler CPU: "'+CompilerCPU+'"');
|
|
|
+ if GetCompilerCPU and not CompilerCPUDebugWritten then
|
|
|
+ begin
|
|
|
+ Verbose(V_Debug,'Compiler CPU: "'+CompilerCPU+'"');
|
|
|
+ CompilerCPUDebugWritten:=true;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
|
function GetCompilerTarget:boolean;
|
|
|
+const
|
|
|
+ CompilerTargetDebugWritten : boolean = false;
|
|
|
begin
|
|
|
if CompilerTarget='' then
|
|
|
begin
|
|
|
GetCompilerTarget:=GetCompilerInfo(comptarget);
|
|
|
- CompilerTarget:=DefaultCompilerTarget;
|
|
|
+ CompilerTarget:=lowercase(DefaultCompilerTarget);
|
|
|
end
|
|
|
else
|
|
|
GetCompilerTarget:=true;
|
|
|
- if GetCompilerTarget then
|
|
|
- Verbose(V_Debug,'Compiler Target: "'+CompilerTarget+'"');
|
|
|
+ if GetCompilerTarget and not CompilerTargetDebugWritten then
|
|
|
+ begin
|
|
|
+ Verbose(V_Debug,'Compiler Target: "'+CompilerTarget+'"');
|
|
|
+ CompilerTargetDebugWritten:=true;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -548,7 +579,7 @@ var
|
|
|
begin
|
|
|
{ Call this first to ensure that CompilerTarget is not empty }
|
|
|
res:=GetCompilerTarget;
|
|
|
- LTarget := lowercase(CompilerTarget);
|
|
|
+ LTarget := CompilerTarget;
|
|
|
TargetHasDosStyleDirectories :=
|
|
|
(LTarget='emx') or
|
|
|
(LTarget='go32v2') or
|
|
@@ -564,6 +595,20 @@ begin
|
|
|
(LTarget='morphos');
|
|
|
TargetIsMacOS:=
|
|
|
(LTarget='macos');
|
|
|
+ { Base on whether UNIX is defined as default macro
|
|
|
+ in extradefines in systesms/i_XXX.pas units }
|
|
|
+ TargetIsUnix:=
|
|
|
+ (LTarget='linux') or
|
|
|
+ (LTarget='linux6432') or
|
|
|
+ (LTarget='freebsd') or
|
|
|
+ (LTarget='openbsd') or
|
|
|
+ (LTarget='netbsd') or
|
|
|
+ (LTarget='beos') or
|
|
|
+ (LTarget='haiku') or
|
|
|
+ (LTarget='solaris') or
|
|
|
+ (LTarget='iphonesim') or
|
|
|
+ (LTarget='darwin');
|
|
|
+
|
|
|
{ Set ExeExt for CompilerTarget.
|
|
|
This list has been set up 2011-06 using the information in
|
|
|
compiler/system/i_XXX.pas units.
|
|
@@ -595,7 +640,7 @@ var
|
|
|
begin
|
|
|
{ Call this first to ensure that CompilerTarget is not empty }
|
|
|
res:=GetCompilerTarget;
|
|
|
- LTarget := lowercase(CompilerTarget);
|
|
|
+ LTarget := CompilerTarget;
|
|
|
UseOSOnly:= (LTarget='emx') or
|
|
|
(LTarget='go32v2') or
|
|
|
(LTarget='os2');
|
|
@@ -609,7 +654,7 @@ var
|
|
|
begin
|
|
|
{ Call this first to ensure that CompilerTarget is not empty }
|
|
|
res:=GetCompilerTarget;
|
|
|
- LTarget := lowercase(CompilerTarget);
|
|
|
+ LTarget := CompilerTarget;
|
|
|
{ Feel free to add other targets here }
|
|
|
if (LTarget='go32v2') then
|
|
|
TargetCanCompileLibraries:=false;
|
|
@@ -626,12 +671,12 @@ begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function TestOutputFileName(Const s,ext:String):String;
|
|
|
+function TestOutputFileName(Const pref,base,ext:String):String;
|
|
|
begin
|
|
|
{$ifndef macos}
|
|
|
- TestOutputFileName:=TestOutputDir+'/'+ForceExtension(SplitFileName(s),ext);
|
|
|
+ TestOutputFileName:=TestOutputDir+'/'+ForceExtension(pref+SplitFileName(base),ext);
|
|
|
{$else macos}
|
|
|
- TestOutputFileName:=ConcatMacPath(TestOutputDir,ForceExtension(SplitFileName(s),ext));
|
|
|
+ TestOutputFileName:=ConcatMacPath(TestOutputDir,ForceExtension(pref+SplitFileName(base),ext));
|
|
|
{$endif macos}
|
|
|
end;
|
|
|
|
|
@@ -675,20 +720,21 @@ begin
|
|
|
RunCompiler:=false;
|
|
|
args:='-n -T'+CompilerTarget+' -Fu'+RTLUnitsDir;
|
|
|
args:=args+' -FE'+TestOutputDir;
|
|
|
-{$ifdef macos}
|
|
|
- args:=args+' -WT '; {tests should be compiled as MPWTool}
|
|
|
-{$endif macos}
|
|
|
+ if TargetIsMacOS then
|
|
|
+ args:=args+' -WT '; {tests should be compiled as MPWTool}
|
|
|
if ExtraCompilerOpts<>'' then
|
|
|
args:=args+ExtraCompilerOpts;
|
|
|
-{$ifdef unix}
|
|
|
- { Add runtime library path to current dir to find .so files }
|
|
|
- if Config.NeedLibrary then
|
|
|
-{$ifndef darwin}
|
|
|
- args:=args+' -Fl'+TestOutputDir+' ''-k-rpath .''';
|
|
|
-{$else darwin}
|
|
|
- args:=args+' -Fl'+TestOutputDir;
|
|
|
-{$endif darwin}
|
|
|
-{$endif unix}
|
|
|
+ if TargetIsUnix then
|
|
|
+ begin
|
|
|
+ { Add runtime library path to current dir to find .so files }
|
|
|
+ if Config.NeedLibrary then
|
|
|
+ begin
|
|
|
+ if CompilerTarget<>'darwin' then
|
|
|
+ args:=args+' -Fl'+TestOutputDir+' ''-k-rpath .'''
|
|
|
+ else
|
|
|
+ args:=args+' -Fl'+TestOutputDir;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
if Config.NeedOptions<>'' then
|
|
|
args:=args+' '+Config.NeedOptions;
|
|
|
wpoargs:='';
|
|
@@ -703,9 +749,9 @@ begin
|
|
|
begin
|
|
|
if (passes>1) then
|
|
|
begin
|
|
|
- wpoargs:=' -OW'+config.wpoparas+' -FW'+TestOutputFileName(PPFile[current],'wp'+tostr(passnr));
|
|
|
+ wpoargs:=' -OW'+config.wpoparas+' -FW'+TestOutputFileName('',PPFile[current],'wp'+tostr(passnr));
|
|
|
if (passnr>1) then
|
|
|
- wpoargs:=wpoargs+' -Ow'+config.wpoparas+' -Fw'+TestOutputFileName(PPFile[current],'wp'+tostr(passnr-1));
|
|
|
+ wpoargs:=wpoargs+' -Ow'+config.wpoparas+' -Fw'+TestOutputFileName('',PPFile[current],'wp'+tostr(passnr-1));
|
|
|
end;
|
|
|
Verbose(V_Debug,'Executing '+compilerbin+' '+args+wpoargs);
|
|
|
{ also get the output from as and ld that writes to stderr sometimes }
|
|
@@ -847,75 +893,178 @@ begin
|
|
|
begin
|
|
|
delete(s,1,i+14-1);
|
|
|
val(s,ExecuteResult,code);
|
|
|
- if code=0 then;
|
|
|
- CheckTestExitCode:=true;
|
|
|
+ if code=0 then
|
|
|
+ CheckTestExitCode:=true;
|
|
|
break;
|
|
|
end;
|
|
|
end;
|
|
|
close(t);
|
|
|
end;
|
|
|
|
|
|
+function LibraryExists(const PPFile : string; var FileName : string) : boolean;
|
|
|
+begin
|
|
|
+ { Check if a dynamic library XXX was created }
|
|
|
+ { Windows XXX.dll style }
|
|
|
+ FileName:=TestOutputFilename('',PPFile,'dll');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { Linux libXXX.so style }
|
|
|
+ FileName:=TestOutputFilename('lib',PPFile,'so');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { Darwin libXXX.dylib style }
|
|
|
+ FileName:=TestOutputFilename('lib',PPFile,'dylib');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { MacOS LibXXX style }
|
|
|
+ FileName:=TestOutputFilename('Lib',PPFile,'');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { Netware wlic XXX.nlm style }
|
|
|
+ FileName:=TestOutputFilename('',PPFile,'nlm');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { Amiga XXX.library style }
|
|
|
+ FileName:=TestOutputFilename('',PPFile,'library');
|
|
|
+ if FileExists(FileName) then
|
|
|
+ begin
|
|
|
+ LibraryExists:=true;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ LibraryExists:=false;
|
|
|
+end;
|
|
|
+function ExecuteRemote(const prog,args:string;var StartTicks,EndTicks : int64):boolean;
|
|
|
+const
|
|
|
+ MaxTrials = 5;
|
|
|
+var
|
|
|
+ Trials : longint;
|
|
|
+ Res : boolean;
|
|
|
+begin
|
|
|
+ Verbose(V_Debug,'RemoteExecuting '+Prog+' '+args);
|
|
|
+ StartTicks:=GetMicroSTicks;
|
|
|
+ Res:=false;
|
|
|
+ Trials:=0;
|
|
|
+ While (Trials<MaxTrials) and not Res do
|
|
|
+ begin
|
|
|
+ inc(Trials);
|
|
|
+ Res:=ExecuteRedir(prog,args,'',EXELogFile,'stdout');
|
|
|
+ if not Res then
|
|
|
+ Verbose(V_Debug,'Call to '+prog+' failed: '+
|
|
|
+ 'IOStatus='+ToStr(IOStatus)+
|
|
|
+ ' RedirErrorOut='+ToStr(RedirErrorOut)+
|
|
|
+ ' RedirErrorIn='+ToStr(RedirErrorIn)+
|
|
|
+ ' RedirErrorError='+ToStr(RedirErrorError)+
|
|
|
+ ' ExecuteResult='+ToStr(ExecuteResult));
|
|
|
+ end;
|
|
|
+
|
|
|
+ if Trials>1 then
|
|
|
+ Verbose(V_Debug,'Done in '+tostr(trials)+' trials');
|
|
|
+ EndTicks:=GetMicroSTicks;
|
|
|
+ ExecuteRemote:=res;
|
|
|
+end;
|
|
|
+
|
|
|
+function ExecuteEmulated(const prog,args,FullExeLogFile:string;var StartTicks,EndTicks : int64):boolean;
|
|
|
+begin
|
|
|
+ Verbose(V_Debug,'EmulatorExecuting '+Prog+' '+args);
|
|
|
+ StartTicks:=GetMicroSTicks;
|
|
|
+ ExecuteEmulated:=ExecuteRedir(prog,args,'',FullExeLogFile,'stdout');
|
|
|
+ EndTicks:=GetMicroSTicks;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+function MaybeCopyFiles(const FileToCopy : string) : boolean;
|
|
|
+var
|
|
|
+ TestRemoteExe,
|
|
|
+ s : string;
|
|
|
+ pref : string;
|
|
|
+ LocalFile, RemoteFile: string;
|
|
|
+ LocalPath: string;
|
|
|
+ index : integer;
|
|
|
+ execres : boolean;
|
|
|
+ EndTicks,
|
|
|
+ StartTicks : int64;
|
|
|
+begin
|
|
|
+ if RemoteAddr='' then
|
|
|
+ begin
|
|
|
+ exit(false);
|
|
|
+ end;
|
|
|
+ execres:=true;
|
|
|
+ { We don't want to create subdirs, remove paths from the test }
|
|
|
+ TestRemoteExe:=RemotePath+'/'+SplitFileName(FileToCopy);
|
|
|
+ if deBefore in DelExecutable then
|
|
|
+ ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' rm -f '+TestRemoteExe,
|
|
|
+ StartTicks,EndTicks);
|
|
|
+ execres:=ExecuteRemote(rcpprog,RemotePara+' '+FileToCopy+' '+
|
|
|
+ RemoteAddr+':'+TestRemoteExe,StartTicks,EndTicks);
|
|
|
+ if not execres then
|
|
|
+ begin
|
|
|
+ Verbose(V_normal, 'Could not copy executable '+FileToCopy);
|
|
|
+ exit(execres);
|
|
|
+ end;
|
|
|
+ s:=Config.Files;
|
|
|
+ if length(s) > 0 then
|
|
|
+ begin
|
|
|
+ LocalPath:=SplitPath(PPFile[current]);
|
|
|
+ if Length(LocalPath) > 0 then
|
|
|
+ LocalPath:=LocalPath+'/';
|
|
|
+ repeat
|
|
|
+ index:=pos(' ',s);
|
|
|
+ if index=0 then
|
|
|
+ LocalFile:=s
|
|
|
+ else
|
|
|
+ LocalFile:=copy(s,1,index-1);
|
|
|
+ RemoteFile:=RemotePath+'/'+SplitFileName(LocalFile);
|
|
|
+ LocalFile:=LocalPath+LocalFile;
|
|
|
+ if DoVerbose and (rcpprog='pscp') then
|
|
|
+ pref:='-v '
|
|
|
+ else
|
|
|
+ pref:='';
|
|
|
+ execres:=ExecuteRemote(rcpprog,pref+RemotePara+' '+LocalFile+' '+
|
|
|
+ RemoteAddr+':'+RemoteFile,StartTicks,EndTicks);
|
|
|
+ if not execres then
|
|
|
+ begin
|
|
|
+ Verbose(V_normal, 'Could not copy required file '+LocalFile);
|
|
|
+ exit(false);
|
|
|
+ end;
|
|
|
+ if index=0 then
|
|
|
+ break;
|
|
|
+ s:=copy(s,index+1,length(s)-index);
|
|
|
+ until false;
|
|
|
+ end;
|
|
|
+ MaybeCopyFiles:=execres;
|
|
|
+end;
|
|
|
|
|
|
function RunExecutable:boolean;
|
|
|
const
|
|
|
- MaxTrials = 5;
|
|
|
{$ifdef unix}
|
|
|
CurrDir = './';
|
|
|
{$else}
|
|
|
CurrDir = '';
|
|
|
{$endif}
|
|
|
var
|
|
|
- s,
|
|
|
- OldDir,
|
|
|
+ OldDir, s,
|
|
|
+ execcmd,
|
|
|
FullExeLogFile,
|
|
|
TestRemoteExe,
|
|
|
TestExe : string;
|
|
|
- LocalFile, RemoteFile: string;
|
|
|
- LocalPath: string;
|
|
|
- execcmd,
|
|
|
- pref : string;
|
|
|
execres : boolean;
|
|
|
- index : integer;
|
|
|
EndTicks,
|
|
|
StartTicks : int64;
|
|
|
- function ExecuteRemote(const prog,args:string):boolean;
|
|
|
- var
|
|
|
- Trials : longint;
|
|
|
- Res : boolean;
|
|
|
- begin
|
|
|
- Verbose(V_Debug,'RemoteExecuting '+Prog+' '+args);
|
|
|
- StartTicks:=GetMicroSTicks;
|
|
|
- Res:=false;
|
|
|
- Trials:=0;
|
|
|
- While (Trials<MaxTrials) and not Res do
|
|
|
- begin
|
|
|
- inc(Trials);
|
|
|
- Res:=ExecuteRedir(prog,args,'',EXELogFile,'stdout');
|
|
|
- if not Res then
|
|
|
- Verbose(V_Debug,'Call to '+prog+' failed: '+
|
|
|
- 'IOStatus='+ToStr(IOStatus)+
|
|
|
- ' RedirErrorOut='+ToStr(RedirErrorOut)+
|
|
|
- ' RedirErrorIn='+ToStr(RedirErrorIn)+
|
|
|
- ' RedirErrorError='+ToStr(RedirErrorError)+
|
|
|
- ' ExecuteResult='+ToStr(ExecuteResult));
|
|
|
- end;
|
|
|
-
|
|
|
- if Trials>1 then
|
|
|
- Verbose(V_Debug,'Done in '+tostr(trials)+' trials');
|
|
|
- EndTicks:=GetMicroSTicks;
|
|
|
- ExecuteRemote:=res;
|
|
|
- end;
|
|
|
-
|
|
|
- function ExecuteEmulated(const prog,args:string):boolean;
|
|
|
- begin
|
|
|
- Verbose(V_Debug,'EmulatorExecuting '+Prog+' '+args);
|
|
|
- StartTicks:=GetMicroSTicks;
|
|
|
- ExecuteEmulated:=ExecuteRedir(prog,args,'',FullExeLogFile,'stdout');
|
|
|
- EndTicks:=GetMicroSTicks;
|
|
|
- end;
|
|
|
-
|
|
|
-label
|
|
|
- done;
|
|
|
begin
|
|
|
RunExecutable:=false;
|
|
|
execres:=true;
|
|
@@ -933,52 +1082,15 @@ begin
|
|
|
{$I+}
|
|
|
ioresult;
|
|
|
s:=CurrDir+SplitFileName(TestExe);
|
|
|
- execres:=ExecuteEmulated(EmulatorName,s);
|
|
|
+ execres:=ExecuteEmulated(EmulatorName,s,FullExeLogFile,StartTicks,EndTicks);
|
|
|
{$I-}
|
|
|
ChDir(OldDir);
|
|
|
{$I+}
|
|
|
end
|
|
|
else if RemoteAddr<>'' then
|
|
|
begin
|
|
|
- { We don't want to create subdirs, remove paths from the test }
|
|
|
+ execres:=MaybeCopyFiles(TestExe);
|
|
|
TestRemoteExe:=RemotePath+'/'+SplitFileName(TestExe);
|
|
|
- if deBefore in DelExecutable then
|
|
|
- ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+' rm -f '+TestRemoteExe);
|
|
|
- execres:=ExecuteRemote(rcpprog,RemotePara+' '+TestExe+' '+RemoteAddr+':'+TestRemoteExe);
|
|
|
- if not execres then
|
|
|
- begin
|
|
|
- Verbose(V_normal, 'Could not copy executable '+TestExe);
|
|
|
- goto done;
|
|
|
- end;
|
|
|
- s:=Config.Files;
|
|
|
- if length(s) > 0 then
|
|
|
- begin
|
|
|
- LocalPath:=SplitPath(PPFile[current]);
|
|
|
- if Length(LocalPath) > 0 then
|
|
|
- LocalPath:=LocalPath+'/';
|
|
|
- repeat
|
|
|
- index:=pos(' ',s);
|
|
|
- if index=0 then
|
|
|
- LocalFile:=s
|
|
|
- else
|
|
|
- LocalFile:=copy(s,1,index-1);
|
|
|
- RemoteFile:=RemotePath+'/'+SplitFileName(LocalFile);
|
|
|
- LocalFile:=LocalPath+LocalFile;
|
|
|
- if DoVerbose and (rcpprog='pscp') then
|
|
|
- pref:='-v '
|
|
|
- else
|
|
|
- pref:='';
|
|
|
- execres:=ExecuteRemote(rcpprog,pref+RemotePara+' '+LocalFile+' '+RemoteAddr+':'+RemoteFile);
|
|
|
- if not execres then
|
|
|
- begin
|
|
|
- Verbose(V_normal, 'Could not copy required file '+LocalFile);
|
|
|
- goto done;
|
|
|
- end;
|
|
|
- if index=0 then
|
|
|
- break;
|
|
|
- s:=copy(s,index+1,length(s)-index);
|
|
|
- until false;
|
|
|
- end;
|
|
|
{ rsh doesn't pass the exitcode, use a second command to print the exitcode
|
|
|
on the remoteshell to stdout }
|
|
|
if DoVerbose and (rshprog='plink') then
|
|
@@ -988,6 +1100,19 @@ begin
|
|
|
execcmd:=execcmd+RemotePara+' '+RemoteAddr+' '+rquote+
|
|
|
'chmod 755 '+TestRemoteExe+
|
|
|
' ; cd '+RemotePath+' ; ';
|
|
|
+ { Using -rpath . at compile time does not seem
|
|
|
+ to work for programs copied over to remote machine,
|
|
|
+ at least not for FreeBSD.
|
|
|
+ Does this work for all shells? }
|
|
|
+ if Config.NeedLibrary then
|
|
|
+ begin
|
|
|
+ if RemoteShellNeedsExport then
|
|
|
+ execcmd:=execcmd+' LD_LIBRARY_PATH=.; export LD_LIBRARY_PATH;'
|
|
|
+ else
|
|
|
+ execcmd:=execcmd+' setenv LD_LIBRARY_PATH=.; ';
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
if UseTimeout then
|
|
|
begin
|
|
|
execcmd:=execcmd+'timeout -9 ';
|
|
@@ -1007,9 +1132,10 @@ begin
|
|
|
not Config.NeededAfter then
|
|
|
execcmd:=execcmd+' ; rm -f '+TestRemoteExe;
|
|
|
execcmd:=execcmd+rquote;
|
|
|
- execres:=ExecuteRemote(rshprog,execcmd);
|
|
|
+ execres:=ExecuteRemote(rshprog,execcmd,StartTicks,EndTicks);
|
|
|
{ Check for TestExitCode error in output, sets ExecuteResult }
|
|
|
- CheckTestExitCode(EXELogFile);
|
|
|
+ if not CheckTestExitCode(EXELogFile) then
|
|
|
+ Verbose(V_Debug,'Failed to check exit code for '+execcmd);
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
@@ -1041,7 +1167,6 @@ begin
|
|
|
begin
|
|
|
Verbose(V_Normal,'Execution took '+ToStr(EndTicks-StartTicks)+' us');
|
|
|
end;
|
|
|
-done:
|
|
|
if (not execres) and (ExecuteResult=0) then
|
|
|
begin
|
|
|
AddLog(FailLogFile,TestName);
|
|
@@ -1103,6 +1228,37 @@ done:
|
|
|
end;
|
|
|
|
|
|
|
|
|
+{ Try to collect information concerning the remote configuration
|
|
|
+ Currently only records RemoteShell name and sets
|
|
|
+ RemoteShellNeedsExport boolean variable }
|
|
|
+procedure SetRemoteConfiguration;
|
|
|
+var
|
|
|
+ f : text;
|
|
|
+ StartTicks,EndTicks : int64;
|
|
|
+begin
|
|
|
+ if RemoteAddr='' then
|
|
|
+ exit;
|
|
|
+ ExeLogFile:='__remote.tmp';
|
|
|
+ ExecuteRemote(rshprog,RemotePara+' '+RemoteAddr+
|
|
|
+ ' "echo SHELL=${SHELL}"',StartTicks,EndTicks);
|
|
|
+ Assign(f,ExeLogFile);
|
|
|
+ Reset(f);
|
|
|
+ While not eof(f) do
|
|
|
+ begin
|
|
|
+ Readln(f,RemoteShellBase);
|
|
|
+ if pos('SHELL=',RemoteShellBase)>0 then
|
|
|
+ begin
|
|
|
+ RemoteShell:=TrimSpace(Copy(RemoteShellBase,pos('SHELL=',RemoteShellBase)+6,
|
|
|
+ length(RemoteShellBase)));
|
|
|
+ Verbose(V_Debug,'Remote shell is "'+RemoteShell+'"');
|
|
|
+ RemoteShellBase:=SplitFileBase(RemoteShell);
|
|
|
+ if (RemoteShellBase='bash') or (RemoteShellBase='sh') then
|
|
|
+ RemoteShellNeedsExport:=true;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ Close(f);
|
|
|
+end;
|
|
|
+
|
|
|
procedure getargs;
|
|
|
|
|
|
procedure helpscreen;
|
|
@@ -1285,7 +1441,7 @@ end;
|
|
|
|
|
|
procedure RunTest;
|
|
|
var
|
|
|
- PPDir : string;
|
|
|
+ PPDir,LibraryName : string;
|
|
|
Res : boolean;
|
|
|
begin
|
|
|
Res:=GetConfig(PPFile[current],Config);
|
|
@@ -1328,8 +1484,8 @@ begin
|
|
|
else
|
|
|
TestOutputDir:=OutputDir;
|
|
|
{ Per test logfiles }
|
|
|
- CompilerLogFile:=TestOutputFileName(SplitFileName(PPFile[current]),'log');
|
|
|
- ExeLogFile:=TestOutputFileName(SplitFileName(PPFile[current]),'elg');
|
|
|
+ CompilerLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'log');
|
|
|
+ ExeLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'elg');
|
|
|
Verbose(V_Debug,'Using Compiler logfile: '+CompilerLogFile);
|
|
|
Verbose(V_Debug,'Using Execution logfile: '+ExeLogFile);
|
|
|
end;
|
|
@@ -1516,6 +1672,8 @@ begin
|
|
|
AddLog(EXELogFile,skipping_run_test+PPFileInfo[current]);
|
|
|
AddLog(ResLogFile,skipping_run_test+PPFileInfo[current]);
|
|
|
Verbose(V_Debug,skipping_run_test);
|
|
|
+ if LibraryExists(PPFile[current],LibraryName) then
|
|
|
+ MaybeCopyFiles(LibraryName);
|
|
|
end
|
|
|
else if Config.IsKnownRunError and (not DoKnown) then
|
|
|
begin
|
|
@@ -1528,16 +1686,21 @@ begin
|
|
|
begin
|
|
|
if DoExecute then
|
|
|
begin
|
|
|
- if FileExists(TestOutputFilename(PPFile[current],'ppu')) or
|
|
|
- FileExists(TestOutputFilename(PPFile[current],'ppo')) or
|
|
|
- FileExists(TestOutputFilename(PPFile[current],'ppw')) then
|
|
|
+ if FileExists(TestOutputFilename('',PPFile[current],'ppu')) or
|
|
|
+ FileExists(TestOutputFilename('',PPFile[current],'ppo')) or
|
|
|
+ FileExists(TestOutputFilename('',PPFile[current],'ppw')) then
|
|
|
begin
|
|
|
AddLog(ExeLogFile,skipping_run_unit+PPFileInfo[current]);
|
|
|
AddLog(ResLogFile,skipping_run_unit+PPFileInfo[current]);
|
|
|
Verbose(V_Debug,'Unit found, skipping run test')
|
|
|
end
|
|
|
+ else if LibraryExists(PPFile[current],LibraryName) then
|
|
|
+ begin
|
|
|
+ Verbose(V_Debug,'Library found, skipping run test');
|
|
|
+ MaybeCopyFiles(LibraryName);
|
|
|
+ end
|
|
|
else
|
|
|
- Res:=RunExecutable;
|
|
|
+ Res:=RunExecutable;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
@@ -1553,6 +1716,7 @@ begin
|
|
|
GetArgs;
|
|
|
SetTargetDirectoriesStyle;
|
|
|
SetTargetCanCompileLibraries;
|
|
|
+ SetRemoteConfiguration;
|
|
|
{$ifdef LIMIT83fs}
|
|
|
UseOSOnly:=true;
|
|
|
{$else not LIMIT83fs}
|