no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


howtos:relocatable_build [2015/12/03 19:12] (current) – created colombanw
Line 1: Line 1:
 +====== Relocatable GNU/Linux Build ======
 +
 +Geany has optional support for binary relocation ("portable" executable) on GNU/Linux (and possibly other Unices providing ''/proc/self/maps'').  To enable it, you need to use the ''--enable-binreloc'' //configure// option when [[http://www.geany.org/manual/index.html#installation|building Geany]].
 +
 +You can also tune the ''--prefix'' and use ''DESTDIR'' to simplify the directory structure of the portable installation (although it can also be done manually afterward).
 +
 +<code>
 +$ ./configure --enable-binreloc --prefix=/
 +$ make
 +$ make install DESTDIR=/path/to/geany-portable
 +</code>
 +
 +===== Creating a fully portable version =====
 +
 +<WRAP center round important 60%>
 +This has **not** been tested, and is likely not to work for several reasons outlined below.
 +</WRAP>
 +
 +
 +The version built with ''--enable-binreloc'' as above is relocatable as in it searches for its own data files and plugins in a tree relative to the executable itself, but it still depends on a set of system libraries (notably GTK+).  This is good enough if all systems where this executable is run has all the libraries in compatible versions, but doesn't work if a system doesn't have a library or has a too old version of a library.
 +
 +To remedy this, there are two solutions:
 +
 +  - Statically link everything inside Geany.
 +  - Bundle all libraries in Geany's tree.
 +
 +Static linking would be interesting, but can be hard to achieve.  First, you would need **all** dependencies to be available as a static library, but on some systems some dependencies aren't available as such (on Debian, notably //ATK// and //gdk-pixbuf//).  Then, apparently some GNU libc features used by some libraries requires a dynamic version of itself.
 +
 +Bundling all libraries is slightly easier.  However, for it to really work it would still require all the libraries themselves to be relocatable, which is likely **not** the case for the default build of several of them.
 +
 +==== Bundling all required libraries ====
 +
 +Since Geany 1.25, libraries are searched first in the //lib/ // directory next to the //bin/ // directory containing the relocatable Geany executable.  This means there is no need for a wrapper script to alter ''LD_LIBRARY_PATH'' at startup with current versions for bundled libraries to be found by the linker.
 +
 +To copy the libraries themselves, it is quite easy to extract the dependencies list from the relocatable Geany executable with i.e. ''ldd'' Then, it's fairly easy to automate the copy:
 +
 +<code>
 +$ cd /path/to/geany-portable/lib/
 +$ ldd ../bin/geany | sed -n '/libgeany/!s/.* => \(.*\) (.*$/\1/p' | while read l
 +  do
 +    name="$(basename "$l")";
 +    target="$(readlink -f "$l")";
 +    cp -a "$target" "$name";
 +  done
 +</code>
  
Print/export