#!/垃圾箱/sh-e##堆栈安装脚本。##此脚本用于通过以下方式快速轻松安装:#'卷曲-sSLhttps://get.haskellstack.org/|sh'#或:#'wget-qO-https://get.haskellstack.org网址/|第页'##默认情况下,这会将“stack”安装到“/usr/local/bin”。##参数(使用`…|sh-s-Arguments`)##-q:减少脚本的输出#-f:即使已安装“stack”,也强制覆盖#-d DESTDIR:更改目标目录##在以下位置发出拉取请求:# https://github.com/commercialhaskell/stack/blob/master/etc/scripts/get-stack.sh##请注意,此脚本将使用“sudo”请求root访问权限,以便使用#您平台的包管理器,用于安装依赖项并安装到#`/usr/local/bin`。如果您更喜欢控制,请按照手册操作#平台的安装说明:# https://docs.haskellstack.org/en/stable/install_and_upgrade/#HOME_LOCAL_BIN=“$HOME/.LOCAL/BIN”DEFAULT_DEST=“/usr/local/bin/stack”#Windows没有一个适合DEST的位置,但所有CI系统(Appveyor、Travis、Azure)都支持/binDEFAULT_DEST_WINDOWS=“/bin/stack”目的地=“”安静=“”力=“”堆栈_TEMP_DIR=#创建一个临时目录,该目录将被自动清理#脚本完成时make_temp_dir(){STACK_TEMP_DIR=“$(mktemp-d 2>/dev/null||mktemp-d-t STACK)”}#如果临时目录已创建,请将其清除。自动调用#脚本退出时。清除temp_dir(){如果[-n“$STACK_TEMP_DIR”];然后rm-rf“$STACK_TEMP_DIR”堆栈_TEMP_DIR=fi(菲涅耳)}#将消息打印到stderr,然后退出并返回错误代码死亡(){echo“$@”>&2出口1}#除非'-q'传递给脚本,否则将消息打印到stdout信息(){如果[-z“$QUIET”];然后echo“$@”fi(菲涅耳)}#打印安装后消息的分隔符安装后分离器(){信息“”信息“--------------------------------------------------------------------------------”信息“”}#确定CPU的指令集体系结构(ISA)获取_ isa(){如果uname-m | grep-等式“armv[78]l?”;然后回声臂elif uname-m | grep-q aarch64;然后echo aarch64#uname-m在macOS/AArch64上返回arm64elif uname-m | grep-q arm64;然后echo aarch64elif uname-m | grep-q x86;然后echo x86其他的die“$(uname-m)不是受支持的指令集”fi(菲涅耳)}##如果如上所述检测到arm ISA,则退出并返回代码0#is_arm(){#测试“$(get_isa)”=arm# }##如果如上所述检测到aarch64 ISA,则退出并返回代码0is_arch64(){测试“$(get_isa)”=aarch64}#确定64或32位体系结构#如果getconf可用,它将根据需要返回操作系统的arch#如果没有,它将使用uname获取CPU的拱形结构,尽管安装了#64位CPU上的操作系统可以是32位获取_搜索(){如果has_getconf;然后如果getconf LONG_BIT | grep-q 64;然后回波64其他的回波32fi(菲涅耳)其他的案例“$(uname-m)”in*64)回波64;;*)回波32;;欧洲安全理事会fi(菲涅耳)}#如果如上所述检测到x86_64位体系结构,则退出并返回代码0is_x86_64(){测试“$(get_arch)”=64-a“$(get_isa)”=“x86”}#打印通用绑定列表通知打印_未发送_通知(){如果[-z“$1”];然后信息“”info“使用通用绑定列表…”信息“”其他的信息“”info“使用通用$1 bindist…”信息“”fi(菲涅耳)}#如果可以使用sudo执行给定命令,则添加“sudo”前缀#如果不是,则按原样运行给定命令#请求root权限时,始终显示该命令,切勿重复使用缓存的凭据。sudocmd(){原因=“1美元”;转移如果命令-v sudo>/dev/null;然后回声echo“将使用'sudo'以root身份运行以下命令:”echo“$@”echo“为了$reason。”回声#-k:禁用缓存的凭据(强制提示输入密码)。sudo-k“$@”其他的"$@"fi(菲涅耳)}#为使用Apt的发行版安装依赖项适配安装依赖项(){info“正在安装依赖项…”信息“”apt_get_install_pkgs“$@”}#如果可能的话,尝试通过apt在Ubuntu上安装#预期版本(采用主版本.次版本格式,删除所有次版本)#作为第一个也是唯一的论点#如果Ubuntu版本不受支持,它会尝试复制二进制文件#并显式安装必要的依赖项。do_ubuntu安装(){安装依赖项(){apt_install_dependencies g++gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg netbase}#如果is_arm;然后#安装依赖项#打印_未发送_通知#install_arm_linux_binary程序如果是_x86 _64;然后安装依赖项打印_未发送_通知安装_x86_64_二进制elif is_arch64;然后安装依赖项打印_未发送_通知安装存档64_二进制其他的die“对不起,目前只有64位(x86_64或aarch64)Linux二进制文件可用。”#安装依赖项#打印_未发送_通知#安装_i386_二进制fi(菲涅耳)}#尝试在Debian上安装。#期望将单数版本作为第一个也是唯一的参数#如果Debian的版本不受支持,它会尝试复制二进制文件#并显式安装必要的依赖项。do_debian_安装(){安装依赖项(){apt_install_dependencies g++gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg netbase}#如果is_arm;然后#安装依赖项#打印_未发送_通知#安装arm_linux_binary如果是_x86 _64;然后安装依赖项打印_故障_通知install_x86_64_linux_binary安装_x86_64_linux_binaryelif is_arch64;然后安装依赖项打印_未发送_通知安装存档64_二进制其他的die“对不起,目前只有64位(x86_64或aarch64)Linux二进制文件可用。”#安装依赖项#打印_未发送_通知#安装_i386_二进制fi(菲涅耳)}#尝试在Fedora上安装。#期望将单数版本作为第一个也是唯一的参数#如果Fedora的版本不受支持,它会尝试复制二进制文件#并显式安装必要的依赖项。do_fedora_install(){安装依赖项(){dnf-install_pkgs perl-make automake gcc gcc-c++gmp-devel libffi zlib-devel xz tar git gnupg}如果是_x86 _64;然后安装依赖项“$1”打印_未发送_通知安装_x86_64_二进制其他的die“对不起,目前只有64位(x86_64)Linux二进制文件可用。”#安装依赖项“$1”#打印_未发送_通知#安装_i386_二进制fi(菲涅耳)}#尝试在CentOS上安装。#期望将单数版本作为第一个也是唯一的参数#如果CentOS的版本不受支持,它会尝试复制二进制文件#并显式安装必要的依赖项。do_centos_install(){安装依赖项(){yuminstall_pkgs perl使自动生成gcc gcc-c++gmp-devel libffi zlib xz tar git gnupg}如果是_x86 _64;然后安装依赖项打印_未发送_通知安装_x86_64_二进制其他的die“对不起,目前只有64位(x86_64)Linux二进制文件可用。”#案例“$1”in#“6”*)#die“对不起,目前没有可用的Linux 32位gmp4二进制文件。”# ;;# *)#安装依赖项#打印_未发送_通知#安装_i386_二进制# ;;#欧洲安全理事会fi(菲涅耳)}#尝试在Windows上安装,为CI脚本设计(在Appveyor、Travis、Azure上测试)do_windows_install(){info“使用Windows安装…”信息“”生成模板目录dl_to_file“https://get.haskellstack.org/stable/windows-x86_64.zip“”$STACK_TEMP_DIR/STACK.zip“if[“$(basename$DEST)”!=“stack”];然后#应该永远不会发生,-d标志会附加堆栈本身die“当前目标在Windows上必须始终以“stack”结尾,got:$DEST”fi(菲涅耳)如果!7z x$STACK_TEMP_DIR/STACK.zip STACK.exe“-o$(目录名$DEST)”-y;然后die“解压缩zip文件失败,您可能没有安装7z”fi(菲涅耳)安装后分离器info“堆栈已安装到:$DEST”信息“”检查路径的起始位置}#尝试在macOS上安装。do_osx安装(){如果是_x86 _64;然后安装_x86_64_osx二进制info“注意:您可能需要运行'xcode-select--install'和/或”info“'打开/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg'”info“设置Stack使用的Xcode命令行工具。”信息“”elif is_arch64;然后安装架构64_osx_binaryinfo“注意:您可能需要运行'xcode-select--install'和/或”info“'open/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg'”info”来设置Stack使用的Xcode命令行工具信息“”其他的die“对不起,目前只有64位(x86_64或aarch64)macOS二进制文件可用。”fi(菲涅耳)}##尝试在FreeBSD上安装。使用安装依赖项##“pkg安装”,然后下载bindist。#do_freebsd_install(){#安装依赖项(){#pkg_install_pkgs-devel/gmake perl5 lang/gcc-misc/compat8x-misc/compat9x转换器/libiconv ca_root_nss# }#如果是_64位;然后#安装依赖项#安装_64bit_freebsd_binary#其他#die“对不起,目前没有32位FreeBSD二进制文件可用。”#fi(菲涅耳)# }#Alpine发行版安装do_alpine安装(){安装依赖项(){apk安装pkgs gmp libgcc xz make}安装依赖项如果是_x86 _64;然后打印_未发送_通知安装_x86_64_二进制其他的die“对不起,目前只有64位(x86_64)Alpine Linux二进制文件可用。”fi(菲涅耳)}#尝试通过下载在不受支持的Linux发行版上安装#装订本。do_sloppy安装(){info“此安装程序不支持您的Linux发行版,正在尝试通用”info“绑定列表…”信息“”#如果is_arm;然后#安装arm_linux_binary如果是_x86 _64;然后安装_x86_64_二进制elif is_arch64;然后安装存档64_二进制其他的die“对不起,目前只有64位(x86_64或aarch64)Linux二进制文件可用。”#install_i386_linux_binary安装_i386_linux_binaryfi(菲涅耳)info“由于此安装程序不支持您的Linux发行版,”info“不能保证‘stack’会起作用!你可以”info“需要为GHC手动安装一些系统信息依赖项:”信息“gcc、make、libffi、zlib、libgmp和libtinfo”info“请参阅http://docs.haskellstack.org/en/stable/install_and_upgrade/"info“欢迎请求添加对该发行版的支持!”信息“”}#尝试确定正在运行的Linux发行版。#打印“DISTRO;VERSION”(分发名称和版本)“。”分发信息(){parse_lsb(){lsb_release-a 2>/dev/null|perl-ne“$1”}try_lsb(){如果has_lsb_release;然后TL_DIST=“$(parse_lsb'if(/Distributor ID:\s+([^]+)/){print“\L$1”;}')”TL_VERSION=“$(parse_lsb'if(/Release:\s+([^]+)/){print“\L$1”;}')”echo“$TL_DIST;$TL_VERSION”其他的返回1fi(菲涅耳)}try_release(){解析释放(){perl-ne“$1”/etc/*release 2>/dev/null}parse_release_id(){parse_release'如果(/^(DISTRIB_)?ID\s*=\s*“?([^”]+)/){print“\L$2”;退出0;}'}parse_release_version(){parse_release'如果(/^(DISTRIB_release|VERSION_ID)\s*=\s*“?([^”]+)/){print$2;exit 0;}'}TR_RELEASE=“$(parse_RELEASE_id);$(parse _RELEASE _version)”如果[“;”=“$TR_RELEASE”];然后如果[-e/etc/arch-release];然后#/etc/arch-relese存在,但通常为空echo“拱门;”elif[-e/etc/centos-release]&&grep-q“\<6\>”/etc/cintos-relese;然后#/etc/centos-relese在版本7之前具有非标准格式echo“centos;6”其他的返回1fi(菲涅耳)其他的echo“$TR_RELEASE”fi(菲涅耳)}尝试发布(){case“$(cat/etc/issue 2>/dev/null)”in“Arch Linux”*)echo“arch;”#n.b.版本在arch上的/etc/issue中不可用;;“Ubuntu”*)echo“ubuntu;$(perl-ne'if(/ubuntu(\d+\.\d+)/){print$1;}'</etc/issue)”;;“Debian”*)echo“debian;$(perl-ne'if(/debian GNU\/Linux(\d+(\.\d+)?)/){print$1;}'</etc/issue)”;;*“SUSE”*)echo“suse;$(perl-ne'如果(/suse\b.*(\d+\.\d+)/){print$1;}'</etc/issue)”;;*“NixOS”*)echo“nixos;$(perl-ne'如果(/nixos(\d+\.\d+)/){print$1;}'</etc/issue)”;;“CentOS”*)echo“centos;$(perl-ne'if(/^centos发行版(\d+)\./){print$1;}'</etc/sissue)”;;*)欧洲安全理事会#其他人不输出有问题的有用信息,返回空}try_lsb||try_release||try发布}#尝试在Linux发行版上安装do_distro(){如果!has_perl;然后如果!try_install_pkgs-perl;然后#TODO:删除对默认情况下未安装的“perl”的依赖#在一些发行版上(特别是Fedora和RHEL)。die“此脚本需要'perl',请安装它以继续。”fi(菲涅耳)fi(菲涅耳)IFS=“;”读取-r DISTRO版本</dev/null;然后如果!sudocmd“创建目标目录”mkdir-p“$destdir”;然后die“无法创建目录:$DEST”fi(菲涅耳)fi(菲涅耳)fi(菲涅耳)#首先尝试以当前用户身份安装“stack”,如果失败,请尝试使用sudoinfo“正在将堆栈安装到:$DEST…”如果!安装-c-m 0755“$STACK_TEMP_EXE”“$destdir”2>/dev/null;然后如果!sudocmd“将‘stack’复制到目标目录”install-c-o 0-g 0-m 0755“$stack_TEMP_EXE”“$destdir”;然后die“安装到$DEST失败”fi(菲涅耳)fi(菲涅耳)安装后分离器info“堆栈已安装到:$DEST”信息“”检查路径的起始位置}#安装arm_linux_binary(){#install_from_blunt“linux-arm.tar.gz”#}##安装_i386_linux_binary(){#install_from_blunt“linux-i386.tar.gz”#}安装_x86_64_linux_binary(){install_from_blunt“linux-x86_64.tar.gz”}安装arch64_linux_binary(){install_from_buildit“linux-arch64.tar.gz”}安装架构64_osx_binary(){install_from_blunt“osx-aarch64.tar.gz”}安装_x86_64_osx_binary(){install_from_blunt“osx-x86_64.tar.gz”}#安装64位freebsd_binary(){#install_from_blunt“免费bsd-x86_64.tar.gz”#}#尝试使用apt-get、dnf、yum或apk中的任意一个安装包#可用。try_install_pkgs(){如果has_apt_get;然后apt_get_install_pkgs“$@”elif has_dnf;然后dnf_install_pkgs“$@”elif has_yum;然后yum_install_pkgs“$@”elif has _ apk;然后apk安装包“$@”其他的返回1fi(菲涅耳)}#使用apt-get安装软件包apt_get_install_pkgs(){缺少=pkg(单位:美元);如果!dpkg-s$pkg 2>/dev/null|grep'^状态:.*已安装'>/dev/null;然后missing=“$missing$pkg”fi(菲涅耳)完成如果[“$missing”=“”];然后info“已安装!”埃利夫!sudocmd“安装所需的系统依赖项”apt-get-install-y${QUIET:+-qq}$missing;然后die“\n安装apt包失败。请运行apt-get update并重试。”fi(菲涅耳)}#使用dnf安装包dnf _安装_包装(){如果!sudocmd“install required system dependencies”dnf安装-y${QUIET:+-q}“$@”;然后die“\n安装dnf包失败。请运行“dnf检查更新”,然后重试。”fi(菲涅耳)}#使用yum安装包yum_install_pkgs(){如果!sudocmd“install-required-system-dependencies”yum install-y${QUIET:+-q}“$@”;然后die“\n安装yum包失败。请运行‘yum check-update’并重试。”fi(菲涅耳)}#使用apk安装包apk安装包(){如果!sudocmd“安装所需的系统依赖项”apk add--update${QUIET:+-q}“$@”;然后die“\n安装apk包失败。请运行'apk update'并重试。”fi(菲涅耳)}#使用pkg安装软件包包装_安装_包装(){如果!sudocmd“安装所需的系统依赖项”pkg install-y“$@”;然后die“\n安装pkg包失败。请运行“pkg update”并重试。”fi(菲涅耳)}#获取已安装的Stack版本(如果有)安装堆栈版本(){stack--版本|grep-o'版本\([[:数字:]]\|\.\)\+'|tr A-Z A-Z}#获取已安装Stack的路径堆栈_位置(){命令-v堆栈}#检查“stack”命令是否存在has_stack(){如果[“$DEST”!=“”];然后has_cmd“$目的地”其他的has_cmd堆栈fi(菲涅耳)}#检查“wget”命令是否存在has_wget(){has_cmd工作组}#检查“curl”命令是否存在has_curl(){has_cmd卷曲}#检查“lsb_release”命令是否存在has_lsb_release(){has_cmd lsb版本}#检查“sudo”命令是否存在has_sudo(){has_cmd苏多}#检查“getconf”命令是否存在has_getconf(){has_cmd获取配置文件}#检查“brew”命令是否存在#has_brew(){#has_cmd酿造#}#检查“perl”命令是否存在has_perl(){has_cmd perl}#检查“apt-get”命令是否存在has_apt_get(){has_cmd适配器}#检查“yum”命令是否存在has_yum(){has_cmd yum}#检查“apk”命令是否存在has_apk(){has_cmd apk}#检查'dnf'命令是否存在has_dnf(){has_cmd-dnf}#检查给定命令是否存在has_cmd(){命令-v“$1”>/dev/null 2>&1}#检查给定路径是否列在path环境变量中打开路径(_path){echo“:$PATH:”|grep-q:“$1”:}#检查~/.local/bin是否在PATH上,如果不在,则打印警告。检查home_local_bin_on_path(){如果!on_path“$HOME_LOCAL_BIN”;然后#TODO:提供给用户添加它(欢迎拉请求!)info“警告:'$HOME_LOCAL_BIN'不在您的路径上。”info“堆栈将把它构建的二进制文件放在'$HOME_LOCAL_BIN'中,所以”info“为了获得最佳结果,请将其添加到个人资料中PATH的开头。”信息“”fi(菲涅耳)}#检查$DEST是否在PATH上,如果不在,则打印警告。检查路径(){如果!on_path“$(目录名$DEST)”;然后info“警告:“$(目录名$DEST)”不在您的路径上。”信息“”fi(菲涅耳)}#检查Stack是否已安装,如果已安装,则打印错误。检查堆栈安装(){如果has_stack;然后如果[“$FORCE”=“true”];然后[“$DEST”!=“”]||DEST=“$(stack_location)”其他的如果has_curl;然后get=“curl-sSL”其他的get=“wget-qO-”fi(菲涅耳)[“$DEST”!=“”]&&location=$(realpath“$DESS”)||location==$(stack_location)die“Stack$(installed_Stack_version)似乎已经安装在:$位置使用“堆栈升级”或操作系统的包管理器进行升级,或将“-f”传递给此脚本以覆盖现有二进制文件,例如:$获得https://get.haskellstack.org网址/|sh-s-f要安装到其他位置,请传递“-d DESTDIR”,例如:$获得https://get.haskellstack.org网址/|sh-s--d/opt/stack/bin“fi(菲涅耳)fi(菲涅耳)}陷阱清理_temp_dir退出而[$#-gt 0];案例“$1”in-q |--安静)#这会尽量通过抑制脚本本身来减少输出#消息并将“安静”参数传递给支持它们的工具。QUIET=“真”转移;;-f |--力)FORCE=“true”转移;;-d |--目标)DEST=“$2/stack”第2班;;*)echo“无效参数:$1”>&2出口1;;欧洲航天局完成检查堆栈已安装do(_O)检查home_local_bin_on_path