mirror of
				https://github.com/rbenv/ruby-build.git
				synced 2025-10-31 01:04:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			204 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| set -E
 | |
| exec 3<&2 # preserve original stderr at fd 3
 | |
| 
 | |
| abs_dirname() {
 | |
|   local cwd="$(pwd)"
 | |
|   local path="$1"
 | |
| 
 | |
|   while [ -n "$path" ]; do
 | |
|     cd "${path%/*}"
 | |
|     local name="${path##*/}"
 | |
|     path="$(readlink "$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() {
 | |
|   local cwd="$(pwd)"
 | |
|   local package_name="$1"
 | |
|   local package_url="$2"
 | |
|   shift 2
 | |
| 
 | |
|   cd "$TEMP_PATH"
 | |
|   download_package "$package_name" "$package_url"
 | |
|   extract_package "$package_name"
 | |
|   cd "$package_name"
 | |
|   build_package "$package_name" $*
 | |
|   after_install_package "$package_name"
 | |
|   cd "$cwd"
 | |
| 
 | |
|   echo "Installed ${package_name} to ${PREFIX_PATH}" >&2
 | |
| }
 | |
| 
 | |
| download_package() {
 | |
|   local package_name="$1"
 | |
|   local package_url="$2"
 | |
| 
 | |
|   echo "Downloading ${package_url}..." >&2
 | |
|   { curl "$package_url" > "${package_name}.tar.gz"
 | |
|   } >&4 2>&1
 | |
| }
 | |
| 
 | |
| extract_package() {
 | |
|   local package_name="$1"
 | |
| 
 | |
|   { tar xzvf "${package_name}.tar.gz"
 | |
|   } >&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_ruby() {
 | |
|   local package_name="$1"
 | |
| 
 | |
|   { "$RUBY_BIN" setup.rb
 | |
|   } >&4 2>&1
 | |
| }
 | |
| 
 | |
| build_package_rbx() {
 | |
|   local package_name="$1"
 | |
| 
 | |
|   { ./configure --prefix="$PREFIX_PATH"
 | |
|     rake install
 | |
|   } >&4 2>&1
 | |
| }
 | |
| 
 | |
| build_package_copy() {
 | |
|   cp -R . "$PREFIX_PATH"
 | |
| }
 | |
| 
 | |
| after_install_package() {
 | |
|   local stub=1
 | |
| }
 | |
| 
 | |
| use_gcc42_on_lion() {
 | |
|   if [ "$(uname -s)" = "Darwin" ]; then
 | |
|     if [ "$(expr "$(sw_vers -productVersion | cut -f 2 -d .)" \>= 7)" = 0 ]; then
 | |
|       export CC=/usr/bin/gcc-4.2
 | |
|     fi
 | |
|   fi
 | |
| }
 | |
| 
 | |
| usage() {
 | |
|   { 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
 | |
|   ;;
 | |
| "-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
 | |
| 
 | |
| 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
 |