Differences between revisions 17 and 18
Revision 17 as of 2008-03-19 05:16:47
Size: 17809
Editor: root
Comment:
Revision 18 as of 2008-03-19 05:17:20
Size: 17823
Editor: root
Comment:
Deletions are marked like this. Additions are marked like this.
Line 78: Line 78:

{{{
Line 315: Line 317:

}}}

Compiling for Mac OS X is generally the same as other platforms.

** NOTE ** ** I AM STILL WORKING ON THESE INSTRUCTIONS. :) **

Dependencies (version I have used successfully in parens):

  • boost (1_34_1)
  • cmake (2.4.8)
  • fftw (2.1.5)
  • gsl (1.8)
  • hdf5 (1.6.6)
  • jpeg (v6b)
  • png (1.2.23)
  • numpy (1.0.4)
  • Qt/Mac (3.3.8)
  • szip (2.1)
  • tiff (3.8.2)
  • zlib (1.2.1)


You have two routes available. You can install the above dependencies using a package manager such as fink or macports. This is the easier and faster option, but has the downside of making it more difficult to distribute your built package or moving it to a different machine. If you choose this option, please skip to the end.

The other option is to build all dependencies manually from source. This is the method I chose for the self-contained EMAN package. However, some of the packages required either patches or some careful massaging to compile properly. It will require a bit more effort than using the package manager.


Preparing to compile:

I opted to place my build environment in a disk image to make it easier to move it from machine to machine. Use Disk Utility to create a sparse disk image with a max size of 50gb (it will shrink to the total size of the files contained.)

I called the disk image "EMAN" and used the following directory structure for organization.

attachment:dirstructure.jpg

"build" is for EMAN build files. "dep" is the dependency tree root. "extlib" is for modified dependency libraries. "EMAN" is for the EMAN source itself. "Resources" are support files to be used in the creation of Mac OS X app bundles. "src" is for downloaded source tarballs and patches. "stage" is where the EMAN package will be prepared for distribution. "vars10.x.sh" is for environment variables specific to building for each Mac OS X version.

Because 10.4 and 10.5 use different versions of Python, I decided to build EMAN and dep libraries separately for each deployment target.

My build environment was 10.5 Leopard on Intel host using Xcode 3.0 for the 10.5 build. I have not personally built for 10.4 on a 10.4 host, but the instructions for 10.5 will probably work. Building for 10.4 target on a 10.5 host is possible and requires Xcode 2.5 to be installed in parallel to Xcode 3.0.

For simplicity's sake, I will only discuss building for 10.5 target on a 10.5 host in these instructions.

Mac OS X supports multiple architectures in a single "universal" or "fat" binary/library. This is achieved by passing -arch flags to gcc (this is a special Apple-gcc flag) which will take care of all the details. Alternatively you can compile for different architectures separately and merge them together afterwards. For 10.5 I built both 32 and 64 bit versions for both Intel and PowerPC (i386, x86_64, ppc, ppc64.) On 10.4 I built only 32 bit versions for Intel and PowerPC.

The following environment variables were sufficient to get clean universal builds of dependencies in most cases. I put these in vars10.5.sh for quick access:

#10.5
export BROOT=/Volumes/EMAN/
export CPUCOUNT=8
export ARCH=i386
export MACOSX_DEPLOYMENT_TARGET=10.5
export PREFIX=$BROOT/dep/$MACOSX_DEPLOYMENT_TARGET
export EXECPREFIX=$PREFIX/$ARCH
export UARCH="-arch i386 -arch ppc -arch x86_64 -arch ppc64"
export SROOT="-isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
export LDF="-Wl,-headerpad_max_install_names"
export CFLAGS="$SROOT $UARCH -O2 -g"
export LDFLAGS="$UARCH $LDF"
export PATH=/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin

