Tuesday, September 10, 2013

Linux Binary Compatibility

I have had some issues with lack of binary compatibility of Linux.  I can build ebe using a lot of shared libraries and if people have those libraries installed it is highly likely that the binary will work properly.  Their computer would need matching versions of a moderately large collection of .so files.

To avoid requiring that ebe users install a bunch of libraries I have developed a script named "build_package" which uses ldd to determine the shared objects used by ebe and it builds a directory named "ebe.d" with ebe copied in as "ebe.exe" and all the shared objects.  The idea is that on the target system ebe would be started using a shell script named "ebe" which sets LD_LIBRARY_PATH to ebe.d allowing all the shared libraries from my system to be used.

This works with the same version of Ubuntu (13.04) for me, but fails on 12.04.  Interestingly on my virtualbox 12.04 system ebe.exe works if I allow all the libraries to be loaded normally.  So I tried to match the strategy of firefox which is a fairly successful program.  It is loaded by a script though it does not use LD_LIBRARY_PATH.  Firefox does use some special shared libraries but these apparently are loaded using dlopen rather than automatically.  They don't appear when you use ldd.

So I started removing shared libraries.  After removing a few of them I started getting incompatible messages about Qt versions.  Apparently Qt knows that the Qt shared libraries I copied to 12.04 are a different version  from the libraries I installed previously.  I did not find an environment variable which pointed to the older libraries, so I assume that Qt does some form of internal consistency checking.  This may be something I can get around, but I don't have a clue about how to dodge this test now.

I considered briefly forcing ebe users to install from source, but the requirements are fairly large.  I was trying to make ebe accessible to novices.  Novices shouldn't have to face a long list of instructions just to get their IDE installed.  I had the experience of installing a copy of ebe modified to use Qt5 recently.  It took probably an hour of piddling around to figure out the packages required to get ebe to build.  Maybe I missed the obvious qt5-dev package, but I tried to find the obvious.  I wouldn't call myself a novice though I know I can make some really stupid mistakes.

So I am left with providing a separate install package for each of several versions of Linux.  What a waste of effort!  I am sure there is a better way, but I have spent more time looking for a better way than  it would take me to provide 3 versions of my install package for a year.

To reduce the effort I will start using rsync to update my downloadable files on sourceforge.  I had been using their web interface on each computer.  I will still have to do a fair amount of work on each revision, so I need to make less frequent updates to the binary installers.  I can still push source code changes regularly since that is so easy, but the installers I will try to update perhaps once a month.

I also tried to use an authorized_keys file on sourceforge to make it quicker to do the rsync, but that didn't work.  It didn't really matter since it takes a few seconds to type in my password and an hour or two to prepare the binary packages on about 5 computers.