From 67ebf8abdf3323d3201691a21c7d5ddda73bd9cf Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 1 Mar 2014 21:38:13 -0800 Subject: [PATCH] mk: dist-installer builds a binary installer --- mk/dist.mk | 22 ++++ src/etc/install.sh | 264 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 src/etc/install.sh diff --git a/mk/dist.mk b/mk/dist.mk index 17afeaae377..b5fd9d1b229 100644 --- a/mk/dist.mk +++ b/mk/dist.mk @@ -71,6 +71,7 @@ dist-prepare-win: PREPARE_DIR_CMD=$(DEFAULT_PREPARE_DIR_CMD) dist-prepare-win: PREPARE_BIN_CMD=$(DEFAULT_PREPARE_BIN_CMD) dist-prepare-win: PREPARE_LIB_CMD=$(DEFAULT_PREPARE_LIB_CMD) dist-prepare-win: PREPARE_MAN_CMD=$(DEFAULT_PREPARE_MAN_CMD) +dist-prepare-win: PREPARE_CLEAN=true dist-prepare-win: prepare-base endif @@ -156,3 +157,24 @@ distcheck-osx: $(PKG_OSX) @echo ----------------------------------------------- endif + +dist-installer: $(foreach host,$(CFG_HOST),dist-installer-$(host)) + +define DEF_INSTALLER +dist-installer-$(1): PREPARE_HOST=$(1) +dist-installer-$(1): PREPARE_TARGETS=$(1) +dist-installer-$(1): PREPARE_STAGE=2 +dist-installer-$(1): PREPARE_DEST_DIR=tmp/dist/installer-$(1) +dist-installer-$(1): PREPARE_DIR_CMD=$(DEFAULT_PREPARE_DIR_CMD) +dist-installer-$(1): PREPARE_BIN_CMD=$(DEFAULT_PREPARE_BIN_CMD) +dist-installer-$(1): PREPARE_LIB_CMD=$(DEFAULT_PREPARE_LIB_CMD) +dist-installer-$(1): PREPARE_MAN_CMD=$(DEFAULT_PREPARE_MAN_CMD) +dist-installer-$(1): PREPARE_CLEAN=true +dist-installer-$(1): prepare-base + $$(Q)(cd $$(PREPARE_DEST_DIR)/ && find -type f) \ + > $$(PREPARE_DEST_DIR)/$$(CFG_LIBDIR_RELATIVE)/$$(CFG_RUSTLIBDIR)/manifest + $$(Q)cp $$(S)src/etc/install.sh $$(PREPARE_DEST_DIR) +endef + +$(foreach host,$(CFG_HOST),\ + $(eval $(call DEF_INSTALLER,$(host)))) diff --git a/src/etc/install.sh b/src/etc/install.sh new file mode 100644 index 00000000000..28e97195973 --- /dev/null +++ b/src/etc/install.sh @@ -0,0 +1,264 @@ +#!/bin/sh +# Copyright 2014 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 or the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +msg() { + echo "install: $1" +} + +step_msg() { + msg + msg "$1" + msg +} + +warn() { + echo "install: WARNING: $1" +} + +err() { + echo "install: error: $1" + exit 1 +} + +need_ok() { + if [ $? -ne 0 ] + then + err "$1" + fi +} + +putvar() { + local T + eval T=\$$1 + eval TLEN=\${#$1} + if [ $TLEN -gt 35 ] + then + printf "install: %-20s := %.35s ...\n" $1 "$T" + else + printf "install: %-20s := %s %s\n" $1 "$T" "$2" + fi + printf "%-20s := %s\n" $1 "$T" >>config.tmp +} + +valopt() { + VAL_OPTIONS="$VAL_OPTIONS $1" + + local OP=$1 + local DEFAULT=$2 + shift + shift + local DOC="$*" + if [ $HELP -eq 0 ] + then + local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_') + local V="CFG_${UOP}" + eval $V="$DEFAULT" + for arg in $CFG_ARGS + do + if echo "$arg" | grep -q -- "--$OP=" + then + val=$(echo "$arg" | cut -f2 -d=) + eval $V=$val + fi + done + putvar $V + else + if [ -z "$DEFAULT" ] + then + DEFAULT="" + fi + OP="${OP}=[${DEFAULT}]" + printf " --%-30s %s\n" "$OP" "$DOC" + fi +} + +opt() { + BOOL_OPTIONS="$BOOL_OPTIONS $1" + + local OP=$1 + local DEFAULT=$2 + shift + shift + local DOC="$*" + local FLAG="" + + if [ $DEFAULT -eq 0 ] + then + FLAG="enable" + else + FLAG="disable" + DOC="don't $DOC" + fi + + if [ $HELP -eq 0 ] + then + for arg in $CFG_ARGS + do + if [ "$arg" = "--${FLAG}-${OP}" ] + then + OP=$(echo $OP | tr 'a-z-' 'A-Z_') + FLAG=$(echo $FLAG | tr 'a-z' 'A-Z') + local V="CFG_${FLAG}_${OP}" + eval $V=1 + putvar $V + fi + done + else + if [ ! -z "$META" ] + then + OP="$OP=<$META>" + fi + printf " --%-30s %s\n" "$FLAG-$OP" "$DOC" + fi +} + +flag() { + BOOL_OPTIONS="$BOOL_OPTIONS $1" + + local OP=$1 + shift + local DOC="$*" + + if [ $HELP -eq 0 ] + then + for arg in $CFG_ARGS + do + if [ "$arg" = "--${OP}" ] + then + OP=$(echo $OP | tr 'a-z-' 'A-Z_') + local V="CFG_${OP}" + eval $V=1 + putvar $V + fi + done + else + if [ ! -z "$META" ] + then + OP="$OP=<$META>" + fi + printf " --%-30s %s\n" "$OP" "$DOC" + fi +} + +validate_opt () { + for arg in $CFG_ARGS + do + isArgValid=0 + for option in $BOOL_OPTIONS + do + if test --disable-$option = $arg + then + isArgValid=1 + fi + if test --enable-$option = $arg + then + isArgValid=1 + fi + if test --$option = $arg + then + isArgValid=1 + fi + done + for option in $VAL_OPTIONS + do + if echo "$arg" | grep -q -- "--$option=" + then + isArgValid=1 + fi + done + if [ "$arg" = "--help" ] + then + echo + echo "No more help available for Configure options," + echo "check the Wiki or join our IRC channel" + break + else + if test $isArgValid -eq 0 + then + err "Option '$arg' is not recognized" + fi + fi + done +} + +CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/" +CFG_SELF="$0" +CFG_ARGS="$@" + +HELP=0 +if [ "$1" = "--help" ] +then + HELP=1 + shift + echo + echo "Usage: $CFG_SELF [options]" + echo + echo "Options:" + echo +else + step_msg "processing $CFG_SELF args" +fi + +OPTIONS="" +BOOL_OPTIONS="" +VAL_OPTIONS="" + +flag uninstall "only uninstall from the installation prefix" +valopt prefix "/usr/local" "set installation prefix" + +if [ $HELP -eq 1 ] +then + echo + exit 0 +fi + +step_msg "validating $CFG_SELF args" +validate_opt + +# First, uninstall from the installation prefix +# FIXME: Hardcoded 'rustlib' ignores CFG_RUSTLIBDIR +if [ -f "${CFG_PREFIX}/lib/rustlib/manifest" ] +then + while read p; do + msg "uninstall ${CFG_PREFIX}/$p" + rm "${CFG_PREFIX}/$p" + need_ok "failed to remove file" + done < "${CFG_PREFIX}/lib/rustlib/manifest" + + # Remove 'rustlib' directory + msg "uninstall ${CFG_PREFIX}/lib/rustlib" + rm -r "${CFG_PREFIX}/lib/rustlib" + need_ok "failed to remove rustlib" +fi + +# If we're only uninstalling then exit +if [ -n "${CFG_UNINSTALL}" ] +then + exit 0 +fi + +# Iterate through the new manifest and install files +while read p; do + + umask 022 && mkdir -p "${CFG_PREFIX}/$(dirname $p)" + need_ok "directory creation failed" + + msg "${CFG_PREFIX}/$p" + if echo "$p" | grep "/bin/" > /dev/null + then + install -m755 "${CFG_SRC_DIR}/$p" "${CFG_PREFIX}/$p" + else + install -m644 "${CFG_SRC_DIR}/$p" "${CFG_PREFIX}/$p" + fi + need_ok "file creation failed" + +# The manifest lists all files to install +done < "${CFG_SRC_DIR}/lib/rustlib/manifest"