merging in the most recent version of everything else
diff --git a/aos/build/aos.gypi b/aos/build/aos.gypi
index 9eeba08..f27361b 100644
--- a/aos/build/aos.gypi
+++ b/aos/build/aos.gypi
@@ -23,17 +23,17 @@
   'conditions': [
     ['OS=="crio"', {
         'make_global_settings': [
-          ['CC', '<!(which powerpc-wrs-vxworks-gcc)'],
-          ['CXX', '<!(which powerpc-wrs-vxworks-g++)'],
-          ['LD', '<!(readlink -f <(AOS)/build/crio_link_out)'],
-          #['LD', 'powerpc-wrs-vxworks-ld'],
-          #['AR', '<!(which powerpc-wrs-vxworks-ar)'],
-          #['NM', '<!(which powerpc-wrs-vxworks-nm)'],
+          ['CC', '<!(readlink -f <(AOS)/build/crio_cc)'],
+          ['CXX', '<!(readlink -f <(AOS)/build/crio_cxx)'],
         ],
         'variables': {
           'aos_target': 'static_library',
         },
       }, {
+        'make_global_settings': [
+          ['CC', '<!(which arm-linux-gnueabihf-gcc-4.7)'],
+          ['CXX', '<!(which arm-linux-gnueabihf-g++-4.7)'],
+        ],
         'variables': {
           'aos_target': 'executable',
         },
@@ -103,8 +103,8 @@
               ],
             }, {
               'cflags': [
-                '-march=atom',
-                '-mfpmath=sse',
+                '-mcpu=cortex-a8',
+                '-mfpu=neon',
 
                 '-fstack-protector-all',
               ],
@@ -134,10 +134,10 @@
             '-mcpu=603e',
             '-mstrict-align',
             '-mlongcall',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/lib/gcc/powerpc-wrs-vxworks/3.4.4/include/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/vxworks-6.3/target/h/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/powerpc-wrs-vxworks/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/lib/gcc/powerpc-wrs-vxworks/3.4.4/include/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/vxworks-6.3/target/h/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/powerpc-wrs-vxworks/',
             '-isystem', '<(WIND_BASE)/target/h',
             '-isystem', '<(WIND_BASE)/target/h/wrn/coreip',
           ],
@@ -179,19 +179,17 @@
           ],
           'ldflags': [
             '-pthread',
-            '-m32',
-          ],
-          'library_dirs': [
-            '/usr/lib32',
           ],
           'cflags': [
             '-pthread',
-            '-m32',
 
             '-Wunused-local-typedefs',
 
             # Give macro stack traces when they blow up.
-            '-ftrack-macro-expansion',
+            # TODO(brians): Re-enable this once they fix the bug where it
+            # sometimes doesn't show you the top-most (aka most useful)
+            # line of code.
+            #'-ftrack-macro-expansion',
           ],
           'cflags_cc': [
             '-std=gnu++11',
diff --git a/aos/build/aos_all.gyp b/aos/build/aos_all.gyp
index e4a9b6f..0629be5 100644
--- a/aos/build/aos_all.gyp
+++ b/aos/build/aos_all.gyp
@@ -20,10 +20,10 @@
         '../common/common.gyp:queue_test',
         '../common/common.gyp:die_test',
         '../common/util/util.gyp:trapezoid_profile_test',
-        '../common/sensors/sensors.gyp:sensor_receiver_test',
+        '../common/util/util.gyp:wrapping_counter_test',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:cows_test',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:packet_finder_test',
         'Common',
-        # TODO(brians): move this to Common
-        '<(AOS)/common/sensors/sensors.gyp:sensors_test',
       ],
     },
     {
diff --git a/aos/build/build.sh b/aos/build/build.sh
index 2bf6982..09fe83c 100755
--- a/aos/build/build.sh
+++ b/aos/build/build.sh
@@ -1,50 +1,56 @@
-#!/bin/bash -e
+#!/bin/bash
 #set -x
 
+set -e
+
 # This file should be called to build the code.
-# Usage: build.sh platform main_file.gyp debug [action]
+# Usage: build.sh platform main_file.gyp debug [action]...
 
 PLATFORM=$1
 GYP_MAIN=$2
 DEBUG=$3
 ACTION=$4
 
+shift 3
+shift || true # We might not have a 4th argument if ACTION is empty.
+
 export WIND_BASE=${WIND_BASE:-"/usr/local/powerpc-wrs-vxworks/wind_base"}
 
-[ ${PLATFORM} == "crio" -o ${PLATFORM} == "atom" ] || ( echo Platform "(${PLATFORM})" must be '"crio" or "atom"'. ; exit 1 )
-[ ${DEBUG} == "yes" -o ${DEBUG} == "no" ] || ( echo Debug "(${DEBUG})" must be '"yes" or "no"'. ; exit 1 )
+[ "${PLATFORM}" == "crio" -o "${PLATFORM}" == "atom" ] || ( echo Platform "(${PLATFORM})" must be '"crio" or "atom"'. ; exit 1 )
+[ "${DEBUG}" == "yes" -o "${DEBUG}" == "no" ] || ( echo Debug "(${DEBUG})" must be '"yes" or "no"'. ; exit 1 )
 
 AOS=`dirname $0`/..
-NINJA_DIR=${AOS}/externals/ninja
-NINJA=${NINJA_DIR}/ninja
-# From chromium@154360:trunk/src/DEPS.
-GYP_REVISION=1488
-GYP_DIR=${AOS}/externals/gyp-${GYP_REVISION}
-GYP=${GYP_DIR}/gyp
 
-OUTDIR=${AOS}/../out_${PLATFORM}
-BUILD_NINJA=${OUTDIR}/Default/build.ninja
+OUTDIR=${AOS}/../output/${PLATFORM}
+BUILD_NINJA=${OUTDIR}/build.ninja
 
-[ -d ${NINJA_DIR} ] || git clone --branch release https://github.com/martine/ninja.git ${NINJA_DIR}
-[ -x ${NINJA} ] || ${NINJA_DIR}/bootstrap.py
-[ -d ${GYP_DIR} ] || ( svn co http://gyp.googlecode.com/svn/trunk -r ${GYP_REVISION} ${GYP_DIR} && patch -p1 -d ${GYP_DIR} < ${AOS}/externals/gyp.patch )
 ${AOS}/build/download_externals.sh
+. $(dirname $0)/tools_config
 
 # The exciting quoting is so that it ends up with -DWHATEVER='"'`a command`'"'.
 # The '"' at either end is so that it creates a string constant when expanded
 #   in the C/C++ code.
 COMMONFLAGS='-DLOG_SOURCENAME='"'\"'"'`basename $in`'"'\"' "
-if [ ${PLATFORM} == crio ]; then
-  COMMONFLAGS+='-DAOS_INITNAME=aos_init_function_`readlink -f $out | sed \"s/[\/.]/_/g\"` '
-fi
 
 if [[ "${ACTION}" != "clean" && ( ! -d ${OUTDIR} || -n \
   			"`find ${AOS}/.. -newer ${BUILD_NINJA} \( -name '*.gyp' -or -name '*.gypi' \)`" ) ]]; then
-  ${GYP} \
-    --check --depth=${AOS}/.. --no-circular-check -f ninja \
-    -I${AOS}/build/aos.gypi -Goutput_dir=out_${PLATFORM} \
-    -DOS=${PLATFORM} -DWIND_BASE=${WIND_BASE} -DDEBUG=${DEBUG} \
-    ${GYP_MAIN}
+  # This is a gyp "file" that we pipe into gyp so that it will put the output
+  # in a directory named what we want where we want it.
+  GYP_INCLUDE=$(cat <<END
+{
+  'target_defaults': {
+    'configurations': {
+	  '${PLATFORM}': {}
+    }
+  }
+}
+END
+)
+  echo "${GYP_INCLUDE}" | ${GYP} \
+      --check --depth=${AOS}/.. --no-circular-check -f ninja \
+      -I${AOS}/build/aos.gypi -I/dev/stdin -Goutput_dir=output \
+      -DOS=${PLATFORM} -DWIND_BASE=${WIND_BASE} -DDEBUG=${DEBUG} \
+      ${GYP_MAIN}
   # Have to substitute "command = $compiler" so that it doesn't try to
   #   substitute them in the linker commands, where it doesn't work.
   sed -i "s:command = \$cc:\\0 ${COMMONFLAGS}:g ; \
@@ -56,34 +62,35 @@
 fi
 
 if [ "${ACTION}" == "clean" ]; then
-  rm -r ${OUTDIR}
+  rm -r ${OUTDIR} || true
 else
   if [ "${ACTION}" != "deploy" -a "${ACTION}" != "tests" -a "${ACTION}" != "redeploy" ]; then
-    GYP_ACTION=${ACTION}
+    NINJA_ACTION=${ACTION}
   else
-    GYP_ACTION=
+    NINJA_ACTION=
   fi
-  ${NINJA} -C ${OUTDIR}/Default ${GYP_ACTION}
+  ${NINJA} -C ${OUTDIR} ${NINJA_ACTION} "$@"
   if [[ ${ACTION} == deploy || ${ACTION} == redeploy ]]; then
     [ ${PLATFORM} == atom ] && \
       rsync --progress -c -r \
-      ${OUTDIR}/Default/outputs/* \
-      driver@`${AOS}/build/get_ip fitpc`:/home/driver/robot_code/bin
+        ${OUTDIR}/outputs/* \
+        driver@`${AOS}/build/get_ip fitpc`:/home/driver/robot_code/bin
+	  ssh driver@`${AOS}/build/get_ip fitpc` "sync; sync; sync"
     [ ${PLATFORM} == crio ] && \
       ncftpput `${AOS}/build/get_ip robot` / \
-      ${OUTDIR}/Default/lib/FRC_UserProgram.out
+      ${OUTDIR}/lib/FRC_UserProgram.out
   fi
   if [[ ${ACTION} == redeploy ]]; then
     if [[ ${PLATFORM} != crio ]]; then
       echo "Platform ${PLATFORM} does not support redeploy." 1>&2
       exit 1
     fi
-    ${OUTDIR}/../out_atom/Default/outputs/netconsole <<"END"
+    ${OUTDIR}/../out_atom/outputs/netconsole <<"END"
 unld "FRC_UserProgram.out"
 ld < FRC_UserProgram.out
 END
   fi
   if [[ ${ACTION} == tests ]]; then
-    find ${OUTDIR}/Default/tests -executable -exec ${AOS}/build/run_test.sh {} \;
+    find ${OUTDIR}/tests -executable -exec ${AOS}/build/run_test.sh {} \;
   fi
 fi
diff --git a/aos/build/crio_cc b/aos/build/crio_cc
new file mode 100755
index 0000000..442d3fe
--- /dev/null
+++ b/aos/build/crio_cc
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# This is a helper script that gets called as a replacement for gcc. It just
+# passes all arguments on unless it is being called as a shared linker.
+
+[ $1 != '-shared' ] && exec powerpc-wrs-vxworks-gcc "$@"
+exec $(dirname $0)/crio_link_out "$@"
diff --git a/aos/build/crio_cxx b/aos/build/crio_cxx
new file mode 100755
index 0000000..ea68e58
--- /dev/null
+++ b/aos/build/crio_cxx
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# This is a helper script that gets called as a replacement for g++. It just
+# passes all arguments on unless it is being called as a shared linker.
+
+[ $1 != '-shared' ] && exec powerpc-wrs-vxworks-g++ "$@"
+exec $(dirname $0)/crio_link_out "$@"
diff --git a/aos/build/crio_link_out b/aos/build/crio_link_out
index e5a66e7..0630341 100755
--- a/aos/build/crio_link_out
+++ b/aos/build/crio_link_out
@@ -1,7 +1,11 @@
-#!/bin/bash -e
+#!/bin/bash
+#set -x
 
-# This is a helper script that compiles .out files for the cRIO. It is designed
-# to be called as a replacement for g++ being used as a linker.
+set -e
+
+# This is a helper script that compiles .out files for the cRIO. It gets called
+# by the gcc and g++ wrapper scripts if they detect that the tool is being used
+# as a shared linker.
 
 # All the flags except -shared.
 INPUTS_FLAGS=`echo "$@" | sed 's/-shared//g'`
@@ -9,7 +13,6 @@
 OUTPUT=`echo ${INPUTS_FLAGS} | awk \
   'BEGIN { RS=" " }; output { print ; output = 0 }; /-o/ { output = 1 }'`
 # All arguments that don't start with a - and aren't ${OUTPUT}.
-#INPUTS=`echo ${INPUTS_FLAGS} | sed "s:-[^ ]*::g; s:${OUTPUT}::g;"`
 INPUTS=`echo ${INPUTS_FLAGS} | awk \
   'BEGIN { RS=" " }; /-Wl,--no-whole-archive/ { output = 0 }; \
   output { print }; \
@@ -17,7 +20,8 @@
 TEMPDIR=`dirname ${OUTPUT}`
 AOS=`dirname $0`/..
 powerpc-wrs-vxworks-nm ${INPUTS} | \
-  tclsh ${WIND_BASE}/host/resource/hutils/tcl/munch.tcl -c ppc > ${TEMPDIR}/ctdt.c
+  tclsh ${WIND_BASE}/host/resource/hutils/tcl/munch.tcl -c ppc > \
+    ${TEMPDIR}/ctdt.c
 powerpc-wrs-vxworks-gcc -I${AOS}/.. -c ${TEMPDIR}/ctdt.c -o ${TEMPDIR}/ctdt.o
 powerpc-wrs-vxworks-g++ ${INPUTS_FLAGS} ${TEMPDIR}/ctdt.o
 ln -f ${OUTPUT} `echo ${OUTPUT} | sed 's/lib\([A-Za-z0-9_]*\)\.so$/\1.out/'`
diff --git a/aos/build/download_externals.sh b/aos/build/download_externals.sh
index 70b3685..5868637 100755
--- a/aos/build/download_externals.sh
+++ b/aos/build/download_externals.sh
@@ -2,8 +2,32 @@
 
 set -e
 
-AOS=`dirname $0`/..
-EXTERNALS=${AOS}/externals
+AOS=$(readlink -f $(dirname $0)/..)
+. $(dirname $0)/tools_config
+COMPILED=${EXTERNALS}/../compiled-arm
+
+CROSS_COMPILE=arm-linux-gnueabihf-
+
+export CC=${CROSS_COMPILE}gcc-4.7
+export CXX=${CROSS_COMPILE}g++-4.7
+export CFLAGS="-mcpu=cortex-a8 -mfpu=neon"
+export CXXFLAGS="-mcpu=cortex-a8 -mfpu=neon"
+export OBJDUMP=${CROSS_COMPLIE}objdump
+# Flags that should get passed to all configure scripts.
+# Some of them need to set LDFLAGS separately to work around stupid configure
+# scripts, so we can't just set that here.
+CONFIGURE_FLAGS="--host=arm-linux-gnueabihf CC=${CC} CXX=${CXX} CFLAGS=\"${CFLAGS}\" CXXFLAGS=\"${CXXFLAGS}\" OBJDUMP=${OBJDUMP}"
+
+TMPDIR=/tmp/$$-aos-tmpdir
+mkdir -p ${EXTERNALS}
+mkdir -p ${COMPILED}
+
+# get and build ninja
+[ -d ${NINJA_DIR} ] || git clone --branch ${NINJA_RELEASE} https://github.com/martine/ninja.git ${NINJA_DIR}
+[ -x ${NINJA} ] || env -i "PATH=$PATH" ${NINJA_DIR}/bootstrap.py
+
+# get gyp
+[ -d ${GYP_DIR} ] || ( svn co http://gyp.googlecode.com/svn/trunk -r ${GYP_REVISION} ${GYP_DIR} && patch -p1 -d ${GYP_DIR} < ${AOS}/externals/gyp.patch )
 
 # get gccdist
 GCCDIST=${EXTERNALS}/gccdist
@@ -30,75 +54,78 @@
 
 # get and build libjpeg
 LIBJPEG_VERSION=8d
-LIBJPEG_DIR=${EXTERNALS}/jpeg-${LIBJPEG_VERSION}
+LIBJPEG_DIR=${COMPILED}/jpeg-${LIBJPEG_VERSION}
 # NOTE: this directory ends up in #include names
-LIBJPEG_PREFIX=${EXTERNALS}/libjpeg
+LIBJPEG_PREFIX=${COMPILED}/libjpeg
 LIBJPEG_LIB=${LIBJPEG_PREFIX}/lib/libjpeg.a
 LIBJPEG_TAR=${EXTERNALS}/jpegsrc.v${LIBJPEG_VERSION}.tar.gz
 [ -f ${LIBJPEG_TAR} ] || wget http://www.ijg.org/files/jpegsrc.v${LIBJPEG_VERSION}.tar.gz -O ${LIBJPEG_TAR}
 [ -d ${LIBJPEG_DIR} ] || ( mkdir ${LIBJPEG_DIR} && tar --strip-components=1 -C ${LIBJPEG_DIR} -xf ${LIBJPEG_TAR} )
-[ -f ${LIBJPEG_LIB} ] || env -i PATH="${PATH}" bash -c "cd ${LIBJPEG_DIR} && CFLAGS='-m32' ./configure --disable-shared --prefix=`readlink -f ${LIBJPEG_PREFIX}` && make && make install"
+[ -f ${LIBJPEG_LIB} ] || bash -c \
+	"cd ${LIBJPEG_DIR} && ./configure --disable-shared \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${LIBJPEG_PREFIX}` \
+	&& make && make install"
 
 # get gtest
 GTEST_VERSION=1.6.0
-GTEST_DIR=${EXTERNALS}/gtest-${GTEST_VERSION}-p2
+GTEST_DIR=${EXTERNALS}/gtest-${GTEST_VERSION}-p1
 GTEST_ZIP=${EXTERNALS}/gtest-${GTEST_VERSION}.zip
-TMPDIR=/tmp/$$-aos-tmpdir
 [ -f ${GTEST_ZIP} ] || wget http://googletest.googlecode.com/files/gtest-${GTEST_VERSION}.zip -O ${GTEST_ZIP}
-[ -d ${GTEST_DIR} ] || ( unzip ${GTEST_ZIP} -d ${TMPDIR} && mv ${TMPDIR}/gtest-${GTEST_VERSION} ${GTEST_DIR} && cd ${GTEST_DIR} && patch -p1 < ../gtest.patch )
+[ -d ${GTEST_DIR} ] || ( unzip ${GTEST_ZIP} -d ${TMPDIR} && mv ${TMPDIR}/gtest-${GTEST_VERSION} ${GTEST_DIR} && cd ${GTEST_DIR} && patch -p1 < ${AOS}/externals/gtest.patch )
 
 # get and build ctemplate
 # This is the next revision after the 2.2 release and it only adds spaces to
 # make gcc 4.7 with --std=c++11 happy (user-defined string literals...).
 CTEMPLATE_VERSION=129
-CTEMPLATE_DIR=${EXTERNALS}/ctemplate-${CTEMPLATE_VERSION}
+CTEMPLATE_TAR=${EXTERNALS}/ctemplate-${CTEMPLATE_VERSION}.tar.gz
+CTEMPLATE_DIR=${COMPILED}/ctemplate-${CTEMPLATE_VERSION}
 CTEMPLATE_PREFIX=${CTEMPLATE_DIR}-prefix
 CTEMPLATE_LIB=${CTEMPLATE_PREFIX}/lib/libctemplate.a
 CTEMPLATE_URL=http://ctemplate.googlecode.com
 if [[ "${CTEMPLATE_VERSION}" =~ /\./ ]]; then
 	CTEMPLATE_URL=${CTEMPLATE_URL}/files/ctemplate-${CTEMPLATE_VERSION}.tar.gz
-	[ -f ${CTEMPLATE_DIR}.tar.gz ] || \
-		wget ${CTEMPLATE_URL} -O ${CTEMPLATE_DIR}.tar.gz
+	[ -f ${CTEMPLATE_TAR} ] || \
+		wget ${CTEMPLATE_URL} -O ${CTEMPLATE_TAR}
 	[ -d ${CTEMPLATE_DIR} ] || ( mkdir ${CTEMPLATE_DIR} && tar \
-		--strip-components=1 -C ${CTEMPLATE_DIR} -xf ${CTEMPLATE_DIR}.tar.gz )
+		--strip-components=1 -C ${CTEMPLATE_DIR} -xf ${CTEMPLATE_TAR} )
 else
 	CTEMPLATE_URL=${CTEMPLATE_URL}/svn/trunk
 	[ -d ${CTEMPLATE_DIR} ] || \
 		svn checkout ${CTEMPLATE_URL} -r ${CTEMPLATE_VERSION} ${CTEMPLATE_DIR}
 fi
-[ -f ${CTEMPLATE_LIB} ] || env -i PATH="${PATH}" \
-	CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' \
-	bash -c "cd ${CTEMPLATE_DIR} && ./configure --disable-shared \
-	--prefix=`readlink -f ${CTEMPLATE_PREFIX}` && make && make install"
+[ -f ${CTEMPLATE_LIB} ] || bash -c "cd ${CTEMPLATE_DIR} && \
+	./configure --disable-shared \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${CTEMPLATE_PREFIX}` \
+	&& make && make install"
 
 # get and build gflags
 GFLAGS_VERSION=2.0
-GFLAGS_DIR=${EXTERNALS}/gflags-${GFLAGS_VERSION}
+GFLAGS_TAR=${EXTERNALS}/gflags-${GFLAGS_VERSION}.tar.gz
+GFLAGS_DIR=${COMPILED}/gflags-${GFLAGS_VERSION}
 GFLAGS_PREFIX=${GFLAGS_DIR}-prefix
 GFLAGS_LIB=${GFLAGS_PREFIX}/lib/libgflags.a
 GFLAGS_URL=https://gflags.googlecode.com/files/gflags-${GFLAGS_VERSION}.tar.gz
-[ -f ${GFLAGS_DIR}.tar.gz ] || wget ${GFLAGS_URL} -O ${GFLAGS_DIR}.tar.gz
+[ -f ${GFLAGS_TAR} ] || wget ${GFLAGS_URL} -O ${GFLAGS_TAR}
 [ -d ${GFLAGS_DIR} ] || ( mkdir ${GFLAGS_DIR} && tar \
-  --strip-components=1 -C ${GFLAGS_DIR} -xf ${GFLAGS_DIR}.tar.gz )
-[ -f ${GFLAGS_LIB} ] || env -i PATH="${PATH}" \
-  CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' \
-  bash -c "cd ${GFLAGS_DIR} && ./configure \
-  --prefix=`readlink -f ${GFLAGS_PREFIX}` && make && make install"
+  --strip-components=1 -C ${GFLAGS_DIR} -xf ${GFLAGS_TAR} )
+[ -f ${GFLAGS_LIB} ] || bash -c "cd ${GFLAGS_DIR} && ./configure \
+  ${CONFIGURE_FLAGS} --prefix=`readlink -f ${GFLAGS_PREFIX}` \
+  && make && make install"
 
 # get and build libusb
 LIBUSB_VERSION=1.0.9
 LIBUSB_APIVERSION=1.0
-LIBUSB_DIR=${EXTERNALS}/libusb-${LIBUSB_VERSION}
+LIBUSB_TAR=${EXTERNALS}/libusb-${LIBUSB_VERSION}.tar.bz2
+LIBUSB_DIR=${COMPILED}/libusb-${LIBUSB_VERSION}
 LIBUSB_PREFIX=${LIBUSB_DIR}-prefix
 LIBUSB_LIB=${LIBUSB_PREFIX}/lib/libusb-${LIBUSB_APIVERSION}.a
 LIBUSB_URL=http://sourceforge.net/projects/libusb/files/libusb-${LIBUSB_APIVERSION}/libusb-${LIBUSB_VERSION}/libusb-${LIBUSB_VERSION}.tar.bz2
-[ -f ${LIBUSB_DIR}.tar.bz2 ] || wget ${LIBUSB_URL} -O ${LIBUSB_DIR}.tar.bz2
+[ -f ${LIBUSB_TAR} ] || wget ${LIBUSB_URL} -O ${LIBUSB_TAR}
 [ -d ${LIBUSB_DIR} ] || ( mkdir ${LIBUSB_DIR} && tar \
-  --strip-components=1 -C ${LIBUSB_DIR} -xf ${LIBUSB_DIR}.tar.bz2 )
-[ -f ${LIBUSB_LIB} ] || env -i PATH="${PATH}" \
-  CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' \
-  bash -c "cd ${LIBUSB_DIR} && ./configure \
-  --prefix=`readlink -f ${LIBUSB_PREFIX}` && make && make install"
+  --strip-components=1 -C ${LIBUSB_DIR} -xf ${LIBUSB_TAR} )
+[ -f ${LIBUSB_LIB} ] || bash -c "cd ${LIBUSB_DIR} && ./configure \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${LIBUSB_PREFIX}` \
+	&& make && make install"
 
 # get the LLVM Compiler-RT source
 COMPILER_RT_TAG=RELEASE_32/final
@@ -109,15 +136,48 @@
 
 # get and build libevent
 LIBEVENT_VERSION=2.0.21
-LIBEVENT_DIR=${EXTERNALS}/libevent-${LIBEVENT_VERSION}
+LIBEVENT_TAR=${EXTERNALS}/libevent-${LIBEVENT_VERSION}.tar.gz
+LIBEVENT_DIR=${COMPILED}/libevent-${LIBEVENT_VERSION}
 LIBEVENT_PREFIX=${LIBEVENT_DIR}-prefix
 LIBEVENT_LIB=${LIBEVENT_PREFIX}/lib/libevent.a
 LIBEVENT_URL=https://github.com/downloads/libevent/libevent
 LIBEVENT_URL=${LIBEVENT_URL}/libevent-${LIBEVENT_VERSION}-stable.tar.gz
-[ -f ${LIBEVENT_DIR}.tar.gz ] || wget ${LIBEVENT_URL} -O ${LIBEVENT_DIR}.tar.gz
+[ -f ${LIBEVENT_TAR} ] || wget ${LIBEVENT_URL} -O ${LIBEVENT_TAR}
 [ -d ${LIBEVENT_DIR} ] || ( mkdir ${LIBEVENT_DIR} && tar \
-  --strip-components=1 -C ${LIBEVENT_DIR} -xf ${LIBEVENT_DIR}.tar.gz )
-[ -f ${LIBEVENT_LIB} ] || env -i PATH="${PATH}" \
-  CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' \
-  bash -c "cd ${LIBEVENT_DIR} && ./configure \
-  --prefix=`readlink -f ${LIBEVENT_PREFIX}` && make && make install"
+  --strip-components=1 -C ${LIBEVENT_DIR} -xf ${LIBEVENT_TAR} )
+[ -f ${LIBEVENT_LIB} ] || bash -c "cd ${LIBEVENT_DIR} && ./configure \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${LIBEVENT_PREFIX}` \
+	&& make && make install"
+
+# get and build gmp
+GMP_VERSION=5.1.3
+GMP_TAR=${EXTERNALS}/gmp-${GMP_VERSION}.tar.lz
+GMP_DIR=${COMPILED}/gmp-${GMP_VERSION}
+GMP_PREFIX=${GMP_DIR}-prefix
+GMP_LIB=${GMP_PREFIX}/lib/libgmp.a
+GMP_URL=ftp://ftp.gmplib.org/pub/gmp/gmp-${GMP_VERSION}.tar.lz
+[ -f ${GMP_TAR} ] || wget ${GMP_URL} -O ${GMP_TAR}
+[ -d ${GMP_DIR} ] || ( mkdir ${GMP_DIR} && tar \
+	--strip-components=1 -C ${GMP_DIR} -xf ${GMP_TAR} )
+[ -f ${GMP_LIB} ] || bash -c "cd ${GMP_DIR} && ./configure \
+	${CONFIGURE_FLAGS} --prefix=$(readlink -f ${GMP_PREFIX}) \
+	&& make && make install"
+
+# get and build libcdd
+LIBCDD_VERSION=094g
+LIBCDD_TAR=${EXTERNALS}/libcdd-${LIBCDD_VERSION}.tar.gz
+LIBCDD_DIR=${COMPILED}/libcdd-${LIBCDD_VERSION}
+LIBCDD_PREFIX=${LIBCDD_DIR}-prefix
+LIBCDD_LIB=${LIBCDD_PREFIX}/lib/libcdd.a
+LIBCDD_URL=ftp://ftp.ifor.math.ethz.ch/pub/fukuda/cdd/cddlib-${LIBCDD_VERSION}.tar.gz
+[ -f ${LIBCDD_TAR} ] || \
+        wget ${LIBCDD_URL} -O ${LIBCDD_TAR}
+[ -d ${LIBCDD_DIR} ] || ( mkdir ${LIBCDD_DIR} && tar \
+        --strip-components=1 -C ${LIBCDD_DIR} -xf ${LIBCDD_TAR} )
+[ -f ${LIBCDD_LIB} ] || LDFLAGS=-L${GMP_PREFIX}/lib \
+	bash -c "cd ${LIBCDD_DIR} && ./configure \
+	--disable-shared ${CONFIGURE_FLAGS} \
+	--prefix=$(readlink -f ${LIBCDD_PREFIX}) \
+	&& make gmpdir=${GMP_PREFIX} && make install"
+
+rm -rf ${TMPDIR}
diff --git a/aos/build/externals.gyp b/aos/build/externals.gyp
index 5f85b5c..34564e1 100644
--- a/aos/build/externals.gyp
+++ b/aos/build/externals.gyp
@@ -2,12 +2,14 @@
 # download_externals.sh makes sure that all of them have been downloaded.
 {
   'variables': {
-    'externals': '<(AOS)/externals',
-    'externals_abs': '<!(readlink -f ../externals)',
+    'externals': '<(AOS)/../output/downloaded',
+    'externals_abs': '<!(readlink -f ../../output/downloaded)',
+    'compiled': '<(externals)/../compiled-arm',
+    'compiled_abs': '<(externals_abs)/../compiled-arm',
 
 # These versions have to be kept in sync with the ones in download_externals.sh.
     'eigen_version': '3.1.3',
-    'gtest_version': '1.6.0-p2',
+    'gtest_version': '1.6.0-p1',
     'onejar_version': '0.97',
     'ctemplate_version': '129',
     'gflags_version': '2.0',
@@ -15,13 +17,14 @@
     'libusb_apiversion': '1.0',
     'compiler_rt_version': 'RELEASE_32_final',
     'libevent_version': '2.0.21',
+    'libcdd_version': '094g',
   },
   'targets': [
     {
       'target_name': 'WPILib',
       'type': 'static_library',
       'sources': [
-        '<!@(find <(externals)/WPILib/WPILib/ -name *.cpp)',
+        '<!@(find <(AOS)/externals/WPILib/WPILib/ -name *.cpp)',
       ],
       'cflags!': [
         '-Werror',
@@ -33,13 +36,13 @@
         '-O3'
       ],
       'include_dirs': [
-        '<(externals)/WPILib',
-        '<(externals)/WPILib/WPILib',
+        '<(AOS)/externals/WPILib',
+        '<(AOS)/externals/WPILib/WPILib',
       ],
       'direct_dependent_settings': {
         'cflags': [
-          '-isystem', '<(externals_abs)/WPILib',
-          '-isystem', '<(externals_abs)/WPILib/WPILib',
+          '-isystem', '<(AOS)/externals/WPILib',
+          '-isystem', '<(AOS)/externals/WPILib/WPILib',
         ],
       },
     },
@@ -47,14 +50,14 @@
       'target_name': 'WPILib-NetworkRobotValues',
       'type': 'static_library',
       'sources': [
-        '<(externals)/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp'
+        '<(AOS)/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp'
       ],
       'include_dirs': [
-        '<(externals)/WPILib',
+        '<(AOS)/externals/WPILib',
       ],
       'direct_dependent_settings': {
         'include_dirs': [
-          '<(externals)/WPILib',
+          '<(AOS)/externals/WPILib',
         ],
       },
     },
@@ -101,10 +104,10 @@
       'target_name': 'libevent',
       'type': 'none',
       'link_settings': {
-        'libraries': ['<(externals_abs)/libevent-<(libevent_version)-prefix/lib/libevent.a'],
+        'libraries': ['<(compiled_abs)/libevent-<(libevent_version)-prefix/lib/libevent.a'],
       },
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/libevent-<(libevent_version)-prefix/include'],
+        'include_dirs': ['<(compiled)/libevent-<(libevent_version)-prefix/include'],
       },
     },
     {
@@ -120,7 +123,10 @@
       'target_name': 'libjpeg',
       'type': 'none',
       'direct_dependent_settings': {
-        'libraries': ['<(externals_abs)/libjpeg/lib/libjpeg.a'],
+        'libraries': ['<(compiled_abs)/libjpeg/lib/libjpeg.a'],
+        'cflags': [
+          '-isystem', '<(compiled)',
+        ],
       },
     },
     {
@@ -184,30 +190,43 @@
       'target_name': 'ctemplate',
       'type': 'none',
       'link_settings': {
-        'libraries': ['<(externals_abs)/ctemplate-<(ctemplate_version)-prefix/lib/libctemplate.a'],
+        'libraries': ['<(compiled_abs)/ctemplate-<(ctemplate_version)-prefix/lib/libctemplate.a'],
       },
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/ctemplate-<(ctemplate_version)-prefix/include'],
+        'include_dirs': ['<(compiled)/ctemplate-<(ctemplate_version)-prefix/include'],
       },
     },
     {
       'target_name': 'gflags',
       'type': 'none',
       'link_settings': {
-        'libraries': ['<(externals_abs)/gflags-<(gflags_version)-prefix/lib/libgflags.a'],
+        'libraries': ['<(compiled_abs)/gflags-<(gflags_version)-prefix/lib/libgflags.a'],
       },
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/gflags-<(gflags_version)-prefix/include'],
+        'include_dirs': ['<(compiled)/gflags-<(gflags_version)-prefix/include'],
       },
     },
     {
       'target_name': 'libusb',
       'type': 'none',
       'link_settings': {
-        'libraries': ['<(externals_abs)/libusb-<(libusb_version)-prefix/lib/libusb-<(libusb_apiversion).a'],
+        'libraries': ['<(compiled_abs)/libusb-<(libusb_version)-prefix/lib/libusb-<(libusb_apiversion).a'],
       },
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/libusb-<(libusb_version)-prefix/include'],
+        'include_dirs': ['<(compiled)/libusb-<(libusb_version)-prefix/include'],
+        'cflags': [
+          '-Wno-error=cast-align',
+        ],
+      },
+    },
+    {
+      'target_name': 'libcdd',
+      'type': 'none',
+      'link_settings': {
+        'libraries': ['<(compiled_abs)/libcdd-<(libcdd_version)-prefix/lib/libcdd.a'],
+      },
+      'direct_dependent_settings': {
+        'include_dirs': ['<(compiled_abs)/'],
       },
     },
   ],
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index fcc3c60..3b89149 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -35,7 +35,7 @@
 			format += ", "
 			format += elem.toPrintFormat()
 			if (elem.type == 'bool')
-				args.push("#{elem.name} ? 't' : 'f'")
+				args.push("#{elem.name} ? 'T' : 'f'")
 			else
 				args.push(elem.name)
 			end
diff --git a/aos/build/tools_config b/aos/build/tools_config
new file mode 100644
index 0000000..d47a3ce
--- /dev/null
+++ b/aos/build/tools_config
@@ -0,0 +1,13 @@
+# This is a shell fragment that sets up variables related to where the tools
+# that download_externals.sh downloads so build.sh can use.
+
+EXTERNALS=${AOS}/../output/downloaded
+
+NINJA_RELEASE=v1.4.0
+NINJA_DIR=${EXTERNALS}/ninja-${NINJA_RELEASE}
+NINJA=${NINJA_DIR}/ninja
+
+# From chromium@154360:trunk/src/DEPS.
+GYP_REVISION=1738
+GYP_DIR=${EXTERNALS}/gyp-${GYP_REVISION}
+GYP=${GYP_DIR}/gyp