ShedSkin

(Building the package)
(Building the package)
Line 23: Line 23:
'''control:'''
'''control:'''
-
Behind the line ''Build-Depends:'' you have to add ''shedskin''. This is needed, so the autobuilder knows he has to install it.
+
Behind the line "Build-Depends:" you have to add "shedskin". This is needed, so the autobuilder knows he has to install it.
-
You might also have to add some normal dependencies like libgc1c2 and libpcre behind the line with ''Depends:''
+
You might also have to add some normal dependencies like "libgc1c2" and "libpcre" behind the line with "Depends:".
 +
 
 +
 
 +
'''rules:'''
 +
 
 +
Under the line with "install: build" should be many lines with "mkdir" and "cp -a". After the last one of them, add those two lines:
 +
  cd debian/path_to_mylib.py/; /usr/bin/shedskin -e mylib.py
 +
  cd debian/path_to_mylib.py/opt/SleepAnalyser/lib/; make
 +
 
 +
where mylib.py is the python file you wnat to get compiled into a C module.
== How to use it with the autobuilder ==
== How to use it with the autobuilder ==

Revision as of 20:28, 22 November 2010

Shed Skin is an experimental compiler, that can translate pure, but implicitly statically typed Python programs into optimized C++. It can generate stand-alone programs or extension modules that can be imported and used in larger Python programs.

For more information, check out http://code.google.com/p/shedskin/

On a simple test I could see a speed improvement of up to 18 times. The great thing is, you can more or less write normal python and then let ShedSkin convert it to C code, so it can get compiled by gcc. To see an application which uses Shedskin, have a look in SleepAnalyser. It has one file "mylib.py" which gets normal imported into the python application. How ever if there is a file mylib.so in the same folder, python will use that one.

Contents

How to start

You might have built your python package with one of the nice tools like PyPacker. But as you now have to edit the debian files, you will have to use scratchbox.

Install scratchbox as described in http://wiki.maemo.org/Documentation/Maemo_5_Final_SDK_Installation . Then install Shedskin with "apt-get install shedskin" from the Extras-Devel repository.

There is also a good tutorial of how to use it: http://shedskin.googlecode.com/files/shedskin-tutorial-0.6.html .

Building the package

If you already have the .tar.gz file, then you already have the structure with the files. Just unpack the .tar.gz file into a folder. If you have to pack it for the first time, MohammadAG has a good page about how to generate the needed files: http://wiki.maemo.org/User:Mohammad7410/Packaging

Now in the debian folder, you will have to modify some files:

control:

Behind the line "Build-Depends:" you have to add "shedskin". This is needed, so the autobuilder knows he has to install it.

You might also have to add some normal dependencies like "libgc1c2" and "libpcre" behind the line with "Depends:".


rules:

Under the line with "install: build" should be many lines with "mkdir" and "cp -a". After the last one of them, add those two lines:

 cd debian/path_to_mylib.py/; /usr/bin/shedskin -e mylib.py
 cd debian/path_to_mylib.py/opt/SleepAnalyser/lib/; make

where mylib.py is the python file you wnat to get compiled into a C module.

How to use it with the autobuilder

First of all, try to test it on your device with the deb-package generated in scratchbox. Do not forget to change the architecture to ARMEL, else it will not run:

 sb-conf se FREMANTLE_ARMEL
 dpkg-buildpackage -sa -rfakeroot -k<my email address>


Missing depencies

The generated module is dependant on some other modules. When you have the module on your phone or in scratchbox, you can see the dependencies with ldd:

 ldd
       libgc.so.1 => not found
       libpcre.so.3 => /usr/lib/libpcre.so.3 (0x40053000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x40079000)
       libdl.so.2 => /lib/libdl.so.2 (0x4009a000)
       libutil.so.1 => /lib/libutil.so.1 (0x400a5000)
       libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0x400b0000)
       libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x401d4000)
       libm.so.6 => /lib/libm.so.6 (0x402b7000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4032d000)
       libc.so.6 => /lib/libc.so.6 (0x40340000)
       /lib/ld-linux.so.3 (0x2a000000)

There you also will see if a dependency is missing and you have to add it to your package. In the above example you can see that libgc is missing, so you should add it as a dependency to your application.