#!/bin/sh # # Script to bootstrap Cargo on FreeBSD # https://csperkins.org/research/misc/2015-01-02-cargo-freebsd.html # # Copyright (c) 2015 Colin Perkins # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "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 # COPYRIGHT HOLDER OR CONTRIBUTORS 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. # # ================================================================================================= # Supporting functions and definitions set -e scriptdir=$(dirname "$0") gitdir="$scriptdir/git" builddir="$scriptdir/build" git_fetch () { if [ ! -d $1 ]; then echo "*** git clone $2 -> $1" git clone --recursive $2 $1 fi echo "*** git checkout $1 $3" (cd $1 && git fetch -p && git checkout -q $3) } # ================================================================================================= # Create target directory, for intermediate builds, if necessary if [ ! -d $builddir ]; then echo "*** mkdir $builddir" mkdir -p $builddir fi # ================================================================================================= # Create bootstrap version of cargo export CARGO_PKG_VERSION_MAJOR=0 export CARGO_PKG_VERSION_MINOR=2 export CARGO_PKG_VERSION_PATCH=0 export CARGO_PKG_VERSION="$CARGO_PKG_VERSION_MAJOR.$CARGO_PKG_VERSION_MINOR.$CARGO_PKG_VERSION_PATCH" # Fetch dependencies for Cargo #git_fetch $gitdir/libc https://github.com/rust-lang/libc 5e20a3f #git_fetch $gitdir/semver https://github.com/rust-lang/semver cb39080 #git_fetch $gitdir/regex https://github.com/rust-lang/regex 996fce6 #git_fetch $gitdir/rustc_serialize https://github.com/rust-lang/rustc-serialize 3691008 #git_fetch $gitdir/strsim https://github.com/dguo/strsim-rs 0125b88 #git_fetch $gitdir/docopt https://github.com/docopt/docopt.rs 116eca9 #git_fetch $gitdir/flate2 https://github.com/alexcrichton/flate2-rs 5a78698 #git_fetch $gitdir/glob https://github.com/rust-lang/glob 273342a #git_fetch $gitdir/libz_sys https://github.com/alexcrichton/libz-sys c8d3478 #git_fetch $gitdir/openssl https://github.com/sfackler/rust-openssl 8a9aa0c #git_fetch $gitdir/matches https://github.com/SimonSapin/rust-std-candidates 1c2d089 #git_fetch $gitdir/url https://github.com/servo/rust-url 88e4a9e #git_fetch $gitdir/log https://github.com/rust-lang/log origin/master #git_fetch $gitdir/curl https://github.com/carllerche/curl-rust 88d4fdc #git_fetch $gitdir/tar https://github.com/alexcrichton/tar-rs 1713f63 #git_fetch $gitdir/bitflags https://github.com/rust-lang/bitflags origin/master #git_fetch $gitdir/ssh2 https://github.com/alexcrichton/ssh2-rs d8a78b3 #git_fetch $gitdir/git2 https://github.com/alexcrichton/git2-rs 3a5f0b5 #git_fetch $gitdir/gcc https://github.com/alexcrichton/gcc-rs b8da3f5 #git_fetch $gitdir/toml https://github.com/alexcrichton/toml-rs 6713224 #git_fetch $gitdir/pkg_config https://github.com/alexcrichton/pkg-config-rs 9bcae51 #git_fetch $gitdir/num_cpus https://github.com/seanmonstar/num_cpus origin/master #git_fetch $gitdir/threadpool https://github.com/rust-lang/threadpool origin/master #git_fetch $gitdir/time https://github.com/rust-lang/time origin/master #git_fetch $gitdir/term https://github.com/rust-lang/term origin/master #git_fetch $gitdir/cargo https://github.com/rust-lang/cargo.git $CARGO_PKG_VERSION # Build non-Rust dependencies for Cargo RUSTC=rustc cargolib=$builddir/lib cargobin=$builddir/bin mkdir -p "$cargolib" mkdir -p "$cargobin" #echo "*** Build libgit2" #mkdir -p $gitdir/git2/libgit2-sys/libgit2/build #(prefix=$(realpath "$builddir") && \ # cd $gitdir/git2/libgit2-sys/libgit2/build && \ # cmake .. -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_SHARED_LIBS=ON && \ # make -j8 && make install) #echo "*** Build libminiz" #clang -c $gitdir/flate2/miniz-sys/miniz.c -o $cargolib/miniz.o #ar -rc $cargolib/libminiz.a $cargolib/miniz.o #ranlib $cargolib/libminiz.a #rm $cargolib/miniz.o # Build Rust dependencies for Cargo #echo "*** Build libc" && $RUSTC $gitdir/libc/rust/src/liblibc/lib.rs --crate-type lib --crate-name libc --out-dir $cargolib -L $cargolib --cfg feature=\"cargo-build\" #echo "*** Build semver" && $RUSTC $gitdir/semver/src/lib.rs --crate-type lib --crate-name semver --out-dir $cargolib -L $cargolib #echo "*** Build regex" && $RUSTC $gitdir/regex/src/lib.rs --crate-type lib --crate-name regex --out-dir $cargolib -L $cargolib #echo "*** Build rustc_serialize"&& $RUSTC $gitdir/rustc_serialize/src/lib.rs --crate-type lib --crate-name rustc_serialize --out-dir $cargolib -L $cargolib #echo "*** Build strsim" && $RUSTC $gitdir/strsim/src/lib.rs --crate-type lib --crate-name strsim --out-dir $cargolib -L $cargolib #echo "*** Build docopt" && $RUSTC $gitdir/docopt/src/lib.rs --crate-type lib --crate-name docopt --out-dir $cargolib -L $cargolib #echo "*** Build gcc" && $RUSTC $gitdir/gcc/src/lib.rs --crate-type lib --crate-name gcc --out-dir $cargolib -L $cargolib #echo "*** Build miniz_sys" && $RUSTC $gitdir/flate2/miniz-sys/lib.rs --crate-type lib --crate-name miniz_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib -l miniz #echo "*** Build flate2" && $RUSTC $gitdir/flate2/src/lib.rs --crate-type lib --crate-name flate2 --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib --extern gcc=$cargolib/libgcc.rlib #echo "*** Build glob" && $RUSTC $gitdir/glob/src/lib.rs --crate-type lib --crate-name glob --out-dir $cargolib -L $cargolib #echo "*** Build libz_sys" && $RUSTC $gitdir/libz_sys/src/lib.rs --crate-type lib --crate-name libz_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build bitflags" && $RUSTC $gitdir/bitflags/src/lib.rs --crate-type lib --crate-name bitflags --out-dir $cargolib -L $cargolib #echo "*** Build openssl_sys" && $RUSTC $gitdir/openssl/openssl-sys/src/lib.rs --crate-type lib --crate-name openssl_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build matches" && $RUSTC $gitdir/matches/matches/lib.rs --crate-type lib --crate-name matches --out-dir $cargolib -L $cargolib #echo "*** Build url" && $RUSTC $gitdir/url/src/lib.rs --crate-type lib --crate-name url --out-dir $cargolib -L $cargolib #echo "*** Build log" && $RUSTC $gitdir/log/src/lib.rs --crate-type lib --crate-name log --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build env_logger" && $RUSTC $gitdir/log/env/src/lib.rs --crate-type lib --crate-name env_logger --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib --extern log=$cargolib/liblog.rlib #echo "*** Build curl_sys" && $RUSTC $gitdir/curl/curl-sys/lib.rs --crate-type lib --crate-name curl_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build curl" && $RUSTC $gitdir/curl/src/lib.rs --crate-type lib --crate-name curl --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib --extern url=$cargolib/liburl.rlib --extern log=$cargolib/liblog.rlib #echo "*** Build tar" && $RUSTC $gitdir/tar/src/lib.rs --crate-type lib --crate-name tar --out-dir $cargolib -L $cargolib #echo "*** Build libssh2_sys" && $RUSTC $gitdir/ssh2/libssh2-sys/lib.rs --crate-type lib --crate-name libssh2_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build ssh2" && $RUSTC $gitdir/ssh2/src/lib.rs --crate-type lib --crate-name ssh2 --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build libgit2_sys" && $RUSTC $gitdir/git2/libgit2-sys/lib.rs --crate-type lib --crate-name libgit2_sys --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build git2" && $RUSTC $gitdir/git2/src/lib.rs --crate-type lib --crate-name git2 --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib --extern url=$cargolib/liburl.rlib #echo "*** Build git2_curl" && $RUSTC $gitdir/git2/git2-curl/src/lib.rs --crate-type lib --crate-name git2_curl --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib --extern log=$cargolib/liblog.rlib #echo "*** Build toml" && $RUSTC $gitdir/toml/src/lib.rs --crate-type lib --crate-name toml --out-dir $cargolib -L $cargolib --cfg feature=\"rustc-serialize\" #echo "*** Build pkg_config" && $RUSTC $gitdir/pkg_config/src/lib.rs --crate-type lib --crate-name pkg_config --out-dir $cargolib -L $cargolib #echo "*** Build num_cpus" && $RUSTC $gitdir/num_cpus/src/lib.rs --crate-type lib --crate-name num_cpus --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build threadpool" && $RUSTC $gitdir/threadpool/src/lib.rs --crate-type lib --crate-name threadpool --out-dir $cargolib -L $cargolib #echo "*** Build time" && $RUSTC $gitdir/time/src/lib.rs --crate-type lib --crate-name time --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib #echo "*** Build term" && $RUSTC $gitdir/term/src/lib.rs --crate-type lib --crate-name term --out-dir $cargolib -L $cargolib --extern libc=$cargolib/liblibc.rlib # Build Cargo #echo "*** Build cargo/registry" && $RUSTC $gitdir/cargo/src/registry/lib.rs --crate-type lib --crate-name registry --out-dir $cargolib -L $cargolib #echo "*** Build cargo (lib)" && $RUSTC $gitdir/cargo/src/cargo/lib.rs --crate-type lib --crate-name cargo --out-dir $cargolib -L $cargolib --extern glob=$cargolib/libglob.rlib --extern semver=$cargolib/libsemver.rlib --extern log=$cargolib/liblog.rlib --extern term=$cargolib/libterm.rlib libs='-l ssl -lcrypto -lz -lgit2' for lib in curl flate ssh2; do libs="$libs -l$lib" if test -f /usr/local/lib/lib$lib.so; then test -f $cargolib/lib$lib.so || ln -s /usr/local/lib/lib$lib.so $cargolib elif test -f /usr/local/lib/lib$lib.a; then test -f $cargolib/lib$lib.a || ln -s /usr/local/lib/lib$lib.a $cargolib fi done #echo "*** Build cargo (bin)" && $RUSTC $gitdir/cargo/src/bin/cargo.rs -L $cargolib --out-dir $cargobin $libs --extern log=$cargolib/liblog.rlib echo "$(LD_LIBRARY_PATH=$cargolib $cargobin/cargo -V) bootstrapped successfully" # Create snapshot archive. instdir="$scriptdir/cargo-nightly-x86_64-unknown-freebsd" mkdir -p "$instdir/cargo/bin" "$instdir/cargo/lib" install -m 755 $cargobin/cargo $instdir/cargo/bin cp -a $cargolib/libgit2.so* $instdir/cargo/lib (cd $(dirname "$instdir") && tar -cvf - $(basename "$instdir") | gzip > $(basename "$instdir").tar.gz)