#!/usr/bin/env bash ## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg -> requirements_rvm_pkg_config() { PKG_CONFIG_PATH="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig:${rvm_usr_path:-${rvm_path}/usr}/lib64/pkgconfig:/opt:/usr:/usr/local" pkg-config "$@" } requirements_rvm_pkg_lib_installed() { if is_a_function ${1}_installed && ${1}_installed then return 0 fi requirements_rvm_pkg_config --list-all | __rvm_grep "^$1[- ]" >/dev/null || return $? true } requirements_rvm_pkg_libs_install() { while (( $# )) do PKG_CONFIG_LIBDIR="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig" install_$1 || return $? shift done } requirements_rvm_pkg_after_uniqe_paths() { \typeset __lib __lib_full_name for __lib do __lib_full_name=$( requirements_rvm_pkg_config --list-all | __rvm_awk "/^${__lib}[- ]/{print \$1}" ) if [[ -n "${__lib_full_name}" ]] then requirements_rvm_pkg_config ${__lib_full_name} --variable=prefix elif [[ "${__lib}" == 'readline' ]] then # http://lists.gnu.org/archive/html/bug-readline/2010-09/msg00002.html echo ${rvm_usr_path:-${rvm_path}/usr} else rvm_error "Can not find ${__lib} in 'pkg-config'" fi done | sort -u } requirements_rvm_pkg_configure() { \typeset -a __packages \typeset __package __target __target="$1" shift __rvm_read_lines __packages <( requirements_rvm_pkg_after_uniqe_paths "$@" ) for __package in "${__packages[@]}" do __rvm_update_configure_opt_dir "$__target" "$__package" done } ## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg <- ## helper for checking marking missing custom packages requirements_rvm_pkg_lib_installed_custom() { while (( $# )) do requirements_rvm_pkg_lib_installed "$1" || packages_custom+=( "$1" ) shift done } ## Real work for installing packages from source install_package() { __rvm_db "${package}_url" "package_url" __rvm_db "${package}_rename_dir" "package_rename_dir" ( __rvm_cd "$rvm_src_path" __rvm_rm_rf "$rvm_src_path/$package-$version" local_file="$package-$version.$archive_format" rvm_log "Fetching $local_file to $rvm_archives_path" "$rvm_scripts_path/fetch" "$package_url/${remote_file:-$local_file}" "$local_file" || return $? __rvm_log_command "$package/extract" "Extracting ${package} to $rvm_src_path/$package-$version" \ __rvm_package_extract "$rvm_archives_path/$local_file" "$rvm_src_path" || case $? in 199) rvm_error "\nUnrecognized archive format '$archive_format'" return 199 ;; *) rvm_error "There has been an error while trying to extract the source. Halting the installation." return 1 ;; esac if [[ -n "${package_rename_dir:-}" ]] then \command \mv "$rvm_src_path/${package_rename_dir}" "$rvm_src_path/$package-$version" fi __rvm_cd "$rvm_src_path/$package-$version" __rvm_add_to_path append /usr/bin if [[ -n "$patches" ]] then for patch in $(echo $patches | \command \tr ',' ' ') do __rvm_log_command "$package/patch" "Applying patch '$patch'..." __rvm_patch -p0 -f -i "$patch" || { \typeset result=$? rvm_error "Patch $patch did not apply cleanly... back to the patching board :(" exit $result } done fi if [[ "${rvm_skip_autoreconf_flag:-0}" == 0 ]] && [[ -f configure.ac || -f configure.in ]] then if (( ${#rvm_autoconf_flags[@]} == 0 )) then case "${_system_type}" in (Windows) rvm_autoconf_flags=( -ivf ) ;; # no symlinks on windows :( (*) rvm_autoconf_flags=( -is --force ) ;; esac fi __rvm_log_command "$package/autoreconf" "Prepare $package in $rvm_src_path/$package-$version." \ __rvm_autoreconf "${rvm_autoconf_flags[@]}" fi [[ -n "${rvm_configure_env[*]}" ]] || rvm_configure_env=() # zsh can assume empty var => ( '' ) (( ${#configure[@]} )) || configure=( ./configure ) configure=( "${rvm_configure_env[@]}" "${configure[@]}" --prefix="${prefix_path:-$rvm_usr_path}" "${rvm_configure_flags[@]}" "${configure_flags[@]}" ) __rvm_log_command "$package/configure" "Configuring $package in $rvm_src_path/$package-$version." \ "${configure[@]}" unset configure_flags configure touch "$rvm_path/config/packages" if [[ "$action" == "uninstall" ]] then __rvm_log_command "$package/make.uninstall" "Uninstalling $package from ${prefix_path:-$rvm_usr_path}" __rvm_make uninstall && __rvm_cd "$rvm_src_path" && __rvm_log_command "$package/rm_src.uninstall" "Removing ${package}-${version} from $rvm_src_path" \ \command \rm -rf "$rvm_src_path/$package-$version" && __rvm_db_ "$rvm_path/config/packages" "${package}" delete else __rvm_log_command "$package/make" "Compiling $package in $rvm_src_path/$package-$version." \ __rvm_make "${rvm_make_flags[@]}" && __rvm_log_command "$package/make.install" "Installing $package to ${prefix_path:-$rvm_usr_path}" \ __rvm_make install && __rvm_db_ "$rvm_path/config/packages" "${package}" "${version}" fi ) __function_on_stack __rvm_install_ruby || rvm_warn " Please note that it's required to reinstall all rubies: rvm reinstall all --force " } package_installed() { \typeset __search_path __lib_file __extension __search_path="${prefix_path:-${rvm_usr_path:-${rvm_path}/usr}}" [[ -f "${__search_path}/include/$1" ]] || return $? # __rvm_detect_system() does not support CYGWIN MINGW! case "${_system_type}" in (Darwin) __extension="dylib" ;; (Windows) __extension="dll" ;; (*) __extension="so" ;; esac __lib_file=$( __rvm_find "${__search_path}" -name "$2.${__extension}" | \command \head -n 1 ) [[ -n "${__lib_file}" ]] || return $? case "${_system_type}" in (Darwin) lipo -info "${__lib_file}" | __rvm_grep "${_system_arch}" >/dev/null || return $? ;; esac } install_readline() { package="readline" ; archive_format="tar.gz" __rvm_update_configure_opt_dir readline "${rvm_usr_path}" configure=( ./configure --disable-dependency-tracking ) version="5.2" patches="$rvm_patches_path/$package-$version/shobj-conf.patch" install_package configure=( ./configure --disable-dependency-tracking ) version="6.2" patches="$rvm_patches_path/$package-$version/patch-shobj-conf.diff" install_package } readline_installed() { package_installed "readline/readline.h" "libreadline" || return $? } install_iconv() { package="libiconv" ; version=1.13.1 ; archive_format="tar.gz" install_package } install_curl() { package="curl" ; version=7.19.7 ; archive_format="tar.gz" install_package } install_openssl() { \typeset -a openssl_use_asm package="openssl" ; archive_format="tar.gz" openssl_use_asm=( "no-asm" ) __rvm_db "${package}_version" "version" if [[ "Darwin" == "${_system_type}" ]] then configure=( "./Configure" ) if (( ${#rvm_architectures[@]} > 0 )) then if __rvm_string_match "${rvm_architectures[*]}" "64" then hw_cpu64bit=1 fi if __rvm_string_match "${rvm_architectures[*]}" "ppc" then hw_machine="Power Macintosh" fi else hw_machine=$(sysctl hw.machine | __rvm_awk -F: '{print $2}' | __rvm_sed 's/^ //') hw_cpu64bit=$(sysctl hw.cpu64bit_capable | __rvm_awk '{print $2}') fi if [[ "Power Macintosh" == "$hw_machine" ]] then if [[ $hw_cpu64bit == 1 ]] then configure+=( "darwin64-ppc-cc" ) else configure+=( "darwin-ppc-cc" ) fi else if [[ $hw_cpu64bit == 1 ]] then configure+=( "darwin64-x86_64-cc" ) openssl_use_asm=() else configure+=( "darwin-i386-cc" ) fi fi else configure=( "./config" ) if __rvm_compiler_version_or_higher "4.6" then openssl_use_asm=() fi fi configure+=( -I$rvm_usr_path/include -L$rvm_usr_path/lib zlib "${openssl_use_asm[@]}" no-krb5 ) install_package __rvm_log_command openssl.certs "Updating openssl certificates" update_openssl_certs } update_openssl_certs() ( __rvm_cd "$rvm_usr_path/ssl" && __rvm_curl https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt -o cert.pem || __rvm_curl https://curl.haxx.se/ca/cacert.pem -o cert.pem ) openssl_installed() { package_installed "openssl/opensslv.h" "libssl" || return $? } install_zlib() { package="zlib" ; version="1.2.7" ; archive_format="tar.gz" install_package } install_autoconf() { package="autoconf" ; version="2.65" ; archive_format="tar.gz" prefix_path="$rvm_usr_path" install_package } install_ncurses() { package="ncurses" ; version="5.7" ; archive_format="tar.gz" configure_flags=( --disable-rpath --without-debug --without-ada --enable-safe-sprintf --enable-sigwinch --without-progs ) install_package } install_pkgconfig() { package="pkg-config" ; version="0.23" archive_format="tar.gz" install_package } install_gettext() { package="gettext" ; version="0.17" ; archive_format="tar.gz" install_package } install_libxml() { install_libxml2 "$@" } install_libxml2() { package="libxml2" ; version="2.7.3" ; archive_format="tar.gz" if [[ "Darwin" == "${_system_type}" ]] then configure=( ./configure --build=i686-apple-darwin$(command uname -r) --host=i686-apple-darwin$(command uname -r) ) fi install_package unset prefix_path } install_libxslt() { package="libxslt" ; version="1.1.26" ; archive_format="tar.gz" configure_flags=( --with-libxml-prefix="$rvm_usr_path" ) if [[ "SunOS" == "${_system_type}" ]] then patches="$rvm_patches_path/$package-$version/solaris.patch" fi install_package unset prefix_path } install_yaml() { install_libyaml "$@" } install_libyaml() { package="yaml" ; archive_format="tar.gz" __rvm_db "${package}_version" "version" install_package } libyaml_installed() { package_installed "yaml.h" "libyaml" } install_glib() { ( install_pkgconfig; ) ( install_gettext; ) package="glib" ; version="2.23.1" ; archive_format="tar.gz" __rvm_update_configure_env CC="cc" \ CFLAGS="-I${rvm_usr_path}/include" \ LDFLAGS="-L${rvm_usr_path}/lib" \ PKG_CONFIG="$rvm_usr_path/bin/pkg-config" install_package } install_mono() { ( install_glib; ) __rvm_mono_env package="mono" ; version="2.6.1" ; archive_format="tar.bz2" install_package } install_llvm() { package="llvm" version="89156" ( __rvm_cd $rvm_src_path if [[ ! -d "$rvm_src_path/llvm/.svn" ]] ; then __rvm_db "${package}_url" "package_url" __rvm_rm_rf "$rvm_src_path/llvm" svn co -r "$version" "$package_url" llvm __rvm_cd "$rvm_src_path/llvm" ./configure --enable-bindings=none UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make -j2 __rvm_try_sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make install fi ) } install_epel() { mv="${_system_version%%.*}" if [[ "${_system_name}" == "CentOS" ]] && [[ -f /etc/yum.repos.d/epel.repo ]] ; then __rvm_db "epel${mv}_key" "epel_key" __rvm_db "epel${mv}_rpm" "epel_rpm" "${rvm_scripts_path}/fetch" "${epel_key}" "${rvm_scripts_path}/fetch" "${epel_rpm}" __rvm_try_sudo rpm --import "${rvm_archives_path}/${epel_key##*/}" __rvm_try_sudo rpm --quiet -i "${rvm_archives_path}/${epel_rpm##*/}" fi }