-
-
Save mzero/7245290 to your computer and use it in GitHub Desktop.
| #!/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 |
On my system, the builtin echo on line 42 eats up the leading -E. Replacing with /bin/echo fixes that. Yay shell!
Also, clang complains incessantly about the -nodefaultlibs flag, I stripped that out with "${@/-nodefaultlibs/}".
Hi,
I think currently the script does not escape spaces properly. I've stumbled upon this problem when I was trying to build darcs with this wrapper: http://bugs.darcs.net/issue2355?
The -DPACKAGE_VERSION_STATE="+1 patch" parameter for GHC behaves weirdly and results in build failure as shown in the log: http://pastebin.com/zVK2GkRz
@elaforge Could you post a gist with your fix for -nodefaultlibs?
I've fixed the -nodefaultlibs warning in https://gist.github.com/tibbe/8448715.
Works beautifully, thank you!
Solved my problems after recently migrating to OSX. Thanks.
Works nicely, thanks!
Is this still relevant on OS X Yosemite?
In case feedback is still useful, this script doesn't notice ghc that is installed via stow. (It did patch my existing binary HP one with ghc 7.4.1 though)
I guess I should note that when I upgraded to Mavericks, ghc still seemed to work anyway, but I'm not really following the issue closely enough to know if something broke.