Search code examples
macportslibiconv

How to replace MacPort's libiconv with Mac's default 64-bit version?


MacPorts installed "libiconv @1.14_0+universal" as a dependency on my system. This happens to be a 32-bit flavor and it started causing issue when I tried to compile a voice recognition software called Simon Listens. While googling I found out that that Mac actually ships with a 64-bit flavor of libiconv by default and I was able to locate the said files on my system:

$ find /usr/lib -name libiconv*
/usr/lib/libiconv.2.4.0.dylib
/usr/lib/libiconv.2.dylib
/usr/lib/libiconv.dylib

In order to use the system library, the quickest way I could think of was to uninstall MacPort's version of libiconv so that the system's library would end up getting selected as a fallback as it has to present (my guess) somewhere downstairs on the PATH already.

But that failed due to dependecies:

$ sudo port uninstall libiconv @1.14_0+universal
Unable to uninstall libiconv @1.14_0+universal, the following ports depend on it:
...

So now my question is how can I tell MacPort to replace its dependency graph to point to and use the library already on my system?


Solution

  • Another approach to avoid MacPorts libiconv issues would be to build simon against a fresh MacPorts system plus the necessary packages such as cyrus-sasl2, zlib, portaudio and kdesdk4 in a custom location, e. g. /opt/macports-simon.

    The following code worked for me on my machine running Mac OS X 10.6.8:

    # compile simon on Mac OS X 10.6.8 using MacPorts for the installation of zlib, portaudio and kdesdk4
    # http://www.simon-listens.org
    # http://sourceforge.net/projects/speech2text/
    
    # get a root shell
    sudo -H -i  
    
    # prevent idle sleep
    pmset -a force sleep 0 displaysleep 0 disksleep 0
    
    mv -i /opt/local /opt/local-off
    mv -i /usr/local /usr/local-off
    
    cd /tmp
    mkdir buildsimon || exit 1
    cd buildsimon || exit 1
    
    # create custom /opt/macports-simon to install zlib, portaudio and kdesdk4
    # cf. http://guide.macports.org/#installing.macports.source.multiple
    MP_PREFIX='/opt/macports-simon'
    unset PATH
    export PATH='/bin:/sbin:/usr/bin:/usr/sbin'
    curl -L -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.4.tar.bz2
    tar -xjf MacPorts-2.0.4.tar.bz2
    cd MacPorts-2.0.4 || exit 1
    ./configure --prefix="${MP_PREFIX}" --with-applications-dir="${MP_PREFIX}/Applications"
    make
    make install
    
    cd /tmp/buildsimon
    
    unset PATH
    export PATH="${MP_PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbin"
    
    # get the Portfiles and update the system
    port -v selfupdate
    
    # install cyrus-sasl2
    port -f uninstall cyrus-sasl2
    port clean --all cyrus-sasl2
    port extract cyrus-sasl2
    cd "$(port dir cyrus-sasl2)"/work/cyrus-sasl-2.1.23
    printf '%s\n' H '/\(darwin\[15\]\)/s//\1./g' wq | sudo ed -s config/ltconfig
    printf '%s\n' H '/\(darwin\[15\]\)/s//\1./g' wq | sudo ed -s saslauthd/config/ltconfig
    cd /tmp/buildsimon
    port -f -s install cyrus-sasl2
    otool -L /opt/macports-simon/lib/libsasl2.dylib
    
    port -f install zlib
    port -f install portaudio
    port -f install kdesdk4
    
    port installed zlib portaudio kdesdk4 cyrus-sasl2
    
    # enable dbus with launchd
    # http://www.freedesktop.org/wiki/Software/dbus
    # open -e dbus-1.5.8/README.launchd
    launchctl load -w /Library/LaunchDaemons/org.freedesktop.dbus-system.plist 
    launchctl load -w /Library/LaunchAgents/org.freedesktop.dbus-session.plist
    sudo -u _mysql mysql_install_db5
    sudo port load mysql5-server
    
    # todo: how to configure simon to use /opt/macports-simon directly?
    ln -isv "${MP_PREFIX}" /usr/local
    
    cd /tmp/buildsimon
    
    # http://sourceforge.net/projects/speech2text/
    curl -L -O http://netcologne.dl.sourceforge.net/project/speech2text/simon/0.3.0/simon-0.3.0.tar.bz2
    tar -xjf simon-0.3.0.tar.bz2 
    cd simon-0.3.0 || exit 1
    
    # Note that /usr/local got symlinked to "${MP_PREFIX}" above!
    unset PATH
    export PATH='/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin'
    
    
    # the following commands are taken from simon-0.3.0/build.sh
    
    mkdir build 2> /dev/null
    cd build || exit 1
    cmake -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` ..
    
    # append ${MP_PREFIX}/lib/libiconv.dylib to gcc command in link.txt file
    printf '%s\n' H '/\/usr\/bin\/gcc/s|\(.*\)|\1 '"${MP_PREFIX}"'/lib/libiconv.dylib|' wq | 
       ed -s julius/julius/CMakeFiles/juliusexe.dir/link.txt
    
    # replace gcc option ' -bundle ' with ' -dynamiclib '
    egrep -Ilsr -Z -e ' -bundle ' . | 
       xargs -0 -n 1 /bin/sh -c 'printf "%s\n" H "g/ -bundle /s// -dynamiclib /g" wq | /bin/ed -s "${1}"' argv0
    
    make
    
    touch ./julius/gramtools/mkdfa/mkfa-1.44-flex/* 
    make 
    make install
    # ldconfig    # not needed on Mac OS X
    kbuildsycoca4 
    echo -e "**** Build completed ****\n\nThe executable file \"simon\" is now ready and has been installed.\n\nIssue \"simon\" to start it."
    
    unset PATH
    export PATH="${MP_PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbin"
    
    otool -L "${MP_PREFIX}/bin/simon"
    
    simon
    
    mv -i /opt/local-off /opt/local 
    mv -i /usr/local-off /usr/local