aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2013-09-13 23:38:30 +0200
committerSpencer Oliver <spen@spen-soft.co.uk>2013-09-15 07:55:10 +0000
commitc98856b62a4fd5eca05d1d1f1185300fdee13f39 (patch)
tree57bd9140efdfb6b6170ad8e6f0320a859cee4466 /contrib
parentaccb8e94c341c0dba06ccf1e1ee97eaf81065e3c (diff)
downloadriscv-openocd-c98856b62a4fd5eca05d1d1f1185300fdee13f39.zip
riscv-openocd-c98856b62a4fd5eca05d1d1f1185300fdee13f39.tar.gz
riscv-openocd-c98856b62a4fd5eca05d1d1f1185300fdee13f39.tar.bz2
contrib: Add example cross-build script
Usage: export LIBUSB1_SRC=/path/to/libusb-1.0 export OPENOCD_CONFIG="--enable-..." cd /work/dir /path/to/openocd/contrib/cross-build.sh <host-triplet> For static linking, a workaround is to export LIBUSB1_CONFIG="--enable-static --disable-shared" All the paths must not contain any spaces. Feel free to comment or update this patchset with improvements. Change-Id: Ib3b4970117f13a6140a1eddc493d324a52364519 Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/1531 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/cross-build.sh104
1 files changed, 104 insertions, 0 deletions
diff --git a/contrib/cross-build.sh b/contrib/cross-build.sh
new file mode 100755
index 0000000..397b7f4
--- /dev/null
+++ b/contrib/cross-build.sh
@@ -0,0 +1,104 @@
+#!/bin/sh
+
+# This is an example of how to do a cross-build of OpenOCD using pkg-config.
+# Cross-building with pkg-config is deceptively hard and most guides and
+# tutorials are incomplete or give bad advice. Some of the traps that are easy
+# to fall in but handled by this script are:
+#
+# * Polluting search paths and flags with values from the build system.
+# * Faulty pkg-config wrappers shipped with distribution packaged cross-
+# toolchains.
+# * Build failing because pkg-config discards some paths even though they are
+# correctly listed in the .pc file.
+# * Getting successfully built binaries that cannot find runtime data because
+# paths refer to the build file system.
+#
+# This script is probably more useful as a reference than as a complete build
+# tool but for some configurations it may be usable as-is. It only cross-
+# builds libusb-1.0 from source, but the script can be extended to build other
+# prerequisities in a similar manner.
+#
+# Usage:
+# export LIBUSB1_SRC=/path/to/libusb-1.0
+# export OPENOCD_CONFIG="--enable-..."
+# cd /work/dir
+# /path/to/openocd/contrib/cross-build.sh <host-triplet>
+#
+# For static linking, a workaround is to
+# export LIBUSB1_CONFIG="--enable-static --disable-shared"
+#
+# All the paths must not contain any spaces.
+
+set -e -x
+
+WORK_DIR=$PWD
+
+## Source code paths, customize as necessary
+: ${OPENOCD_SRC:="`dirname "$0"`/.."}
+: ${LIBUSB1_SRC:=/path/to/libusb}
+
+OPENOCD_SRC=`readlink -m $OPENOCD_SRC`
+LIBUSB1_SRC=`readlink -m $LIBUSB1_SRC`
+
+HOST_TRIPLET=$1
+BUILD_DIR=$WORK_DIR/$HOST_TRIPLET-build
+LIBUSB1_BUILD_DIR=$BUILD_DIR/libusb1
+OPENOCD_BUILD_DIR=$BUILD_DIR/openocd
+
+## Root of host file tree
+SYSROOT=$WORK_DIR/$HOST_TRIPLET-root
+
+## Install location within host file tree
+: ${PREFIX=/usr}
+
+## OpenOCD-only install dir for packaging
+PACKAGE_DIR=$WORK_DIR/openocd_`git --git-dir=$OPENOCD_SRC/.git describe`_$HOST_TRIPLET
+
+#######
+
+# Create pkg-config wrapper and make sure it's used
+export PKG_CONFIG=$WORK_DIR/$HOST_TRIPLET-pkg-config
+
+cat > $PKG_CONFIG <<EOF
+#!/bin/sh
+
+SYSROOT=$SYSROOT
+
+export PKG_CONFIG_DIR=
+export PKG_CONFIG_LIBDIR=\${SYSROOT}$PREFIX/lib/pkgconfig:\${SYSROOT}$PREFIX/share/pkgconfig
+export PKG_CONFIG_SYSROOT_DIR=\${SYSROOT}
+
+# The following have to be set to avoid pkg-config to strip /usr/include and /usr/lib from paths
+# before they are prepended with the sysroot path. Feels like a pkg-config bug.
+export PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=
+export PKG_CONFIG_ALLOW_SYSTEM_LIBS=
+
+exec pkg-config "\$@"
+EOF
+chmod +x $PKG_CONFIG
+
+# Clear out work dir
+rm -rf $SYSROOT $BUILD_DIR
+mkdir -p $SYSROOT
+
+# libusb-1.0 build & install into sysroot
+mkdir -p $LIBUSB1_BUILD_DIR
+cd $LIBUSB1_BUILD_DIR
+$LIBUSB1_SRC/configure --build=`$LIBUSB1_SRC/config.guess` --host=$HOST_TRIPLET \
+--with-sysroot=$SYSROOT --prefix=$PREFIX \
+$LIBUSB1_CONFIG
+make
+make install DESTDIR=$SYSROOT
+
+# OpenOCD build & install into sysroot
+mkdir -p $OPENOCD_BUILD_DIR
+cd $OPENOCD_BUILD_DIR
+$OPENOCD_SRC/configure --build=`$OPENOCD_SRC/config.guess` --host=$HOST_TRIPLET \
+--with-sysroot=$SYSROOT --prefix=$PREFIX \
+$OPENOCD_CONFIG
+make
+make install DESTDIR=$SYSROOT
+
+# Separate OpenOCD install w/o dependencies. OpenOCD will have to be linked
+# statically or have dependencies packaged/installed separately.
+make install DESTDIR=$PACKAGE_DIR