[sugar] penguintv development update: bundled .so libraries
Owen Williams
owen
Sun Nov 5 10:55:24 EST 2006
Today I got penguintv working with the new bundle spec. I learned a lot
that isn't on the wiki, so I've updated the wiki with some details about
exact path locations, convenience functions, and unimplemented features.
One of the big hand-waving bits of sugar development has been including
prebuilt c libraries and python libraries in activity bundles. But the
question is, how to do this? And moreover, how to do this on a non-FC6
platform?
As a developer on Ubuntu, I've had a lot of trouble trying to emulate
the OLPC for testing. qemu and VMware are both broken for Ubuntu Edgy,
and the livecds don't work. I ended up using the -tree builds on
http://olpc.download.redhat.com/olpc/streams/development/. These
contain chroot-friendly trees of the current olpc build that allowed me
to test my bundled libraries against the FC6 tree.
Basically my workflow was this:
1. copy my current activity bundle into the tree in /opt
2. create /opt/my.activity/lib and /opt/my.activity/site-packages
3. export LD_LIBRARY_PATH and PYTHONPATH to include those new folders
4. try to run the software
5. note which module fails to load
6.if I can work around it:
6a. work around it, often with this pattern:
try:
import SomeModule
HAS_SOMEMODULE = True
except:
HAS_SOMEMODULE = False
if HAS_SOMEMODULE:
SomeModule.do_something()
else:
my_lame_workaround()
It's almost like #ifdef!
7. if I can't work around it:
7.a find the rpm for FC6 that would satisfy that dependency
7.b extract it in a temp dir with rpm2cpio file.rpm | cpio -idmv
7.c copy the .so files into my lib/ folder, and any python .so's into my
site-packages folder.
8. Then I rerun the program and see if it works.
9. Repeat until it runs.
So then in my activity file I have to set up the environment so that my
libs and site-packages are included. Unfortunately I only know how to
tell python where other python objects are: appending to sys.path. I
have no idea how to tell ld where the new libs are. This is a major
sticking point, and I'm hoping someone out there can help.
Since I can't assume the package is installed anywhere in particular, I
have to go by the __file__ property of my activity:
import PenguinTVActivity
activity_root = os.path.split(PenguinTVActivity.__file__)[0]
sys.path.append(os.path.join(activity_root, 'site-packages'))
#sys.magic_command.append_to_ld_library_path_at_runtime(os.path.join(activity_root, 'lib'))
import penguintv
app = penguintv.PenguinTVApp()
...
So I'm almost there. I just need a solution to runtime linking of the c
shared object files that the python modules need.
Owen Williams
More information about the Sugar-devel
mailing list