Several dependencies required patches to compile properly. Most of them are taken from Fink/MacPorts, or other internet sources. I have them available for download (download page):

  • boost.patch
  • darwin.jam
  • jpegpatch.zip
  • libtool135update.zip
  • qt3mac.patch.txt
  • qt3mac.patch1.txt
  • qt3mac.patch2.txt

I placed the patches in $BROOT/src/patches.

--------

CMAKE

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared LDFLAGS="$LDFLAGS" CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"

--------

BOOST

# Patch to add fat binary support
patch -p1 < $BROOT/src/patches/boost.patch

# Build bjam first using Xcode3.0. bjam won't build while using Xcode2.5.
./configure --with-toolset=darwin --with-libraries=python --prefix=$PREFIX --exec-prefix=$PREFIX/fat

# For 10.5
# in tools/build/v2/tools/darwin.jam:
#       * change sdkroot to use /Developer/SDKs/MacOSX10.5.sdk
#       * Add ppc64, x86_64 to fat arch in darwin.jam
#               feature arch : native ppc i386 fat : composite propagated ;
#               flags darwin.compile OPTIONS <arch>fat : -arch i386 -arch ppc -arch x86_64 -arch ppc64 ;
#               flags darwin.link OPTIONS <arch>fat : -arch i386 -arch ppc -arch x86_64 -arch ppc64 ;
                                                
./tools/jam/src/bin.macosxx86/bjam -d+2 --user-config=user-config.jam --prefix=$PREFIX --libdir=$PREFIX/fat/lib/ --exec-prefix=$PREFIX/fat/bin/ --with-python sdkroot=$MACOSX_DEPLOYMENT_TARGET arch=fat install


------

JPEG

# needs patch: http://www.kyngchaos.com/macosx/install/libjpeg
# http://www.kyngchaos.com/files/macosxport/patches/libtool135update.zip
# http://www.kyngchaos.com/files/macosxport/patches/jpegpatch.zip

unzip $BROOT/src/patches/libtool135update.zip
unzip $BROOT/src/patches/jpegpatch.zip

cp /usr/share/libtool/config.* ./
patch makefile.cfg makefile.cfg.patch

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"

##############
# In Makefile, change CC and move it below CFLAGS... CC=gcc $(CFLAGS)
# patch archive_cmds in libtool: needs $CFLAGS
        archive_cmds="\$nonopt \$(test .\$module = .yes && echo -bundle || echo -dynamiclib) $CFLAGS \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$linkopts -install_name \$rpath/\$soname \$verstring"

------

PNG

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"

------

TIFF

# version-number needs to be changed to current_version in libtool
sed s/"version-number"/"current_version"/ Makefile.in > Makefile2.in
sed s/"version-number"/"current_version"/ Makefile.am > Makefile2.am
mv Makefile2.in Makefile.in
mv Makefile2.am Makefile.am

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat  --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"

-------

SZIP

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"


-------

HDF5

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"

##############
# patch archive_cmds in libtool, needs $CFLAGS
        archive_cmds="\$nonopt \$(test \\\"x\$module\\\" = xyes && echo -bundle || echo -dynamiclib) $CFLAGS \$allow_undefined_flag
        
-------

GSL

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --disable-dependency-tracking --disable-static --enable-shared CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"


-------

FFTW2

./configure --prefix=$PREFIX --exec-prefix=$PREFIX/fat --enable-float --disable-fortran --disable-dependency-tracking --disable-static --enable-shared  CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS"  LDFLAGS="$LDFLAGS"


##############
# patch archive_cmds to include $CFLAGS in libtool.. this one needs it twice.
        archive_cmds="\$CC $CFLAGS -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs && \$CC \$(test .\$module = .yes && echo -bundle || echo -dynamiclib) $CFLAGS  \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs\$linker_flags \$(test .\$module != .yes && echo -install_name \$rpath/\$soname \$verstring)"

##############
# EMAN expects srfftw.h, sfftw.h. This version doesn't seem to make the symlinks correctly.
# post-install
cd $BROOT/dep/$MACOSX_DEPLOYMENT_TARGET/include/
ln -s fftw.h sfftw.h
ln -s rfftw.h srfftw.h


------

Qt3-Mac

# Use patches from Fink.

# Carbon dependency makes it 32 bit only. 

# Patches
sed s/free-3.3.5/free-3.3.8/g $BROOT/src/patches/qt3mac.patch.txt > ./qt3mac.patch1.txt 
cmd="s|@PREFIX@|`pwd`|g"
sed -e $cmd < ./qt3mac.patch1.txt | patch -p1
patch -p1 < $BROOT/src/patches/qt3mac.patch2.txt
perl -pi.bak -e 's|cp \-P|cp \-Rp|' qmake/Makefile.unix


# These must be in path for qmake to work correctly.
export DYLD_LIBRARY_PATH=`pwd`/lib
export PATH=$PATH:`pwd`/bin

./configure -prefix $PREFIX/qt3 -bindir $PREFIX/fat/bin/qt3 -libdir $PREFIX/fat/lib/qt3 -plugindir $PREFIX/fat/plugins/qt3 -release -shared -qt-gif  -system-zlib -qt-libjpeg -qt-libmng 

# in mkspecs/macx-g++/qmake.conf:
        QMAKE_CFLAGS = -pipe -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk
        QMAKE_LFLAGS = -headerpad_max_install_names -arch ppc -arch i386 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5.sdk

# These must be in path for qmake to work correctly.
export DYLD_LIBRARY_PATH=`pwd`/lib
export PATH=$PATH:`pwd`/bin

-----

Prepare libraries:

mkdir $BROOT/extlib/$MACOSX_DEPLOYMENT_TARGET

cd $BROOT/dep/$MACOSX_DEPLOYMENT_TARGET/fat/lib

cp libboost_python-1_34_1.dylib libfftw.dylib libfftw3f.dylib  libgsl.dylib libgslcblas.dylib  libhdf5.dylib libjpeg.dylib libpng.dylib libpng12.dylib librfftw.dylib libsz.dylib libtiff.dylib qt3/libqt.dylib $BROOT/extlib/$MACOSX_DEPLOYMENT_TARGET

cd $BROOT/extlib/$MACOSX_DEPLOYMENT_TARGET
mv libboost_python-1_34_1.dylib libboost_python.dylib

# set install_name. necessary for placing the app bundle wherever is convenient.
for i in *dylib;do install_name_tool -id @loader_path/../../extlib/$i $i;done

------

EMAN

Do NOT load vars script.

$BROOT/dep/cmake/bin/ccmake -DCMAKE_INSTALL_NAME_DIR:STRING=@loader_path/../lib  $BROOT/EMAN/

export DYLD_LIBRARY_PATH=$BROOT/dep/10.5/src/qt-mac-free-3.3.8/lib/


#########################
# 10.5 32 bits. Default options except those below:

 BOOST_INCLUDE_PATH               /Volumes/EMAN/dep/10.5/include/boost-1_34_1                                                                                     
 BOOST_LIBRARY                    /Volumes/EMAN/extlib/10.5/libboost_python.dylib                                                                                 
                                                                                                               
 CMAKE_BACKWARDS_COMPATIBILITY    2.4                                                                                                                             
                                                                                                            
 CMAKE_CXX_FLAGS                  -mmacosx-version-min=10.5                                                                                                       
 CMAKE_C_FLAGS                    -mmacosx-version-min=10.5                                                                                                       

                                                                                                        
 CMAKE_INSTALL_NAME_DIR           @loader_path/../lib                                                                                                             
 CMAKE_OSX_ARCHITECTURES          i386;ppc                                                                                                                        
 CMAKE_OSX_SYSROOT                /Developer/SDKs/MacOSX10.5.sdk                                                                                                  
 CMAKE_VERBOSE_MAKEFILE           ON                                                                                                                                                                                                                                  
 EMAN_INSTALL_PREFIX              /Volumes/EMAN/stage/10.5/EMAN/EMAN                                                                                              
                                                                                                                     
 EXECUTABLE_OUTPUT_PATH           /Volumes/EMAN/build/10.5/32/EMAN/bin                                                                                            
 FFTW_INCLUDE_PATH                /Volumes/EMAN/dep/10.5/include                                                                                                  
 FFTW_LIBRARY                     /Volumes/EMAN/extlib/10.5/libfftw.dylib                                                                                         
 GSL_CBLAS_LIBRARY                /Volumes/EMAN/extlib/10.5/libgslcblas.dylib          
 GSL_INCLUDE_PATH                 /Volumes/EMAN/dep/10.5/include                                                                                                  
 GSL_LIBRARY                      /Volumes/EMAN/extlib/10.5/libgsl.dylib                                                                                          
 HDF_INCLUDE_PATH                 /Volumes/EMAN/dep/10.5/include                                                                                                  
 HDF_LIBRARY                      /Volumes/EMAN/extlib/10.5/libhdf5.dylib                                                                                         
 JPEG_LIBRARY                     /Volumes/EMAN/extlib/10.5/libjpeg.dylib                                                                                         
 LIBRARY_OUTPUT_PATH              /Volumes/EMAN/build/10.5/32/EMAN/lib                                                                                            
 PNG_INCLUDE_PATH                 /Volumes/EMAN/dep/10.5/include                                                                                                  
 PNG_LIBRARY                      /Volumes/EMAN/extlib/10.5/libpng.dylib                                                                                          
 PYTHON_INCLUDE_PATH              /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Python.framework/Versions/2.5/Headers                                  
 PYTHON_LIBRARY                   /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libpython.dylib                                                                          
 QT_INCLUDE_DIR                   /Volumes/EMAN/dep/10.5/qt3/include                                                                                              
 QT_MOC_EXECUTABLE                /Volumes/EMAN/dep/10.5/fat/bin/qt3/moc                                                                                          
 QT_QT_LIBRARY                    /Volumes/EMAN/extlib/10.5/libqt.dylib                                                                                           
 QT_UIC_EXECUTABLE                /Volumes/EMAN/dep/10.5/fat/bin/qt3/uic                                                                                          
 RFFTW_LIBRARY                    /Volumes/EMAN/extlib/10.5/librfftw.dylib                                                                                        
 TIF_INCLUDE_PATH                 /Volumes/EMAN/dep/10.5/include                                                                                                  
 TIF_LIBRARY                      /Volumes/EMAN/extlib/10.5/libtiff.dylib                                                                                         
 X11_X11_INCLUDE_PATH                                                                                                                                             
 X11_X11_LIB                                                                                                                                                      
 X11_Xext_LIB                                                                                                                                                     
 X11_Xlib_INCLUDE_PATH                                                                                                                                            
 X11_Xutil_INCLUDE_PATH                                                                                                                                           
 Z_LIBRARY                        /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libz.dylib  


#########################
# 10.5, 64 bits. Same as 10.5/32, but with changes:

 EMAN_INSTALL_PREFIX              /Volumes/EMAN/stage/10.5/EMAN/EMAN.64                                                                                                             
 CMAKE_OSX_ARCHITECTURES          x86_64;ppc64                                                                                                                                                        
 ENABLE_GUI                       OFF                                                                                                                                                              

-------

EMAN Post-install

# Load vars

source $BROOT/vars10.5.sh

$BROOT/Resources/scripts/makeapps.sh

# Set EMAN dir icon using Finder... copy applet.icns and paste into folder icon in 'get info'

cd $BROOT/stage/
rm -v EMAN_*.dmg
hdiutil  create -srcfolder 10.5 EMAN_Leopard.dmg
hdiutil  create -srcfolder 10.4 EMAN_Tiger.dmg

EMAN_COMPILE_MacOS_X_for_Distribution (last edited 2009-07-22 21:32:58 by root)