1#!/bin/bash
2#
3# Barrelfish x86-64 cross compilation wrapper
4# Copyright (c) 2011 Simon Peter <speter@inf.ethz.ch>
5#
6# Set SRCPATH and BUILDPATH to your Barrelfish source and build paths,
7# respectively, and create symlinks to this file, like this:
8#
9# ln -s barrelfish-cc-wrapper x86_64-barrelfish-none-gcc
10#
11# You can set EXTRALIBS to link to libraries needed on Barrelfish that
12# are not easily figured out by Autoconf or passable as LDFLAGS on the
13# commandline.
14
15# echo "invoked with: $*" >> debug.out
16
17SRCPATH=/home/simpeter/projects/arrakis/src
18BUILDPATH=/home/simpeter/projects/arrakis/qemu
19EXTRALIBS="$BUILDPATH/x86_64/lib/libposixcompat.a $BUILDPATH/x86_64/lib/libvfs.a $BUILDPATH/x86_64/lib/libahci.a $BUILDPATH/x86_64/lib/libnfs.a $BUILDPATH/x86_64/lib/libarranet.a $BUILDPATH/x86_64/lib/libe1000n.a"
20#EXTRALIBS="$BUILDPATH/x86_64/lib/libposixcompat.a $BUILDPATH/x86_64/lib/libvfs.a $BUILDPATH/x86_64/lib/libahci.a $BUILDPATH/x86_64/lib/libnfs.a $BUILDPATH/x86_64/lib/liblwip.a $BUILDPATH/x86_64/lib/libcontmng.a $BUILDPATH/x86_64/lib/liboctopus.a"
21
22mode=unknown
23prog=${0##*-}
24
25# Copy commandline arguments
26argi=0
27for a in "$@"; do
28    args[$argi]=$a
29    argi=$((argi + 1))
30done
31
32case $prog in
33    g++)
34	mode=compilelink++
35	;;
36    gcc)
37	mode=compilelink
38	;;
39    ld)
40	mode=link
41	;;
42
43    ar)
44	mode=archive
45	;;
46
47    ranlib)
48	mode=ranlib
49	;;
50
51    *)
52	echo "$0: Unknown program ($prog)" > /dev/stderr
53	exit 1
54	;;
55esac
56
57argi=0
58for arg in "$@"; do
59    case $arg in
60	-print-prog-name=*)
61	    # Print executable name for cross compiler if asked to do so
62	    echo x86_64-barrelfish-none-${arg#-print-prog-name=}
63	    exit 0
64	    ;;
65
66	-c)
67	    # We solely compile when -c is given
68	    if [ $mode = compilelink ]; then
69		mode=compile
70	    elif [ $mode = compilelink++ ]; then
71		mode=compile++
72	    fi
73	    ;;
74
75	-lm)
76	    args[$argi]="$BUILDPATH/x86_64/lib/libm.a"
77	    ;;
78
79	-shared)
80	    echo $0: Shared objects not supported by Barrelfish! >/dev/stderr
81	    exit 1
82	    ;;
83    esac
84
85    argi=$((argi + 1))
86done
87
88case $mode in
89    compile)
90	gcc -nostdinc -nostdlib -static -fno-builtin -m64 -mno-red-zone -U__linux__ -Ulinux -DBARRELFISH -DCONFIG_QEMU_NETWORK -DTRACE_DISABLE_LRPC -DCONFIG_LAZY_THC -DCONFIG_NEWLIB -DUSE_KALUGA_DVM -DCONFIG_INTERCONNECT_DRIVER_LMP -DCONFIG_INTERCONNECT_DRIVER_UMP -DCONFIG_INTERCONNECT_DRIVER_MULTIHOP -DCONFIG_FLOUNDER_BACKEND_LMP -DCONFIG_FLOUNDER_BACKEND_UMP -DCONFIG_FLOUNDER_BACKEND_MULTIHOP -I$SRCPATH/include -I$SRCPATH/include/arch/x86_64 -I$SRCPATH/lib/newlib/newlib/libc/include -I$SRCPATH/include/c -I$SRCPATH/include/target/x86_64 -I$SRCPATH/lib/lwip-1.4.1/src/include/ipv4 -I$SRCPATH/lib/lwip-1.4.1/src/include -I$BUILDPATH/x86_64/include -I$BUILDPATH/x86_64/include/dev "${args[@]}"
91	;;
92
93    compilelink)
94	gcc $BUILDPATH/x86_64/lib/crt0.o $BUILDPATH/x86_64/lib/crtbegin.o -Wl,-z,max-page-size=0x1000 -nostdinc -nostdlib -static -fno-builtin -m64 -mno-red-zone -U__linux__ -Ulinux -DBARRELFISH -DCONFIG_QEMU_NETWORK -DTRACE_DISABLE_LRPC -DCONFIG_LAZY_THC -DCONFIG_NEWLIB -DUSE_KALUGA_DVM -DCONFIG_INTERCONNECT_DRIVER_LMP -DCONFIG_INTERCONNECT_DRIVER_UMP -DCONFIG_INTERCONNECT_DRIVER_MULTIHOP -DCONFIG_FLOUNDER_BACKEND_LMP -DCONFIG_FLOUNDER_BACKEND_UMP -DCONFIG_FLOUNDER_BACKEND_MULTIHOP -I$SRCPATH/include -I$SRCPATH/include/arch/x86_64 -I$SRCPATH/lib/newlib/newlib/libc/include -I$SRCPATH/include/c -I$SRCPATH/include/target/x86_64 -I$SRCPATH/lib/lwip-1.4.1/src/include/ipv4 -I$SRCPATH/lib/lwip-1.4.1/src/include -I$BUILDPATH/x86_64/include -I$BUILDPATH/x86_64/include/dev "${args[@]}" $EXTRALIBS $BUILDPATH/x86_64/lib/libbarrelfish.a $BUILDPATH/x86_64/lib/liboctopus_parser.a $BUILDPATH/x86_64/errors/errno.o $BUILDPATH/x86_64/lib/libnewlib.a $BUILDPATH/x86_64/lib/crtend.o $BUILDPATH/x86_64/lib/libcollections.a
95	;;
96
97    link)
98	ld "${args[@]}"
99	;;
100
101    archive)
102	ar "${args[@]}"
103	;;
104
105    ranlib)
106	ranlib "${args[@]}"
107	;;
108
109    *)
110	echo "$0: Internal cross-compilation wrapper error (mode $mode)!" > /dev/stderr
111	exit 1
112	;;
113esac
114