#!/usr/bin/env bash RUBY_BUILD_VERSION="20110912.1" set -E exec 3<&2 # preserve original stderr at fd 3 resolve_link() { $(type -p greadlink readlink | head -1) $1 } abs_dirname() { local cwd="$(pwd)" local path="$1" while [ -n "$path" ]; do cd "${path%/*}" local name="${path##*/}" path="$(resolve_link "$name" || true)" done pwd cd "$cwd" } build_failed() { { echo echo "BUILD FAILED" echo echo "Inspect or clean up the working tree at ${TEMP_PATH}" echo "Results logged to ${LOG_PATH}" echo } >&3 exit 1 } install_package() { install_package_using "tarball" 1 $* } install_git() { install_package_using "git" 2 $* } install_package_using() { local package_type="$1" local package_type_nargs="$2" local package_name="$3" shift 3 pushd "$TEMP_PATH" >&4 "fetch_${package_type}" "$package_name" $* shift $(($package_type_nargs)) make_package "$package_name" $* popd >&4 echo "Installed ${package_name} to ${PREFIX_PATH}" >&2 } make_package() { local package_name="$1" shift pushd "$package_name" >&4 build_package "$package_name" $* after_install_package "$package_name" fix_directory_permissions popd >&4 echo "Installed ${package_name} to ${PREFIX_PATH}" >&2 } fetch_tarball() { local package_name="$1" local package_url="$2" echo "Downloading ${package_url}..." >&2 { curl "$package_url" > "${package_name}.tar.gz" tar xzvf "${package_name}.tar.gz" } >&4 2>&1 } fetch_git() { local package_name="$1" local git_url="$2" local git_ref="$3" echo "Cloning ${git_url}..." >&2 { git clone --depth 1 --branch "$git_ref" "$git_url" "${package_name}" } >&4 2>&1 } build_package() { local package_name="$1" shift if [ "$#" -eq 0 ]; then local commands="standard" else local commands="$*" fi echo "Installing ${package_name}..." >&2 for command in $commands; do "build_package_${command}" done } build_package_standard() { local package_name="$1" { ./configure --prefix="$PREFIX_PATH" make -j 2 make install } >&4 2>&1 } build_package_autoconf() { { autoconf } >&4 2>&1 } build_package_ruby() { local package_name="$1" { "$RUBY_BIN" setup.rb } >&4 2>&1 } build_package_rbx() { local package_name="$1" { ./configure --prefix="$PREFIX_PATH" --gemsdir="$PREFIX_PATH" rake install } >&4 2>&1 } build_package_copy() { cp -R . "$PREFIX_PATH" } after_install_package() { local stub=1 } fix_directory_permissions() { # Ensure installed directories are not world-writable to avoid Bundler warnings find "$PREFIX_PATH" -type d -exec chmod go-w {} \; } use_gcc42_on_lion() { if [ "$(uname -s)" = "Darwin" ]; then if [ "$(expr "$(sw_vers -productVersion | cut -f 2 -d .)" \>= 7 || true)" -eq 1 ]; then export CC=/usr/bin/gcc-4.2 fi fi } version() { echo "ruby-build ${RUBY_BUILD_VERSION}" } usage() { { version echo "usage: ruby-build [-v|--verbose] definition prefix" echo " ruby-build --definitions" } >&2 if [ -z "$1" ]; then exit 1 fi } list_definitions() { { for definition in "${RUBY_BUILD_ROOT}/share/ruby-build/"*; do echo "${definition##*/}" done } | sort } unset VERBOSE RUBY_BUILD_ROOT="$(abs_dirname "$0")/.." case "$1" in "-h" | "--help" ) usage without_exiting { echo echo " -v/--verbose Verbose mode: print compilation status to stdout" echo " --definitions List all built-in definitions" echo } >&2 exit 0 ;; "--definitions" ) list_definitions exit 0 ;; "--version" ) version exit 0 ;; "-v" | "--verbose" ) VERBOSE=true shift ;; esac DEFINITION_PATH="$1" if [ -z "$DEFINITION_PATH" ]; then usage elif [ ! -e "$DEFINITION_PATH" ]; then BUILTIN_DEFINITION_PATH="${RUBY_BUILD_ROOT}/share/ruby-build/${DEFINITION_PATH}" if [ -e "$BUILTIN_DEFINITION_PATH" ]; then DEFINITION_PATH="$BUILTIN_DEFINITION_PATH" else echo "ruby-build: definition not found: ${DEFINITION_PATH}" >&2 exit 1 fi fi PREFIX_PATH="$2" if [ -z "$PREFIX_PATH" ]; then usage fi if [ -z "$TMPDIR" ]; then TMP="/tmp" else TMP="${TMPDIR%/}" fi SEED="$(date "+%Y%m%d%H%M%S").$$" LOG_PATH="${TMP}/ruby-build.${SEED}.log" TEMP_PATH="${TMP}/ruby-build.${SEED}" RUBY_BIN="${PREFIX_PATH}/bin/ruby" CWD="$(pwd)" exec 4<> "$LOG_PATH" # open the log file at fd 4 if [ -n "$VERBOSE" ]; then tail -f "$LOG_PATH" & trap "kill 0" SIGINT SIGTERM EXIT fi export LDFLAGS="-L'${PREFIX_PATH}/lib' ${LDFLAGS}" export CPPFLAGS="-I'${PREFIX_PATH}/include' ${CPPFLAGS}" unset RUBYOPT unset RUBYLIB trap build_failed ERR mkdir -p "$TEMP_PATH" source "$DEFINITION_PATH" rm -fr "$TEMP_PATH" trap - ERR