Wednesday, June 14, 2017

Compiling and running SWIG for Lua in Ubuntu 16.04 for the truly lazy

Previously, we were able to compile and run SWIG for Lua in Ubuntu 16.04 using a C source file. In this blog entry, we want to do something very similar except that we use a C header file.

We begin with the files needed starting with the header file, example.h:

double My_variable;
int fact(int n);
int my_mod(int x, int y);
char *get_time();
view raw example.h hosted with ❤ by GitHub
Then, we create the C implementation file, example.c:

#include <example.h>
#include <time.h>
double My_variable = 3.0;
int fact(int n)
{
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y)
{
return (x%y);
}
char *get_time()
{
time_t ltime;
time(&ltime);
return ctime(&ltime);
}
view raw example.c hosted with ❤ by GitHub
Finally, we create the interface file, example.i, which is needed by SWIG:

%module example
%{
/* Includes the header in the wrapper code */
#include "example.h"
%}
/* Parse the header file to generate wrappers */
%include "example.h"
view raw example.i hosted with ❤ by GitHub
Notice how much simpler this interface file is compared to the previous one. This is why this entry has a subclause "for the truly lazy".

We then call SWIG to create the wrapper file, example_wrap.c:

% swig -lua example.i

Then we compile the generated wrapper file:

% gcc -fPIC -I/usr/include/lua5.2 -c example_wrap.c -o example_wrap.o

We also compile the C source file, example.c:

% gcc -fPIC -I. -c example.c -o example.o

Finally, we create the shared object which is to be used by our Lua script:

% gcc -shared -I/usr/include/lua5.2 example_wrap.o example.o -o example.so

The Lua script is just the same as our previous blog entry. For convenience:

package.loadlib('./example.so', 'luaopen_example')()
print(example.My_variable)
print(example.fact(5))
print(example.my_mod(5, 3))
print(example.get_time())
view raw test.lua hosted with ❤ by GitHub
When run:

% lua test.lua
3
120
2
Wed Jun 14 14:56:54 2017

Hope this helps the world. :)

No comments:

Post a Comment