#!/bin/sh # Copyright 2017 Andrew Clemons, Wellingtoni, New Zealand # Copyright 2017 Patrick J. Volkerding, Sebeka, Minnesota, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PKGNAM=cargo VERSION=${VERSION:-0.20.0} VERSION_BOOTSTRAP=${VERSION_BOOTSTRAP:-0.19.0} BUILD=${BUILD:-1} # Automatically determine the architecture we're building on: MARCH=$( uname -m ) if [ -z "$ARCH" ]; then case "$MARCH" in i?86) export ARCH=i686 ;; armv7hl) export ARCH=$MARCH ;; arm*) export ARCH=arm ;; # Unless $ARCH is already set, use uname -m for all other archs: *) export ARCH=$MARCH ;; esac fi unset MARCH # Set bootstrapping $ARCH: BARCH=$ARCH for now, then adjust if # bootstrapping later: BARCH="$ARCH" CWD=$(pwd) TMP=${TMP:-/tmp} PKG=$TMP/package-$PKGNAM OUTPUT=${OUTPUT:-/tmp} if [ "$ARCH" = "i586" ]; then SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" LIBDIRSUFFIX="64" elif [ "$ARCH" = "armv7hl" ]; then SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16" LIBDIRSUFFIX="" else SLKCFLAGS="-O2" LIBDIRSUFFIX="" fi rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $PKGNAM-$VERSION tar xvf $CWD/$PKGNAM-$VERSION.tar.xz || exit 1 cd $PKGNAM-$VERSION || exit 1 # if you already have rust and cargo installed, you can bootstrap from the # previous version. if [ "$LOCAL_BOOTSTRAP" = "" ] && [ -x /usr/bin/cargo ] && [ -x /usr/bin/rustc ] ; then LOCAL_BOOTSTRAP=yes fi if [ "$LOCAL_BOOTSTRAP" != "yes" ] ; then # Bootstrapping $ARCH: if [ "$ARCH" = "i586" ]; then BARCH="i686" else BARCH="$ARCH" fi tar xvf $CWD/cargo-$VERSION_BOOTSTRAP-$BARCH-unknown-linux-gnu.tar.gz || exit 1 PATH="$(pwd)/cargo-$VERSION_BOOTSTRAP-$BARCH-unknown-linux-gnu/cargo/bin:$PATH" export PATH fi # build offline # configuration tells cargo to use the configured directory # for dependencies instead of downloading from crates.io. mkdir .cargo cat << EOF >> .cargo/config [source.crates-io] registry = 'https://github.com/rust-lang/crates.io-index' replace-with = 'vendored-sources' [source.vendored-sources] directory = '$(pwd)/vendor' EOF if [ -e $CWD/$PKGNAM-$VERSION-vendor.tar.gz ] ; then tar xvf $CWD/$PKGNAM-$VERSION-vendor.tar.gz || exit 1 else # deps and versions come from Cargo.lock mkdir vendor ( cd vendor for dependency in advapi32-sys=0.2.0 \ aho-corasick=0.5.3 \ aho-corasick=0.6.3 \ backtrace=0.3.2 \ backtrace-sys=0.1.11 \ bitflags=0.9.1 \ bufstream=0.1.3 \ cfg-if=0.1.0 \ cmake=0.1.24 \ crossbeam=0.2.10 \ curl=0.4.6 \ curl-sys=0.3.12 \ dbghelp-sys=0.2.0 \ docopt=0.7.0 \ dtoa=0.4.1 \ env_logger=0.4.3 \ error-chain=0.10.0 \ filetime=0.1.10 \ flate2=0.2.19 \ foreign-types=0.2.0 \ fs2=0.4.1 \ gcc=0.3.50 \ gdi32-sys=0.2.0 \ git2=0.6.6 \ git2-curl=0.7.0 \ glob=0.2.11 \ hamcrest=0.1.1 \ idna=0.1.2 \ itoa=0.3.1 \ jobserver=0.1.6 \ kernel32-sys=0.2.2 \ lazy_static=0.2.8 \ libc=0.2.23 \ libgit2-sys=0.6.12 \ libssh2-sys=0.2.6 \ libz-sys=1.0.14 \ log=0.3.8 \ matches=0.1.4 \ memchr=0.1.11 \ memchr=1.0.1 \ miniz-sys=0.1.9 \ miow=0.2.1 \ net2=0.2.29 \ num=0.1.37 \ num-bigint=0.1.37 \ num-complex=0.1.37 \ num-integer=0.1.34 \ num-iter=0.1.33 \ num-rational=0.1.36 \ num-traits=0.1.37 \ num_cpus=1.5.0 \ openssl=0.9.13 \ openssl-probe=0.1.1 \ openssl-sys=0.9.13 \ pkg-config=0.3.9 \ psapi-sys=0.1.0 \ quote=0.3.15 \ rand=0.3.15 \ regex=0.1.80 \ regex=0.2.2 \ regex-syntax=0.3.9 \ regex-syntax=0.4.1 \ rustc-demangle=0.1.4 \ rustc-serialize=0.3.24 \ scoped-tls=0.1.0 \ semver=0.7.0 \ semver-parser=0.7.0 \ serde=1.0.8 \ serde_derive=1.0.8 \ serde_derive_internals=0.15.1 \ serde_ignored=0.0.3 \ serde_json=1.0.2 \ shell-escape=0.1.3 \ strsim=0.6.0 \ syn=0.11.11 \ synom=0.11.3 \ tar=0.4.13 \ tempdir=0.3.5 \ term=0.4.5 \ thread-id=2.0.0 \ thread-id=3.1.0 \ thread_local=0.2.7 \ thread_local=0.3.3 \ toml=0.4.1 \ unicode-bidi=0.3.3 \ unicode-normalization=0.1.4 \ unicode-xid=0.0.4 \ unreachable=0.1.1 \ url=1.4.1 \ user32-sys=0.2.0 \ utf8-ranges=0.1.3 \ utf8-ranges=1.0.0 \ vcpkg=0.2.1 \ void=1.0.2 \ winapi=0.2.8 \ winapi-build=0.1.1 \ ws2_32-sys=0.2.1 ; do dep="$(echo "$dependency" | cut -d= -f1)" ver="$(echo "$dependency" | cut -d= -f2)" tar xvf $CWD/crates/$dep-$ver.crate || exit 1 touch $dep-$ver/.cargo-ok # generate checksum { printf "{\n" printf ' "files": {\n' ( cd $dep-$ver find . -type f -print0 | xargs -0 sha256sum | sed -n '/\.cargo-checksum\.json/!p' | sed 's/\.\///;s/^\([^ ]*\)[[:space:]][[:space:]]*\(.*\)$/"\2":"\1",/' ) | sed '$ s/,$//' printf " },\n" printf ' "package": "' sha256sum "$CWD/crates/$dep-$ver.crate" | cut -f1 -d' ' | sed 's/$/"/' printf "}\n" } | python -c "import sys, json; data = sys.stdin.read(); print json.dumps(json.loads(data), sort_keys=True, indent=4, separators=(',', ' : '))" > $dep-$ver/.cargo-checksum.json done ) || exit 1 fi chown -R root:root . find -L . \ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ -o -perm 511 \) -exec chmod 755 {} \; -o \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; cargo doc || exit 1 cargo install --root $PKG/usr || exit 1 rm $PKG/usr/.crates.toml find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true mkdir -p $PKG/usr/man/man1 cp -a src/etc/man/* $PKG/usr/man/man1 find $PKG/usr/man -type f -exec gzip -9 {} \; for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done mkdir -p $PKG/usr/share/bash-completion/completions mkdir -p $PKG/usr/share/zsh/site-functions install -m 0755 src/etc/cargo.bashcomp.sh $PKG/usr/share/bash-completion/completions/cargo install -m 0755 src/etc/_cargo $PKG/usr/share/zsh/site-functions/_cargo mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION cp -a *LICENSE* README* $PKG/usr/doc/$PKGNAM-$VERSION cp -a target/doc/cargo $PKG/usr/doc/$PKGNAM-$VERSION # Include docs from each crate: mkdir $PKG/usr/doc/$PKGNAM-$VERSION/vendor ( cd vendor tar cf - $(find . | grep -e README -e LICENSE -e COPYING -e CHANGELOG -e PERFORMANCE -e UPGRADE ) | ( cd $PKG/usr/doc/$PKGNAM-$VERSION/vendor ; tar xf - ) ) mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PKGNAM-$VERSION-$ARCH-$BUILD.txz