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/real
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/libe10k_vf.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    gcc)
34	mode=compilelink
35	;;
36    ld)
37	mode=link
38	;;
39
40    ar)
41	mode=archive
42	;;
43
44    ranlib)
45	mode=ranlib
46	;;
47
48    *)
49	echo "$0: Unknown program ($prog)" > /dev/stderr
50	exit 1
51	;;
52esac
53
54argi=0
55for arg in "$@"; do
56    case $arg in
57	-print-prog-name=*)
58	    # Print executable name for cross compiler if asked to do so
59	    echo x86_64-barrelfish-none-${arg#-print-prog-name=}
60	    exit 0
61	    ;;
62
63	-c)
64	    # We solely compile when -c is given
65	    if [ $mode = compilelink ]; then
66		mode=compile
67	    fi
68	    ;;
69
70	-lm)
71	    args[$argi]="$BUILDPATH/x86_64/lib/libm.a"
72	    ;;
73
74	-shared)
75	    echo $0: Shared objects not supported by Barrelfish! >/dev/stderr
76	    exit 1
77	    ;;
78    esac
79
80    argi=$((argi + 1))
81done
82
83case $mode in
84    compile)
85	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[@]}"
86	;;
87
88    compilelink)
89	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
90	;;
91
92    link)
93	ld "${args[@]}"
94	;;
95
96    archive)
97	ar "${args[@]}"
98	;;
99
100    ranlib)
101	ranlib "${args[@]}"
102	;;
103
104    *)
105	echo "$0: Internal cross-compilation wrapper error (mode $mode)!" > /dev/stderr
106	exit 1
107	;;
108esac
109