#!/bin/bash function __rvm_install_source { if [ -z "$rvm_selected" ] ; then __rvm_select $* ; fi result=0 __rvm_log "info" "Installing Ruby from source to: $rvm_ruby_home" mkdir -p $rvm_ruby_log_path __rvm_pushpop $rvm_source_path if [ ! -z "$rvm_force_flag" ] ; then rm -rf $rvm_ruby_home rm -rf $rvm_ruby_src_path fi if [ -z "$rvm_ruby_tag" -a -z "$rvm_ruby_rev" ] ; then if [ ! -d $rvm_ruby_src_path ] ; then rvm_url="${rvm_url:-"ftp://ftp.ruby-lang.org/pub/ruby/1.$rvm_major_version/$rvm_ruby_package_name.tar.gz"}" __rvm_log "info" "Downloading $rvm_ruby_package_name, this may take a while depending on your connection..." __rvm_fetch $rvm_url if [ $? -gt 0 ] ; then result=$? ; return $result ; fi __rvm_log "info" "Extracting $rvm_ruby_package_name ..." mkdir -p $rvm_ruby_src_path # Is this line necessary considering -C below? v __rvm_run "extract" tar xzf $rvm_archives_path/$rvm_ruby_package_name.tar.gz -C $rvm_source_path if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi else __rvm_log "info" "Retrieving Ruby from $rvm_url" if [ ! -z "`echo $rvm_url | grep '^git'`" ] ; then if [ -d "$rvm_ruby_src_path/.git" ] ; then cd $rvm_ruby_src_path if [ -z "$rvm_ruby_rev" ] ; then git pull origin master if [ $? -gt 0 ] ; then result=$? ; return $result ; fi else git checkout ${rvm_ruby_rev:-HEAD} if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi else git clone --depth 1 $rvm_ruby_repo_url $rvm_ruby_src_path if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi else if [ -z "$rvm_ruby_rev" ] ; then # TODO: Check if tag v is valid rvm_url=$rvm_ruby_repo_url/tags/$rvm_ruby_tag rvm_rev="" else if [ "$rvm_ruby_rev" = "head" -o "$rvm_ruby_rev" = "trunk" ] ; then rvm_url="$rvm_ruby_repo_url/trunk" rvm_rev="" else rvm_url=$rvm_ruby_repo_url/branches/ruby_1_${rvm_major_version}_${rvm_minor_version} rvm_rev="-r $rvm_ruby_rev" fi fi if [ -d "$rvm_ruby_src_path/.svn" ] ; then cd $rvm_ruby_src_path if [ -z "$rvm_rev" ] ; then svn update else svn checkout -q $rvm_rev fi else svn checkout -q $rvm_rev --force $rvm_url $rvm_ruby_src_path fi if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi fi cd $rvm_ruby_src_path if [ $? -gt 0 ] ; then result=$? ; __rvm_log "error" "There was an error, please check $rvm_ruby_log_path/*.error.log" ; __rvm_pushpop ; return $result ; fi if [ ! -s "$rvm_ruby_src_path/configure" -a "$rvm_ruby_interpreter" = "ruby" ] ; then rvm_autoconf=`which autoconf` if [ $? -gt 0 ] ; then __rvm_log "fail" "rvm expects autoconf" ; result=$? ; return $result ; fi __rvm_run "autoconf" $rvm_autoconf if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi if [ -s ./Makefile -a -z "$rvm_reconfigure_flag" ] ; then __rvm_log "warn" "Skipping configure step, Makefile exists so configure must have already been run." elif [ -s ./configure ] ; then __rvm_log "info" "Configuring $rvm_ruby_package_name using $rvm_ruby_configure, this may take a while depending on your cpu(s)..." if [ -d $rvm_path/usr/include/readline/ ] ; then configure_parameters="$configure_parameters --with-readline-dir=$rvm_path/usr/include/readline/" fi if [ -d $rvm_path/usr/include/iconv/ ] ; then configure_parameters="$configure_parameters --with-iconv-dir=$rvm_path/usr/include/iconv/" fi __rvm_run "configure" "./configure --prefix=$rvm_ruby_home $rvm_ruby_configure $configure_parameters" unset configure_parameters if [ $? -gt 0 ] ; then result=$? ; return $result ; fi else __rvm_log "error" "Skipping configure step, 'configure' script does not exist, did autoconf not run successfully?" fi __rvm_log "info" "Compiling $rvm_ruby_package_name, this may take a while, depending on your cpu(s)..." if [ -z "$rvm_ruby_make" ] ; then __rvm_run "make" make $rvm_make_flags else __rvm_run "make" $rvm_ruby_make $rvm_make_flags fi if [ $? -gt 0 ] ; then result=$? ; return $result ; fi if [ -z "$rvm_ruby_make" ] ; then __rvm_log "info" "Installing $rvm_ruby_package_name" __rvm_run "install" make install else __rvm_run "install" $rvm_ruby_make_install fi if [ $? -gt 0 ] ; then result=$? ; return $result ; fi __rvm_log "info" "Installation of $rvm_ruby_package_name is complete." GEM_HOME="$rvm_gem_home" ; export GEM_HOME GEM_PATH="$rvm_gem_home" ; export GEM_PATH __rvm_rubygems_setup __rvm_bin_script __rvm_run "chmod.bin" chmod +x $rvm_ruby_home/bin/* __rvm_post_install __rvm_pushpop } function __rvm_install { # TODO: Extract the outer looping mechanism with ruby_do's rubies=() ; successes=() ; errors=() ; statuses=() # TODO: Extract the common functionality out of the if below if [ ! -z "$(echo "$rvm_ruby_version" | awk '/,/')" ] ; then rvm_ruby_versions=`echo $rvm_ruby_version | tr ',' ' '` for rvm_ruby_string in $rvm_ruby_versions ; do unset rvm_ruby_interpreter rvm_ruby_version rvm_ruby_repo_url rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_configure rvm_ruby_make rvm_ruby_make_install rvm_ruby_rev rvm_ruby_tag rvm_major_version rvm_minor_version rvm_gem_set_name rvm_gem_home rvm_ruby_binary rvm_ruby_package_name rvm_ruby_home rvm_ruby_log_path rvm_ruby_src_path rvm_ruby_irbrc rvm_selected if [ ! -z "$(echo $rvm_ruby_selector | awk '/^[0-9]/')" ] ; then rvm_ruby_interpreter="ruby" rvm_ruby_version="$rvm_ruby_selector" else rvm_ruby_interpreter="$rvm_ruby_selector" unset rvm_ruby_version fi __rvm_log "debug" $rvm_ruby_string __rvm_select __rvm_install_ruby done else __rvm_select __rvm_install_ruby fi } function __rvm_install_ruby { if [ -z "$rvm_selected" ] ; then __rvm_select $* ; fi if [ ! -z "$RUBYOPT" ] ; then ruby_options=$RUBYOPT ; unset RUBYOPT ; fi case "$rvm_ruby_interpreter" in macruby) if [ "`uname`" = "Darwin" ] ; then #rvm_macruby_repo_url="${rvm_macruby_repo_url:-"http://svn.macosforge.org/repository/ruby/MacRuby"}" rvm_macruby_repo_url="${rvm_macruby_repo_url:-"git://github.com/masterkain/macruby.git"}" rvm_ruby_repo_url=$rvm_macruby_repo_url #rvm_macruby_nightly_url=`__rvm_db "macruby_nightly_url"` rvm_ruby_configure="" rvm_ruby_make="rake macruby:build framework_instdir=$rvm_path/macruby-head framework_name=/macruby-head --trace" rvm_ruby_make_install="rake framework:install framework_instdir=$rvm_path/macruby-head framework_name=/macruby-head --trace" rvm_ruby_rev="${rvm_ruby_rev:-head}" # Hard coding this for now rvm_url=$rvm_ruby_repo_url DESTDIR="$rvm_ruby_home" ; export DESTDIR if [ -z "$rvm_ruby_rev" ] ; then # TODO: Check if tag v is valid #rvm_ruby_repo_url=$rvm_ruby_repo_url/tags/$rvm_ruby_tag rvm_ruby_rev="head" # For now, until nightly release are available. else if [ "$rvm_ruby_rev" = "head" -o "$rvm_ruby_rev" = "trunk" ] ; then #rvm_ruby_repo_url=$rvm_ruby_repo_url/trunk rvm_ruby_rev="head" else #rvm_ruby_repo_url=$rvm_ruby_repo_url/trunk rvm_ruby_rev="-r $rvm_ruby_rev" fi fi #__rvm_fetch $rvm_url #__rvm_run /usr/sbin/installer -pkg $rvm_ruby_package_name.pkg -target "$rvm_path/$rvm_ruby_package_name/" __rvm_install_source unset DESTDIR else __rvm_log "fail" "MacRuby can only be installed on a Darwin OS." fi __rvm_irbrc ;; ruby-enterprise|ree) rvm_url="http://rubyforge.org/frs/download.php/58677/$rvm_ruby_package_name.tar.gz" __rvm_log "info" "Installing Ruby Enterprise Edition from source to: $rvm_ruby_home" __rvm_pushpop $rvm_source_path if [ -d $rvm_ruby_src_path ] ; then cd $rvm_ruby_src_path else __rvm_log "info" "Downloading $rvm_ruby_package_name, this may take a while depending on your connection..." __rvm_fetch $rvm_url if [ $? -gt 0 ] ; then result=$? ; return $result ; fi __rvm_log "info" "Extracting $rvm_ruby_package_name..." mkdir -p $rvm_ruby_src_path __rvm_run "extract" tar xzf $rvm_archives_path/$rvm_ruby_package_name.tar.gz -C $rvm_source_path if [ $? -gt 0 ] ; then result=$? ; return $result ; fi fi __rvm_log "info" "Installing $rvm_ruby_package_name, this may take a while, depending on your cpu(s)..." mkdir -p $rvm_ruby_log_path cd $rvm_ruby_src_path mkdir -p $rvm_ruby_home/lib/ruby/gems/1.8/gems if [ ! -z "$rvm_ruby_configure" ] ; then rvm_ruby_configure="-c $rvm_ruby_configure"; fi __rvm_run "install" ./installer -a $rvm_path/ruby-enterprise-$rvm_ruby_version-$rvm_ruby_patch_level --dont-install-useful-gems --no-tcmalloc $rvm_ruby_configure if [ $? -gt 0 ] ; then result=$? ; return $result ; fi chmod +x $rvm_ruby_home/bin/* __rvm_rubygems_setup for rvm_gem_name in rake ; do __rvm_log "info" "Installing $rvm_gem_name" __rvm_run "gems" $rvm_ruby_home/bin/gem install $rvm_gem_name --no-rdoc --no-ri -q done __rvm_irbrc __rvm_bin_scripts __rvm_post_install __rvm_pushpop ;; rbx|rubinius) unset GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC PATH=$(echo $PATH | tr ':' '\n' | awk '$0 !~ /rvm/' | paste -sd : -) PATH=$rvm_bin_path:$PATH ; export PATH rvm_ruby_repo_url=$rvm_rubinius_repo_url rvm_ruby_configure="" rvm_ruby_src_path=$rvm_ruby_home rvm_ruby_make="rake" rvm_ruby_make_install="rake install" rvm_ruby_home="$rvm_path/$rvm_ruby_interpreter-$rvm_ruby_version" #rvm_ruby_rev="head" # TODO: Check if already git repo, then git pull origin master && build if [ ! -d $rvm_ruby_home -o ! -d $rvm_ruby_home/.git ] ; then rm -rf $rvm_ruby_home git clone --depth 1 $rvm_ruby_repo_url $rvm_ruby_home fi cd $rvm_ruby_home # prereqs, 1.8.6 w/ParseTree & rake. Yes this could all be one line... not pushing our luck. echo `rvm install 1.8.6` # This should install if missing. echo `rvm 1.8.6 -m rbx ; gem install --no-rdoc --no-ri rake ParseTree` # This should install if missing. rake186rbx=`rvm 1.8.6 -m rbx ; which rake` if [ ! -z "$rvm_jit_flag" ]; then __rvm_run "build" RBX_LLVM=1 $rake186rbx build else __rvm_run "build" $rake186rbx build fi ; unset rake186rbx for binary in ruby irb ; do ln -fs $rvm_ruby_home/bin/rbx $rvm_ruby_home/bin/$binary done $rvm_ruby_home/bin/rbx -S gem install rake --no-rdoc --no-ri for binary_name in gem rake ; do ruby_wrapper=$(cat < $file_name if [ -f $file_name ] ; then chmod +x $file_name ; fi done unset ruby_wrapper binary_name file_name done __rvm_irbrc __rvm_bin_scripts ;; jruby) rvm_package_file="$rvm_ruby_interpreter-bin-$rvm_ruby_version" rvm_url="http://dist.codehaus.org/$rvm_ruby_interpreter/$rvm_ruby_version/$rvm_package_file.zip" rvm_jruby_repo_url="${rvm_jruby_repo_url:-"git://kenai.com/jruby~main"}" __rvm_log "info" "Installing JRuby to: $rvm_ruby_home" mkdir -p $rvm_ruby_log_path __rvm_pushpop $rvm_source_path if [ ! -z "$rvm_ruby_rev" ] ; then if [ ! -d $rvm_path/$rvm_ruby_interpreter-$rvm_ruby_version -o ! -d $rvm_path/$rvm_ruby_interpreter-$rvm_ruby_version/.git ] ; then git clone --depth 1 $rvm_jruby_repo_url $rvm_ruby_src_path # TODO: Test if 'ant' is installed, if not throw error. cd $rvm_ruby_src_path && ant fi else if [ -d $rvm_ruby_src_path ] ; then cd $rvm_ruby_src_path else if [ -z "$rvm_force_flag" -a -f $rvm_package_file -a -s $rvm_package_file ] ; then __rvm_log "info" "It appears that $rvm_package_file has already been downloaded, skipping. Use --force to force re-download." else __rvm_log "info" "Downloading $rvm_package_file, this may take a while depending on your connection..." __rvm_fetch $rvm_url fi __rvm_log "info" "Extracting $rvm_package_file..." rvm_unzip=`which unzip` if [ $? -ne 0 ] ; then __rvm_log "error" "'unzip' was not found in your PATH. jRuby official release comes as a .zip file, hence 'unzip' is required to extract it. Please install 'unzip' and try again." else __rvm_run "extract" unzip -q $rvm_archives_path/$rvm_package_file.zip -d $rvm_source_path fi cd $rvm_ruby_src_path fi fi __rvm_log "info" "Installing $rvm_ruby_package_name..." mkdir -p $rvm_ruby_home/bin/ __rvm_run "sync" rsync -ag $rvm_ruby_src_path/ $rvm_ruby_home/ __rvm_run "nailgun" "cd $rvm_ruby_src_path/tool/nailgun && make $rvm_make_flags" __rvm_pushpop chmod +x $rvm_ruby_home/bin/* for binary in jirb jruby jgem ; do ln -fs $rvm_ruby_home/bin/$binary $rvm_ruby_home/bin/${binary#j} done ; unset binary for binary in rake rdoc ri spec autospec ; do __rvm_inject_ruby_shebang $rvm_ruby_home/bin/$binary __rvm_inject_gem_env $rvm_ruby_home/bin/$binary chmod +x $rvm_ruby_home/bin/$binary done ; unset binary __rvm_irbrc __rvm_bin_script ln -fs $rvm_ruby_home/bin/ruby $rvm_path/bin/$rvm_ruby_package_name # Is this necessary? __rvm_use for rvm_gem_name in jruby-openssl ; do __rvm_log "info" "Installing $rvm_gem_name" __rvm_run "gems" gem install $rvm_gem_name --no-rdoc --no-ri -q done ; unset rvm_gem_name ;; ruby) # Merge configure options with user specified options rvm_ruby_configure="--enable-shared=true --enable-pthread $rvm_ruby_configure " if [ "`uname`" = "Darwin" ] ; then ARCHFLAGS="-arch x86_64 -arch i386" ; export ARCHFLAGS ; fi __rvm_install_source $* ;; default) __rvm_log "fail" "please specify a ruby implementation to install." ;; *) __rvm_log "fail" "Ruby implementation '$rvm_ruby_interpreter' is not known." esac if [ ! -z "$ruby_options" ] ; then RUBYOPT=$ruby_options ; export RUBYOPT ; fi } # TODO: DRY up __rvm_remove and __rvm_uninstall function __rvm_remove { if [ -z "$rvm_selected" ] ; then __rvm_select $* ; fi if [ ! -z "$rvm_ruby_package_name" ] ; then for dir in $rvm_source_path $rvm_path ; do if [ -d $dir/$rvm_ruby_package_name ] ; then __rvm_log "info" "Removing $dir/$rvm_ruby_package_name..." rm -rf $dir/$rvm_ruby_package_name else __rvm_log "info" "it seems that $dir/$rvm_ruby_package_name is already non existent." fi if [ -e $rvm_bin_path/$rvm_ruby_package_name ] ; then rm -f $rvm_bin_path/$rvm_ruby_package_name fi done ; unset dir rm -rf $rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version*/ else __rvm_log "fail" "Cannot uninstall unknown package '$rvm_ruby_package_name'" fi } function __rvm_uninstall { if [ -z "$rvm_selected" ] ; then __rvm_select $* ; fi if [ ! -z "$rvm_ruby_package_name" ] ; then for dir in $rvm_path ; do if [ -d $dir/$rvm_ruby_package_name ] ; then __rvm_log "info" "Removing $dir/$rvm_ruby_package_name..." rm -rf $dir/$rvm_ruby_package_name else __rvm_log "info" "it seems that $dir/$rvm_ruby_package_name is already non existent." fi if [ -e $rvm_bin_path/$rvm_ruby_package_name ] ; then rm -f $rvm_bin_path/$rvm_ruby_package_name fi done ; unset dir rm -rf $rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version*/ else __rvm_log "fail" "Cannot uninstall unknown package '$rvm_ruby_package_name'" fi } function __rvm_post_install { for binary in gem irb erb ri rdoc testrb rake ; do if [ -e $rvm_ruby_home/bin/$binary -o -e $rvm_ruby_src_path/bin/$binary ] ; then if [ "$rvm_ruby_src_path" != "$rvm_ruby_home" -a -f $rvm_ruby_src_path/bin/$binary ] ; then cp -f $rvm_ruby_src_path/bin/$binary $rvm_ruby_home/bin/$binary elif [ -f "$rvm_gem_home/bin/$binary" ] ; then cp -f $rvm_gem_home/bin/$binary $rvm_ruby_home/bin/$binary fi __rvm_inject_gem_env $rvm_ruby_home/bin/$binary __rvm_inject_ruby_shebang $rvm_ruby_home/bin/$binary chmod +x $rvm_ruby_home/bin/$binary fi done ; unset binary __rvm_log "info" "Installing gems for $rvm_ruby_package_name." for rvm_gem_name in rake ; do __rvm_log "info" "Installing $rvm_gem_name" __rvm_run "gems" $rvm_ruby_home/bin/gem install $rvm_gem_name --no-rdoc --no-ri -q done ; unset rvm_gem_name __rvm_log "info" "Installation of gems for $rvm_ruby_package_name is complete." binary=rake if [ -x $rvm_gem_home/bin/$binary ] ; then if [ "$rvm_gem_home" != "$rvm_ruby_home" ] ; then cp $rvm_gem_home/bin/$binary $rvm_ruby_home/bin/$binary fi __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/$binary" __rvm_inject_gem_env "$rvm_ruby_home/bin/$binary" fi ; unset binary } function __rvm_rubygems_setup { if [ -z "`echo $rvm_ruby_version | awk '/^1\.9/'`" ] ; then __rvm_log "info" "Installing rubygems dedicated to $rvm_ruby_package_name..." rvm_gem_package_name="rubygems-1.3.5" rvm_gem_url="http://rubyforge.org/frs/download.php/60718/$rvm_gem_package_name.tgz" if [ -d $rvm_source_path/$rvm_gem_package_name ] ; then cd $rvm_source_path/$rvm_gem_package_name else __rvm_fetch $rvm_gem_url mkdir -p $rvm_source_path/$rvm_gem_package_name __rvm_run "rubygems.extract" tar zxf $rvm_archives_path/$rvm_gem_package_name.tgz -C $rvm_source_path fi __rvm_run "rubygems.install" GEM_PATH=$rvm_gem_path GEM_HOME=$rvm_gem_home $rvm_ruby_home/bin/ruby $rvm_source_path/$rvm_gem_package_name/setup.rb result=$? if [ $result -eq 0 ] ; then __rvm_log "info" "Installation of rubygems $rvm_ruby_package_name completed successfully." fi __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/gem" else # 1.9 has it's own built-in gem command __rvm_inject_ruby_shebang "$rvm_ruby_src_path/bin/gem" cp $rvm_ruby_src_path/bin/gem $rvm_ruby_home/bin/gem __rvm_run "rubygems.update" $rvm_ruby_home/bin/gem update --system fi return $result } function __rvm_inject_ruby_shebang { __rvm_actual_file $1 if [ -f $actual_file ] ; then sed -i.orig -e "s=#\!/usr/bin/env [j]*ruby=#\!$rvm_ruby_home/bin/ruby=" $actual_file rm -f $actual_file.orig ; chmod +x $actual_file fi ; unset actual_file } function __rvm_inject_gem_env { __rvm_actual_file $1 if [ -f $actual_file ] ; then set -x if [ ! -z "`head -n 1 $actual_file | awk '/[j]*ruby/'`" ] ; then string="ENV['GEM_HOME']=ENV['GEM_HOME'] || '$rvm_gem_home'\nENV['GEM_PATH']=ENV['GEM_PATH'] || '$rvm_gem_home'\nENV['PATH']='$rvm_ruby_home/bin:$rvm_gem_home/bin:' + ENV['PATH']" elif [ ! -z "`head -n 1 $actual_file | awk '/bash/'`" ] ; then string="GEM_HOME=\${GEM_HOME:-'$rvm_gem_home'}\nGEM_PATH=\${GEM_PATH:-'$rvm_gem_home'}\nPATH=$rvm_ruby_home/bin:$rvm_gem_home/bin:\$PATH" fi set +x awk "NR==2 {print \"$string\"} {print}" $actual_file > $actual_file.new mv $actual_file.new $actual_file ; chmod +x $actual_file fi ; unset string actual_file } function __rvm_actual_file { if [ -L $1 ] ; then # If the file is a symlink, actual_file=`readlink $1` # read the link target so we can preserve it. else actual_file="$1" fi }