#!/bin/bash
set -e

SRCS="fixscript.c fixio.c fixtask.c fiximage.c fixnative.c fixutil.c shell.c"
CFLAGS="-DFIXBUILD_BINCOMPAT -Wall -O3"
X86_CFLAGS="$CFLAGS -msse2 -mstackrealign"
WINDOWS_LIBS="-lws2_32 -lmswsock -lwinmm"
LINUX_LIBS="-lm -lrt -lpthread -ldl"
MACOS_LIBS="-lm"
HAIKU_LIBS="-lm -lnetwork"

GUI_CFLAGS="-DFIXBUILD_GUI"
GUI_WINDOWS_SRCS="fixgui.c fixgui_win32.c"
GUI_WINDOWS_LIBS="-lgdi32 -lcomdlg32 -lshlwapi -lcomctl32 -lws2_32 -lmswsock -lwinmm -mwindows"
GUI_LINUX_SRCS="fixgui.c fixgui_gtk.c"
GUI_MACOS_SRCS="fixgui.c fixgui_cocoa.c"
GUI_MACOS_LIBS="-lm -lobjc -framework Cocoa"
GUI_HAIKU_SRCS="fixgui.c fixgui_haiku.c"

HAIKU32_ROOT="/opt/haiku32"
HAIKU32_HEADERS="$HAIKU32_ROOT/system/headers"
HAIKU32_CFLAGS="-I$HAIKU32_HEADERS -I$HAIKU32_HEADERS/posix -I$HAIKU32_HEADERS/os -I$HAIKU32_HEADERS/os/support"
HAIKU32_LIBS="-L$HAIKU32_ROOT/system/lib -B$HAIKU32_ROOT/system/lib/x86"

HAIKU64_ROOT="/opt/haiku64"
HAIKU64_HEADERS="$HAIKU64_ROOT/system/headers"
HAIKU64_CFLAGS="-I$HAIKU64_HEADERS -I$HAIKU64_HEADERS/posix -I$HAIKU64_HEADERS/os -I$HAIKU64_HEADERS/os/support"
HAIKU64_LIBS="-L$HAIKU64_ROOT/system/lib -B$HAIKU64_ROOT/system/lib"

RPI32_PREFIX="/opt/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi"
RPI32_CFLAGS="-march=armv6 -mfloat-abi=hard -mfpu=vfp"

echo -e "\n[ Windows 32bit ]\n"
i686-w64-mingw32-gcc $X86_CFLAGS -o shell_windows32.exe $SRCS $WINDOWS_LIBS
i686-w64-mingw32-strip shell_windows32.exe
mv -f shell_windows32.exe shell_windows32
i686-w64-mingw32-windres windows_rc.rc windows_rc.o
i686-w64-mingw32-gcc $X86_CFLAGS $GUI_CFLAGS -o shell_windows32_gui.exe $SRCS $GUI_WINDOWS_SRCS windows_rc.o $GUI_WINDOWS_LIBS
i686-w64-mingw32-strip shell_windows32_gui.exe
mv -f shell_windows32_gui.exe shell_windows32_gui

echo -e "\n[ Windows 64bit ]\n"
x86_64-w64-mingw32-gcc $CFLAGS -o shell_windows64.exe $SRCS $WINDOWS_LIBS
x86_64-w64-mingw32-strip shell_windows64.exe
mv -f shell_windows64.exe shell_windows64
x86_64-w64-mingw32-windres windows_rc.rc windows_rc.o
x86_64-w64-mingw32-gcc $CFLAGS $GUI_CFLAGS -o shell_windows64_gui.exe $SRCS $GUI_WINDOWS_SRCS windows_rc.o $GUI_WINDOWS_LIBS
x86_64-w64-mingw32-strip shell_windows64_gui.exe
mv -f shell_windows64_gui.exe shell_windows64_gui

echo -e "\n[ Linux 32bit ]\n"
gcc -m32 -I/usr/i686-linux-gnu/include $X86_CFLAGS -o shell_linux32 $SRCS $LINUX_LIBS
strip shell_linux32
gcc -m32 -I/usr/i686-linux-gnu/include $X86_CFLAGS $GUI_CFLAGS -o shell_linux32_gui $SRCS $GUI_LINUX_SRCS $LINUX_LIBS
strip shell_linux32_gui

echo -e "\n[ Linux 64bit ]\n"
gcc $CFLAGS -fno-optimize-strlen -o shell_linux64 $SRCS $LINUX_LIBS
strip shell_linux64
gcc $CFLAGS -fno-optimize-strlen $GUI_CFLAGS -o shell_linux64_gui $SRCS $GUI_LINUX_SRCS $LINUX_LIBS
strip shell_linux64_gui

echo -e "\n[ Mac OS ]\n"
/root/osxcross/target/bin/o64-clang $CFLAGS -o shell_macos $SRCS $MACOS_LIBS
/root/osxcross/target/bin/x86_64-apple-darwin10-strip shell_macos
/root/osxcross/target/bin/o64-clang $CFLAGS $GUI_CFLAGS -o shell_macos_gui $SRCS $GUI_MACOS_SRCS $GUI_MACOS_LIBS
/root/osxcross/target/bin/x86_64-apple-darwin10-strip shell_macos_gui

echo -e "\n[ Haiku 32bit ]\n"
$HAIKU32_ROOT/bin/i586-pc-haiku-gcc $X86_CFLAGS $HAIKU32_CFLAGS -o shell_haiku32 $SRCS $HAIKU32_LIBS $HAIKU_LIBS
$HAIKU32_ROOT/bin/i586-pc-haiku-strip shell_haiku32
$HAIKU32_ROOT/bin/i586-pc-haiku-gcc $X86_CFLAGS $GUI_CFLAGS $HAIKU32_CFLAGS -o shell_haiku32_gui $SRCS $GUI_HAIKU_SRCS $HAIKU32_LIBS $HAIKU_LIBS
$HAIKU32_ROOT/bin/i586-pc-haiku-strip shell_haiku32_gui

echo -e "\n[ Haiku 64bit ]\n"
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc $CFLAGS $HAIKU64_CFLAGS -o shell_haiku64 $SRCS $HAIKU64_LIBS $HAIKU_LIBS
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-strip shell_haiku64
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc $CFLAGS $GUI_CFLAGS $HAIKU64_CFLAGS -o shell_haiku64_gui $SRCS $GUI_HAIKU_SRCS $HAIKU64_LIBS $HAIKU_LIBS
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-strip shell_haiku64_gui

echo -e "\n[ Raspberry Pi 32bit ]\n"
$RPI32_PREFIX-gcc $CFLAGS $RPI32_CFLAGS -o shell_raspi32 $SRCS $LINUX_LIBS
$RPI32_PREFIX-strip shell_raspi32
$RPI32_PREFIX-gcc $CFLAGS $GUI_CFLAGS $RPI32_CFLAGS -o shell_raspi32_gui $SRCS $GUI_LINUX_SRCS $LINUX_LIBS
$RPI32_PREFIX-strip shell_raspi32_gui

echo -e "\nCompressing..."

chmod -x shell_*
gzip -9 -k -n -f shell_*
mv -f shell_*.gz ../bin/

echo -e "\nAll done!"
