summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2013-05-09 16:18:44 +0200
committerYorhel <git@yorhel.nl>2013-05-09 16:18:44 +0200
commitbb1145dced2745b1f8f1d7f34fd87e8d8e58bb4f (patch)
tree1009dd8ebef42102d69934d05d14104383b5a3ca
parent4021821b91340477f41327e96e8ba19455bee939 (diff)
Added statically linked binary generator script
-rw-r--r--.gitignore2
-rwxr-xr-xstatic/build.sh135
2 files changed, 137 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 3675799..6cc925e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,5 @@ ncdu
ncdu.1
*~
*.swp
+static/*
+!static/build.sh
diff --git a/static/build.sh b/static/build.sh
new file mode 100755
index 0000000..96b2856
--- /dev/null
+++ b/static/build.sh
@@ -0,0 +1,135 @@
+#!/bin/sh
+
+# This script is based on static/build.sh from the ncdc git repo.
+# Only i486 and arm arches are supported. i486 should perform well enough, so
+# x86_64 isn't really necessary. I can't test any other arches.
+
+
+MUSL_VERSION=0.9.9
+NCURSES_VERSION=5.9
+
+export CFLAGS="-O3 -g -static"
+
+# (The variables below are automatically set by the functions, they're defined
+# here to make sure they have global scope and for documentation purposes.)
+
+# This is the arch we're compiling for, e.g. arm/mipsel.
+TARGET=
+# This is the name of the toolchain we're using, and thus the value we should
+# pass to autoconf's --host argument.
+HOST=
+# Installation prefix.
+PREFIX=
+# Path of the extracted source code of the package we're currently building.
+srcdir=
+
+mkdir -p tarballs
+
+
+# "Fetch, Extract, Move"
+fem() { # base-url name targerdir extractdir
+ echo "====== Fetching and extracting $1 $2"
+ cd tarballs
+ if [ -n "$4" ]; then
+ EDIR="$4"
+ else
+ EDIR=$(basename $(basename $(basename $2 .tar.bz2) .tar.gz) .tar.xz)
+ fi
+ if [ ! -e "$2" ]; then
+ wget "$1$2" || exit
+ fi
+ if [ ! -d "$3" ]; then
+ tar -xvf "$2" || exit
+ mv "$EDIR" "$3"
+ fi
+ cd ..
+}
+
+
+prebuild() { # dirname
+ if [ -e "$TARGET/$1/_built" ]; then
+ echo "====== Skipping build for $TARGET/$1 (assumed to be done)"
+ return 1
+ fi
+ echo "====== Starting build for $TARGET/$1"
+ rm -rf "$TARGET/$1"
+ mkdir -p "$TARGET/$1"
+ cd "$TARGET/$1"
+ srcdir="../../tarballs/$1"
+ return 0
+}
+
+
+postbuild() {
+ touch _built
+ cd ../..
+}
+
+
+# Pre-built cross-compilation binaries for musl. Handy. :)
+getmusl() {
+ # Order of $HOST is different than the tar/dir names, so we need this case.
+ case $TARGET in
+ arm) DIR=arm-linux-musleabi ;;
+ i486) DIR=i486-linux-musl ;;
+ esac
+ fem https://bitbucket.org/GregorR/musl-cross/downloads/ crossx86-$DIR-$MUSL_VERSION.tar.xz "musl-$TARGET" $DIR
+}
+
+
+getncurses() {
+ fem http://ftp.gnu.org/pub/gnu/ncurses/ ncurses-$NCURSES_VERSION.tar.gz ncurses
+ prebuild ncurses || return
+ $srcdir/configure --prefix=$PREFIX\
+ --without-cxx --without-cxx-binding --without-ada --without-manpages --without-progs\
+ --without-tests --without-curses-h --without-pkg-config --without-shared --without-debug\
+ --without-gpm --without-sysmouse --enable-widec --with-default-terminfo-dir=/usr/share/terminfo\
+ --with-terminfo-dirs=/usr/share/terminfo:/lib/terminfo:/usr/local/share/terminfo\
+ --with-fallbacks="screen linux vt100 xterm" --host=$HOST\
+ CPPFLAGS=-D_GNU_SOURCE || exit
+ make || exit
+ make install.libs || exit
+ postbuild
+}
+
+
+getncdu() {
+ prebuild ncdu || return
+ srcdir=../../..
+ $srcdir/configure --host=$HOST --with-ncursesw PKG_CONFIG=false\
+ CPPFLAGS=" -D_GNU_SOURCE -I$PREFIX/include -I$PREFIX/include/ncursesw"\
+ LDFLAGS="-static -L$PREFIX/lib -lncursesw" || exit
+ make || exit
+
+ VER=`cd '../../..' && git describe --abbrev=5 --dirty= | sed s/^v//`
+ tar -czf ../../ncdu-linux-$TARGET-$VER-unstripped.tar.gz ncdu
+ $HOST-strip ncdu
+ tar -czf ../../ncdu-linux-$TARGET-$VER.tar.gz ncdu
+ echo "====== ncdu-linux-$TARGET-$VER.tar.gz and -unstripped created."
+
+ postbuild
+}
+
+
+buildarch() {
+ TARGET=$1
+ case $TARGET in
+ arm) HOST=arm-musl-linuxeabi ;;
+ i486) HOST=i486-musl-linux ;;
+ *) echo "Unknown target: $TARGET" ;;
+ esac
+ PREFIX="`pwd`/$TARGET/inst"
+ mkdir -p $TARGET $PREFIX
+
+ getmusl
+ MBIN="`pwd`/tarballs/musl-$TARGET/bin"
+ OLDPATH="$PATH"
+ PATH="$PATH:$MBIN"
+ getncurses
+ getncdu
+ PATH="$OLDPATH"
+}
+
+
+buildarch $1
+