This is an old revision of the document!
Linkfarming
Linkfarming is a technique employed by [“XPI”] and [“NPAPI”] ports for greater flexibility in installation.
Each extension is installed in LOCALBASE/lib/xpi/ID/. Symlinks are then farmed in apps, usually X11BASE/lib/*{firefox,thunderbird,flock}*/extensions/. Once there was an idea to make a separate port, xpi-tools, to support advanced linkfarming - allowing user to tune which extensions go to which apps, and to allow packages to invoke linkfarming. There might be a simpler solution.
There is a folder named LOCALBASE/lib/xpi/symlinks. In it, folders for each app. In each of those, symlinks which can be copied verbatim into apps. Then xpi-ports will only have to make one more linkfarming, while apps will just “cp -R LOCALBASE/lib/xpi/symlinks/APP_NAME/ X11BASE/lib/APP_NAME/extensions/”.
This approach can also be exploited for [“NPAPI”] plugin installation, where tuning is often very desirable. Folder named X11BASE/lib/browser_plugins/symlinks. Developers can later be seduced to migrate to LOCALBASE/lib/npapi for consistency.
Linkfarming is important as we might employ it in development of a new-generation packaging architecture. Systems like [http://www.sepp.ee.ethz.ch/ SEPP] offer great flexibility in shlib management, requiring copies of libs kept along within each package. Symlinking can solve the disk space issue and provide for some design improvements. Consider this XPI/NPAPI linkfarming effort as a playground serving for development of simple, but powerful techniques.
Smart linkfarming in detail
- Every plugin/extension (let's call it a miniport) knows a list of all apps supported by the infrastructure.
- The list can be stored in a common makefile.
- The lists for different infrastructures (plugins and extensions) can differ. E.g. opera supports NPAPI, but not XPI.
- Each miniport creates the symlinks dir and subdirs for each app in the list (even if the miniport itself does not support some of the apps). Miniports preen empty dirs on deinstall.
- Miniports can specify apps they support by full name (linux-firefox-devel) or shell wildcards (*mozilla*).
- Of course, it is possible for a miniport to support only a subset of infrastructure-supported apps. E.g. XPI supports many apps, but many extensions only work in *firefox* or *firefox.
- The list of miniport-supported apps is user-tunable. E.g. a user might want to have only mplayer-plugin in firefox and only mozplugger in seamonkey. By default both plugins would be installed in both browsers.
- When miniport is installed it creates links for supported apps both in apps dirs and in symlink subdirs.
- When app is installed it copies links from the symlink subdir with matching title over to its subdirs. Apps preen their subdirs for links on deinstall. Thus the infrastructure is fully portupgrade-safe and quite user-friendly.
Let's have an example:
We're installing www/xpi-adblock:
- Extension is installed in PREFIX/lib/xpi/xpi-id.
- PREFIX/lib/xpi/symlinks/app is created for each of the infrastructure-supported apps. Some of them are firefox, linux-firefox, firefox-devel, linux-firefox-devel, flock, linux-seamonkey, etc.
- Links are created in PREFIX/lib/xpi/symlinks/app for each adblock-supported app - *firefox* and *flock*. In fact, mozilla and netscape are also supported by adblock, but XPI infrastructure does not support them yet, so they are not touched.
- Links are created in each supported app's extension subdir. In our case this will be X11BASE/lib/{*firefox*,*flock*}/extensions/. If firefox and/or flock are not installed, creation of some links is skipped silently.
We're installing www/linux-firefox:
- Browser is installed in PREFIX/lib/linux-firefox.
- Links are copied from LOCALBASE/lib/xpi/symlinks/linux-firefox/ over to PREFIX/lib/linux-firefox/extensions/.
We're deinstalling www/xpi-adblock:
- Extension is deleted from PREFIX/lib/xpi/xpi-id.
- Adblock-specific links are deleted from PREFIX/lib/xpi/symlinks/app for each adblock-supported app.
- Adblock-specific links are deleted from each supported app's extension subdir.
- Any empty dirs among PREFIX/lib/xpi/symlinks/app (for each of the infrastructure-supported apps), PREFIX/lib/xpi/symlinks, PREFIX/lib/xpi are deleted.
We're deinstalling www/linux-firefox:
- Links are preened in PREFIX/lib/linux-firefox/extensions/.
- Browser is deleted from PREFIX/lib/linux-firefox.