#!/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"

header ()
{
	echo -e "\n$1\n"
	rm -rf .build
	mkdir .build
}

compile ()
{
	for fname in $2; do
		fname=`basename $fname .c`
		$1 -o .build/$fname.o -c $fname.c
	done
}

link ()
{
	objs=""
	for fname in $2; do
		objs="$objs .build/`basename $fname .c`.o"
	done
	$1 $objs $3
}

header "[ Windows 32bit ]"
compile "i686-w64-mingw32-gcc $X86_CFLAGS" "$SRCS"
link "i686-w64-mingw32-gcc -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 .build/windows_rc.o
i686-w64-mingw32-windres windows_icon_rc.rc .build/windows_icon_rc.o
compile "i686-w64-mingw32-gcc $X86_CFLAGS $GUI_CFLAGS" "$GUI_WINDOWS_SRCS shell.c"
link "i686-w64-mingw32-gcc -o shell_windows32_gui.exe" "$SRCS $GUI_WINDOWS_SRCS" ".build/windows_rc.o $GUI_WINDOWS_LIBS"
link "i686-w64-mingw32-gcc -o shell_windows32_gui_icon.exe" "$SRCS $GUI_WINDOWS_SRCS" ".build/windows_icon_rc.o $GUI_WINDOWS_LIBS"
i686-w64-mingw32-strip shell_windows32_gui.exe shell_windows32_gui_icon.exe
mv -f shell_windows32_gui.exe shell_windows32_gui
mv -f shell_windows32_gui_icon.exe shell_windows32_gui_icon

header "[ Windows 64bit ]"
compile "x86_64-w64-mingw32-gcc $CFLAGS" "$SRCS"
link "x86_64-w64-mingw32-gcc -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 .build/windows_rc.o
x86_64-w64-mingw32-windres windows_icon_rc.rc .build/windows_icon_rc.o
compile "x86_64-w64-mingw32-gcc $CFLAGS $GUI_CFLAGS" "$GUI_WINDOWS_SRCS shell.c"
link "x86_64-w64-mingw32-gcc -o shell_windows64_gui.exe" "$SRCS $GUI_WINDOWS_SRCS" ".build/windows_rc.o $GUI_WINDOWS_LIBS"
link "x86_64-w64-mingw32-gcc -o shell_windows64_gui_icon.exe" "$SRCS $GUI_WINDOWS_SRCS" ".build/windows_icon_rc.o $GUI_WINDOWS_LIBS"
x86_64-w64-mingw32-strip shell_windows64_gui.exe shell_windows64_gui_icon.exe
mv -f shell_windows64_gui.exe shell_windows64_gui
mv -f shell_windows64_gui_icon.exe shell_windows64_gui_icon

header "[ Linux 32bit ]"
compile "gcc -m32 -I/usr/i686-linux-gnu/include $X86_CFLAGS" "$SRCS"
link "gcc -m32 -o shell_linux32" "$SRCS" "$LINUX_LIBS"
strip shell_linux32
compile "gcc -m32 -I/usr/i686-linux-gnu/include $X86_CFLAGS $GUI_CFLAGS" "$GUI_LINUX_SRCS shell.c"
link "gcc -m32 -o shell_linux32_gui" "$SRCS $GUI_LINUX_SRCS" "$LINUX_LIBS"
strip shell_linux32_gui

header "[ Linux 64bit ]"
compile "gcc $CFLAGS -fno-optimize-strlen" "$SRCS"
link "gcc -o shell_linux64" "$SRCS" "$LINUX_LIBS"
strip shell_linux64
compile "gcc $CFLAGS -fno-optimize-strlen $GUI_CFLAGS" "$GUI_LINUX_SRCS shell.c"
link "gcc -o shell_linux64_gui" "$SRCS $GUI_LINUX_SRCS" "$LINUX_LIBS"
strip shell_linux64_gui

header "[ Mac OS ]"
compile "/root/osxcross/target/bin/o64-clang $CFLAGS" "$SRCS"
link "/root/osxcross/target/bin/o64-clang -o shell_macos" "$SRCS" "$MACOS_LIBS"
/root/osxcross/target/bin/x86_64-apple-darwin10-strip shell_macos
compile "/root/osxcross/target/bin/o64-clang $CFLAGS $GUI_CFLAGS" "$GUI_MACOS_SRCS shell.c"
link "/root/osxcross/target/bin/o64-clang -o shell_macos_gui" "$SRCS $GUI_MACOS_SRCS" "$GUI_MACOS_LIBS"
/root/osxcross/target/bin/x86_64-apple-darwin10-strip shell_macos_gui

header "[ Haiku 32bit ]"
compile "$HAIKU32_ROOT/bin/i586-pc-haiku-gcc $X86_CFLAGS $HAIKU32_CFLAGS" "$SRCS"
link "$HAIKU32_ROOT/bin/i586-pc-haiku-gcc -o shell_haiku32" "$SRCS" "$HAIKU32_LIBS $HAIKU_LIBS"
$HAIKU32_ROOT/bin/i586-pc-haiku-strip shell_haiku32
compile "$HAIKU32_ROOT/bin/i586-pc-haiku-gcc $X86_CFLAGS $HAIKU32_CFLAGS $GUI_CFLAGS" "$GUI_HAIKU_SRCS shell.c"
link "$HAIKU32_ROOT/bin/i586-pc-haiku-gcc -o shell_haiku32_gui" "$SRCS $GUI_HAIKU_SRCS" "$HAIKU32_LIBS $HAIKU_LIBS"
$HAIKU32_ROOT/bin/i586-pc-haiku-strip shell_haiku32_gui

header "[ Haiku 64bit ]"
compile "$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc $CFLAGS $HAIKU64_CFLAGS" "$SRCS"
link "$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc -o shell_haiku64" "$SRCS" "$HAIKU64_LIBS $HAIKU_LIBS"
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-strip shell_haiku64
compile "$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc $CFLAGS $HAIKU64_CFLAGS $GUI_CFLAGS" "$GUI_HAIKU_SRCS shell.c"
link "$HAIKU64_ROOT/bin/x86_64-unknown-haiku-gcc -o shell_haiku64_gui" "$SRCS $GUI_HAIKU_SRCS" "$HAIKU64_LIBS $HAIKU_LIBS"
$HAIKU64_ROOT/bin/x86_64-unknown-haiku-strip shell_haiku64_gui

header "[ Raspberry Pi 32bit ]"
compile "$RPI32_PREFIX-gcc $CFLAGS $RPI32_CFLAGS" "$SRCS"
link "$RPI32_PREFIX-gcc -o shell_raspi32" "$SRCS" "$LINUX_LIBS"
$RPI32_PREFIX-strip shell_raspi32
compile "$RPI32_PREFIX-gcc $CFLAGS $RPI32_CFLAGS $GUI_CFLAGS" "$GUI_LINUX_SRCS shell.c"
link "$RPI32_PREFIX-gcc -o shell_raspi32_gui" "$SRCS $GUI_LINUX_SRCS" "$LINUX_LIBS"
$RPI32_PREFIX-strip shell_raspi32_gui

rm -rf .build

echo -e "\nCompressing..."

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

echo -e "\nAll done!"
