Skip to content

Instantly share code, notes, and snippets.

@mzero
Created October 31, 2013 06:53
Show Gist options
  • Select an option

  • Save mzero/7245290 to your computer and use it in GitHub Desktop.

Select an option

Save mzero/7245290 to your computer and use it in GitHub Desktop.

Revisions

  1. mzero created this gist Oct 31, 2013.
    112 changes: 112 additions & 0 deletions ghc-clang-wrapper
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,112 @@
    #!/bin/sh

    inPreprocessorMode () {
    hasE=0
    hasU=0
    hasT=0
    for arg in "$@"
    do
    if [ 'x-E' = "x$arg" ]; then hasE=1; fi
    if [ 'x-undef' = "x$arg" ]; then hasU=1; fi
    if [ 'x-traditional' = "x$arg" ]; then hasT=1; fi
    done
    [ "$hasE$hasU$hasT" = '111' ]
    }

    gccIsClang () {
    gcc --version 2>/dev/null | grep -q clang
    }

    extraClangArgs="-Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs"

    adjustPreprocessorLanguage () {
    newArgs=''
    while [ $# -gt 0 ]
    do
    newArgs="$newArgs $1"
    if [ "$1" = '-x' ]
    then
    shift
    if [ $# -gt 0 ]
    then
    if [ "$1" = 'c' ]
    then
    newArgs="$newArgs assembler-with-cpp"
    else
    newArgs="$newArgs $1"
    fi
    fi
    fi
    shift
    done
    echo $newArgs
    }

    installThisScript () {
    if [ \! -x /usr/bin/ghc-clang-wrapper ]
    then
    echo "Copy this execute script to /usr/bin/ghc-clang-wrapper, then re-run it."
    echo "You can copy it with these commands:"
    echo
    echo sudo cp $0 /usr/bin/ghc-clang-wrapper
    echo sudo chmod 755 /usr/bin/ghc-clang-wrapper
    echo sudo ghc-clang-wrapper
    exit 1
    fi

    settings=`ls -1 /Library/Frameworks/GHC.framework/Versions/7*/usr/lib/ghc-7*/settings 2>/dev/null`

    if [ "$settings" = '' ]
    then
    echo "You don't seem to have Haskell Platform installed."
    echo "Visit http://www.haskell.org/platform/ to get and install it."
    echo "Then run this script again."
    echo
    echo "If you have GHC installed in a non-standard place, find the file"
    echo "named 'settings', that is alongside the compiler, and edit the"
    echo "c compiler line to read:"
    echo ' ("C compiler command", "/usr/bin/ghc-clang-wrapper"),'
    exit 1
    fi

    anyNeedPatching=0
    for sfile in $settings
    do
    if grep -q ghc-clang-wrapper $sfile
    then
    echo ALREADY PATCHED: $sfile
    else
    if [ `id -u` -eq 0 ]
    then
    sed -e '/C compiler command/s:"[^ ]*gcc":"/usr/bin/ghc-clang-wrapper":' -i '.bak' $sfile
    echo PATCHED: $sfile
    else
    echo WOULD PATCH: $sfile
    anyNeedPatching=1
    fi
    fi
    done

    if [ $anyNeedPatching -eq 1 ]
    then
    echo "Please run this script sudo to actually patch GHC:"
    echo sudo $0
    fi
    }

    if [ $# -eq 0 ]
    then
    installThisScript
    else
    if gccIsClang
    then
    if inPreprocessorMode "$@"
    then
    exec gcc $extraClangArgs `adjustPreprocessorLanguage "$@"`
    else
    exec gcc $extraClangArgs "$@"
    fi
    else
    exec gcc "$@"
    fi
    fi