Jonas Maebe wrote:
On 23 May 2011, at 11:49, Bernd Mueller wrote:
I am running the test suite with remote execution (from a Windows
host) on an ARM-Linux target. Some test programs fail at runtime,
because they depend on libraries, which were not automatically copied
to the target. For example:
Failed to run test/tlib1b.pp 2011/01/21 18:06:08 (16)
/mnt/tlib1b: can't load library 'libtlib1a.so'
My target has very low resources so that I can not run the test suite
directly on the target. How can my problem be solved?
Maybe you are using TEST_DELTEMP=1? If so, remove it if you have enough
disk space on the remote target. Most test sources that are later on
used by other tests don't contain the necessary { %neededafter }
directive, so they are immediately deleted even when they are still
required later
Alternatively, you can submit a patch that adds { %neededafter } to all
affected tests).
I have enough FLASH memory, so I am not using TEST_DELTEMP=1. I had a
look into the test suite source and I think, that the test suite is not
able to copy the libraries to the target.
I attached a small patch, which could be a solution for the problem. I
am using the parameter of the %needlibrary directive to get the
information, which library should be copied. For example in tlib1b.pp,
the directive is expanded to { %needlibrary=tlib1a }. This works for me.
If you think, this patch could be the right way to copy the libraries, I
would submit a second patch which expands all required %needlibrary
directives.
Regards, Bernd.
Index: tests/utils/dotest.pp
===================================================================
--- tests/utils/dotest.pp (Revision 17059)
+++ tests/utils/dotest.pp (Arbeitskopie)
@@ -811,6 +811,7 @@
index : integer;
EndTicks,
StartTicks : int64;
+ LibraryFileName, LocalLibraryFile: string;
function ExecuteRemote(const prog,args:string):boolean;
var
Trials : longint;
@@ -913,6 +914,21 @@
s:=copy(s,index+1,length(s)-index);
until false;
end;
+
+ { copy library to target }
+ if (CompilerTarget = 'linux') and (Config.LibraryName <> '') then
+ begin
+ LibraryFileName:= 'lib' + Config.LibraryName + '.so';
+ LocalPath:=SplitPath(PPFile[current]);
+ LocalLibraryFile:= OutputDir + '/' + LocalPath + LibraryFileName;
+ execres:=ExecuteRemote(rcpprog,RemotePara+' '+ LocalLibraryFile+'
'+RemoteAddr+':' + RemotePath+'/'+ LibraryFileName);
+ if not execres then
+ begin
+ Verbose(V_normal, 'Could not copy library ' + LibraryFileName);
+ goto done;
+ end;
+ 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
@@ -936,6 +952,8 @@
execcmd:=execcmd+' ./'+SplitFileName(TestRemoteExe)
else
execcmd:=execcmd+' '+TestRemoteExe;
+ if Config.LibraryName <> '' then
+ execcmd:=execcmd+' ; export LD_LIBRARY_PATH='+RemotePath;
execcmd:=execcmd+' ; echo "TestExitCode: $?"';
if (deAfter in DelExecutable) and
not Config.NeededAfter then
Index: tests/utils/testu.pp
===================================================================
--- tests/utils/testu.pp (Revision 17059)
+++ tests/utils/testu.pp (Arbeitskopie)
@@ -28,6 +28,7 @@
KnownCompileError : longint;
NeedRecompile : boolean;
NeedLibrary : boolean;
+ LibraryName : string;
NeededAfter : boolean;
IsInteractive : boolean;
IsKnownRunError,
@@ -212,7 +213,10 @@
r.NoRun:=true
else
if GetEntry('NEEDLIBRARY') then
- r.NeedLibrary:=true
+ begin
+ r.NeedLibrary:=true;
+ r.LibraryName:= res;
+ end
else
if GetEntry('NEEDEDAFTER') then
r.NeededAfter:=true
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel