Skip to content

Building an OS X Distribution

gdietz edited this page Apr 22, 2013 · 40 revisions

We have moved to using cx-freeze for creating mac builds. NOTE, the immediately following is slightly outdated. Please skip to the bottom to see updates since the move to OS X 10.7.

OUTDATED -- kept for posterity see bottom of page for more recent!

Once cxfreeze is built and in your path, the following should do the trick:

cxfreeze path/to/meta_form.py

Be careful to use the correct paths; for whatever reason it complains otherwise. For example, on my laptop:

$ build/scripts-2.7/cxfreeze /Users/byronwallace/dev/OpenMeta-analyst-/meta_form.py

(From $HOME).

This will generate a double-clickable executable (by default in the "dist" directory of whatever directory cx_freeze is in; you can change this using --target=... (I think)). Hurray!

There's also the issue of setting a pointer to (our) R distribution. This can be done using cx-freeze's initscript argument, as follows

byronwallace$ build/scripts-2.7/cxfreeze /Users/byronwallace/dev/OpenMeta-analyst-/meta_form.py --init-script=/Users/byronwallace/dev/OpenMeta-analyst-/open_meta_mac.py

This tells cx_freeze to run open_meta_mac first -- this script sets the R_HOME variable accordingly.

There are other issues. First, the program will try to load dynamic libraries from absolute paths that don't exist on target machines (/opt/local/...), even those the libraries it's trying to load are in the "dist" directory. You can fix this by exporting the environment variable DYLD_LIBRARY_PATH to point to the dist directory, e.g.,

export DYLD_LIBRARY_PATH=/Users/issa/Desktop/dist

This has been moved to the open_meta_mac.py script, like R_HOME. It usually works, however, on some machines it doesn't seem to work for some unknown/frustrating reason. Indeed, in such cases, doing the above at the console and then launching the program does the trick. This should be exactly equivalent to doing it at the console manually. sigh.

In general, sometimes R libraries/packages rely on dylib files. In such cases, make sure you distribute the corresponding files in the dist directory! Otherwise you will get complaints that they don't exist/cannot be loaded.

**Crucially, you need to replace the "libiconv" library in the generated binary -- otherwise you will get "_iconv" errors. More recent versions of this will suffice. I resolved the issue by copying the version on my local machine (dated 6/24/10): this is saved locally in the tellingly named 'use-this-libconv' directory, or look for "libiconv.dylib" and overwrite the current version in the "dist" directory. **

Finally, you'll also need to copy the qtmenu.nib file to the "dist" directory.

To update the R library, build openmetar in the usual way (via console) and install it. then copy the built library to the R_dist directory. This is at:

/Library/Frameworks/R.framework/Versions/2.10/Resources/library

A last note to self: make sure you use the correct python path, i.e., do

export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/:$PATH Before building.


With 4.3:

sudo cx_Freeze-4.3/build/scripts-2.7/cxfreeze OpenMeta-analyst-/meta_form.py --init-script=/Users/bwallace/dev/cx_Freeze-4.3/initscripts/open_meta_mac.py

--

POST MOUNTAIN-LION

First, delete the app at dev/OpenMetaAnalyst currently (otherwise you will get errors when you try to build). You will be re-using things in dev/frozen/prototype, DO NOT DELETE THIS.

cd dev/OpenMetaAanalyst sudo python-oma setup_redux.py build

Then copy dylibs from the dylibs directory into the dev/frozen/OpenMetaAnalyst.app/Contents/MacOS (see below for notes). Further, you'll need to grab the R_dist folder from an existing build and drop this in the same directory. (Overwrite open_meta_r as appropriate). Note that R libs live locally @:

/Library/Frameworks/R.framework/Versions/2.13/Resources/library

Finally, open meta.ico and 'get info' on OpenMetaAnalyst.app. Then copy the icon and paste it into the icon spot in the info panel of the app.

New issues with OS X 10.7 (mountain lion). This move caused all sorts of problems. The biggest issue seems to be with libiconv.2.dylib. But first, a summary of what we're doing now.

  • We now build an app. This is done with cx_Freeze -- output goes to dev/frozen.

