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 _______________________________________________ Sugar mailing list [email protected] http://mailman.laptop.org/mailman/listinfo/sugar
