-
-
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.