In general, check your dependency paths as follows:

otool -L libpango-1.0.0.dylib

The cx_Freeze script should change all absolute paths to relative. /opt/local should not appear in the output from doing the above. However, if it does that same file better be distributed in the OpenMeta directory. This will be found because you set the dyld_fallback path in the init_script (open_meta_mac.py)

There are issues with libiconv. Terrible, terrible issues. QT depends on version 7; everything else on version 8 (which I believe shipped with 10.7). Hence I distribute two versions, calling version 8 libiconv.2.8.dylib. I then change the pointers of the libraries that depend on libiconv.8 to this library, as follows:

sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2.8.dylib libpango-1.0.0.dylib

You shouldn't need to do this again, so long as you copy the *.dylibs in the "dylibs" directory (in Frozen). (You may want to explicitly rename libiconv.2 to libiconv.2.7 in the future, in case someone happens to have this version at /opt/local or whatever on their own machine -- the program will throw up if it tries to load this guy.)

Another small note on Mac Applications; when you launch the program via double-clicking, the relative R directory seems to be the very top level (i.e., the folder from where the program was launched). For whatever reason, the OS will often not let Python (or R) create sub-directories here. Notably, this means r_tmp will not be created, which means when you try and run an analysis, it will fail. Confusingly, when you invoke the application manually, i.e., via:

OpenMetaAnalyst.app/Contents/MacOS/meta_form

It creates the tmp dir as expected (and will subsequently run fine afterward via double-click launch). As a short-term fix, I have added an r_tmp folder to the top-level directory in the distribution.

Concise instructions to myself:

  1. Run ./clean_build to clean out all the build info (may have to run as sudo)
  2. python setup_redux.py build 2.5 Copy R_dist folder in to ../frozen/Openmetaapp/Contents/MacOS folder
  3. In frozen directory in MacOS folder: mv libiconv.2.dylib libiconv.2-v8.dylib
  4. cp /usr/lib/libiconv.2.dylib libiconv.2.dylib
  5. Run all these crazy commands in order to fix dependency issues:

sudo install_name_tool -id @executable_path/libiconv.2-v8.dylib libiconv.2-v8.dylib
sudo install_name_tool -id @executable_path/libiconv.2.dylib libiconv.2.dylib
sudo install_name_tool -change @executable_path/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libR.dylib
sudo install_name_tool -change @executable_path/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libintl.8.dylib

sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib R_dist/2.15/library/igraph/libs/x86_64/igraph.so
cp /opt/local/lib/libxml2.2.dylib libxml2.2.dylib
sudo install_name_tool -change /opt/local/lib/libxml2.2.dylib @executable_path/libxml2.2.dylib R_dist/2.15/library/igraph/libs/x86_64/igraph.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libxml2.2.dylib

cp /opt/local/lib/libpangocairo-1.0.0.dylib libpangocairo-1.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libpangocairo-1.0.0.dylib @executable_path/libpangocairo-1.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libpangocairo-1.0.0.dylib

cp /opt/local/lib/libpango-1.0.0.dylib libpango-1.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libpango-1.0.0.dylib @executable_path/libpango-1.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libpango-1.0.0.dylib

cp /opt/local/lib/libgobject-2.0.0.dylib libgobject-2.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libgobject-2.0.0.dylib @executable_path/libgobject-2.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libgobject-2.0.0.dylib

cp /opt/local/lib/libglib-2.0.0.dylib libglib-2.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libglib-2.0.0.dylib @executable_path/libglib-2.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libglib-2.0.0.dylib

cp /opt/local/lib/libgthread-2.0.0.dylib libgthread-2.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libgthread-2.0.0.dylib @executable_path/libgthread-2.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libgthread-2.0.0.dylib

cp /opt/local/lib/libgmodule-2.0.0.dylib libgmodule-2.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libgmodule-2.0.0.dylib @executable_path/libgmodule-2.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libgmodule-2.0.0.dylib

cp /opt/local/lib/libpangoft2-1.0.0.dylib libpangoft2-1.0.0.dylib
sudo install_name_tool -change /opt/local/lib/libpangoft2-1.0.0.dylib @executable_path/libpangoft2-1.0.0.dylib R_dist/2.15/modules/x86_64/R_X11.so
sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libpangoft2-1.0.0.dylib
  1. export DYLD_LIBRARY_PATH=/Users/george/git/frozen/OpenMetaAnalyst.app/Contents/MacOS/
  2. Here are some more commands that I made up and appear to do nothing:

#libSM.6.dylib
    cp /opt/local/lib/libSM.6.dylib libSM.6.dylib
    sudo install_name_tool -change /opt/local/lib/libSM.6.dylib @executable_path/libSM.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libSM.6.dylib
#libICE.6.dylib
    cp /opt/local/lib/libICE.6.dylib libICE.6.dylib
    sudo install_name_tool -change /opt/local/lib/libICE.6.dylib @executable_path/libICE.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libICE.6.dylib
#libintl.8.dylib
    cp /opt/local/lib/libintl.8.dylib libintl.8.dylib
    sudo install_name_tool -change /opt/local/lib/libintl.8.dylib @executable_path/libintl.8.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libintl.8.dylib
#libfreetype.6.dylib         
    cp /opt/local/lib/libfreetype.6.dylib libfreetype.6.dylib
    sudo install_name_tool -change /opt/local/lib/libfreetype.6.dylib @executable_path/libfreetype.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libfreetype.6.dylib
#libfontconfig.1.dylib
    cp /opt/local/lib/libfontconfig.1.dylib libfontconfig.1.dylib
    sudo install_name_tool -change /opt/local/lib/libfontconfig.1.dylib @executable_path/libfontconfig.1.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libfontconfig.1.dylib
#libpng15.15.dylib
    cp /opt/local/lib/libpng15.15.dylib libpng15.15.dylib
    sudo install_name_tool -change /opt/local/lib/libpng15.15.dylib @executable_path/libpng15.15.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libpng15.15.dylib
#libz.1.dylib
    cp /opt/local/lib/libz.1.dylib libz.1.dylib
    sudo install_name_tool -change /opt/local/lib/libz.1.dylib @executable_path/libz.1.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libz.1.dylib
#libcairo.2.dylib            
    cp /opt/local/lib/libcairo.2.dylib libcairo.2.dylib
    sudo install_name_tool -change /opt/local/lib/libcairo.2.dylib @executable_path/libcairo.2.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libcairo.2.dylib 
#libX11.6.dylib              
    cp /opt/local/lib/libX11.6.dylib libX11.6.dylib
    sudo install_name_tool -change /opt/local/lib/libX11.6.dylib  @executable_path/libX11.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libX11.6.dylib 
#libXext.6.dylib
    cp /opt/local/lib/libXext.6.dylib libXext.6.dylib
    sudo install_name_tool -change /opt/local/lib/libXext.6.dylib @executable_path/libXext.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libXext.6.dylib
#libXt.6.dylib
    cp /opt/local/lib/libXt.6.dylib libXt.6.dylib
    sudo install_name_tool -change /opt/local/lib/libXt.6.dylib @executable_path/libXt.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libXt.6.dylib
#libXmu.6.dylib
    cp /opt/local/lib/libXmu.6.dylib libXmu.6.dylib
    sudo install_name_tool -change /opt/local/lib/libXmu.6.dylib @executable_path/libXmu.6.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libpangoft2-1.0.0.dylib
#libtiff.5.dylib
    cp /opt/local/lib/libtiff.5.dylib libtiff.5.dylib
    sudo install_name_tool -change /opt/local/lib/libtiff.5.dylib @executable_path/libtiff.5.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libtiff.5.dylib
#libjpeg.9.dylib
    cp /opt/local/lib/libjpeg.9.dylib libjpeg.9.dylib
    sudo install_name_tool -change /opt/local/lib/libjpeg.9.dylib @executable_path/libjpeg.9.dylib R_dist/2.15/modules/x86_64/R_X11.so
    sudo install_name_tool -change /opt/local/lib/libiconv.2.dylib @executable_path/libiconv.2-v8.dylib libjpeg.9.dylib
Clone this wiki locally