The idea to semi-static build EMAN is to link EMAN’s dependency libraries statically into EMAN’s shared libraries: libEM.so, libpyEM.so, libqEM.so, libqsci.so. By this way, the compiled EMAN can be run on another system even though it does not have those dependent libraries. You can specify each dependent library in ccmake to link to static library, for example libgsl.a instead of libgsl.so. And make sure there is no shared library in the same directory, otherwise, linker will prefer the shared library.
For 64 bit linux system, those static depency libraries must be compiled with a -fPIC flag.
For example, this is what I did to get static library compiled with '-fPIC' flag:
1. qt-3.3.6 static library for x86_64
1. ./configure -prefix /home/gtang/library/qt-x11-free-3.3.6 -qt-gif -thread -qt-imgfmt-jpeg -platform linux-g++-64 -static 2. go to src subdirectory, edit Makefile add -fPIC into CFLAGS, and CXXFLAGS 3. make 4. make install
2. fftw-2.1.5 static library for x86_64
1. ./configure --prefix /home/gtang/library/fftw-2.1.5 --enable-static --enable-shared=no --enable-float --enable-type-prefix 2. make CFLAGS='-O3 -fomit-frame-pointer -fno-schedule-insns -fschedule-insns2 -fstrict-aliasing -fPIC' 3. make install
3. GSL 1.6 static library for x86_64
1. ./configure --prefix=/home/gtang/library/gsl-1.6 --enable-shared=no --enable-static=yes 2. make CFLAGS="-O3 -fPIC" 3. make check > log 2>&1 4. make install
4. hdf5-1.6.4 static library for x86_64
1. ./configure --prefix=/home/gtang/library/hdf5-1.6.3 --enable-shared=no --enable-static=yes 2. make CFLAGS='-fPIC' 3. make check 4. make install
5. boost-1.33.1 static boost.python library for x86_64
I can not figure out a way to compile boost.python with option '-fPIC', in Jamfile, so use CMake to create a Makefile. write a CMakeLists.txt file in /libs/python/src/ as follow: PROJECT(BOOSTPYTHON) INCLUDE(${CMAKE_ROOT}/Modules/CheckIncludeFiles.cmake) INCLUDE(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake) INCLUDE(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake) FIND_PACKAGE(PythonLibs) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES(.) SET (OPT_FLAGS "-march=k8 -O1 -fPIC") SET(LIB_BOOSTPYTHON_SOURCE numeric.cpp list.cpp long.cpp dict.cpp tuple.cpp str.cpp slice.cpp aix_init_module.cpp converter/from_python.cpp converter/registry.cpp converter/type_id.cpp object/enum.cpp object/class.cpp object/function.cpp object/inheritance.cpp object/life_support.cpp object/pickle_support.cpp errors.cpp module.cpp converter/builtin_converters.cpp converter/arg_to_python_base.cpp object/iterator.cpp object_protocol.cpp object_operators.cpp wrapper.cpp ) ADD_LIBRARY(boost_python STATIC ${LIB_BOOSTPYTHON_SOURCE}) Note: 1. copy boost header directory "boost" into /libs/python/src directory. 2. on FC5 64 bit, above is enough to create 64 bit static boost library with -fPIC enabled. But on 64 bit FC3, I have to modify CMakeFiles/boost_python.dir/flags.make add "-fPIC" into CXX_FLAGS.
6. Python 2.4.3 static library for x86_64:
1. ./configure --prefix=/home/gtang/library/Python-2.4.3 change Makefile line: OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes to line: OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC 2. make 3. make test 4. make install
7. tiff-3.7.2 static libtiff library for x86_64:
1. ./configure --prefix=/home/gtang/library/tiff-3.8.2 --enable-shared=no --enable-static=yes 2. make CFLAGS = '-O2 -fPIC' 3. make install
8. libpng-1.2.12 static library for x86_64:
1. ./configure --prefix=/home/gtang/library/png-1.2.12 --enable-shared=no --enable-static=yes 2. make CFLAGS='-O2 -fPIC' 3. make check 4. make install
9. jpegsrc.v6b.tar.gz static libjpeg for x86_64:
1. ./configure --prefix=/home/gtang/library/jpeg-6b --enable-static=yes --enable-shared=no CFLAGS='-O2 -fPIC' 2. edit Makefile change ./libtool to libtool 3. make 4. in the /home/gtang/library/jpeg-6b directory, mkdir bin, lib, include, man/man1 5. make install-lib #poorly written configuration, libjpeg.a will not be installed by make install