Fix initialising the workspace:
author"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jan 12 18:57:45 2009 +0000 (2009-01-12)
changeset 11350469ad99098f
parent 1134 becbbc7f5b72
child 1136 9df0e560ec14
Fix initialising the workspace:
- don't remove directories in the background:
- it is highly dangerous
- it can lead to data loss in case of frequent stop/restart with a slow disk
- log actions with CT_DoExecLog as much as possible, instead of using |CT_DoLog

/trunk/scripts/crosstool.sh | 100 43 57 0 ++++++++++++++++++++++-----------------------------
1 file changed, 43 insertions(+), 57 deletions(-)
scripts/crosstool.sh
     1.1 --- a/scripts/crosstool.sh	Mon Jan 12 18:54:34 2009 +0000
     1.2 +++ b/scripts/crosstool.sh	Mon Jan 12 18:57:45 2009 +0000
     1.3 @@ -141,9 +141,7 @@
     1.4  
     1.5  # Ah! The build directory shall be eradicated, even if we restart!
     1.6  if [ -d "${CT_BUILD_DIR}" ]; then
     1.7 -    mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
     1.8 -    chmod -R u+w "${CT_BUILD_DIR}.$$"
     1.9 -    setsid nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
    1.10 +    CT_DoExecLog ALL rm -rf "${CT_BUILD_DIR}"
    1.11  fi
    1.12  
    1.13  # Don't eradicate directories if we need to restart
    1.14 @@ -152,50 +150,40 @@
    1.15      # We need to do that _before_ we can safely log, because the log file will
    1.16      # most probably be in the toolchain directory.
    1.17      if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
    1.18 -        mv "${CT_TARBALLS_DIR}" "${CT_TARBALLS_DIR}.$$"
    1.19 -        chmod -R u+w "${CT_TARBALLS_DIR}.$$"
    1.20 -        setsid nohup rm -rf "${CT_TARBALLS_DIR}.$$" >/dev/null 2>&1 &
    1.21 +        CT_DoExecLog ALL rm -rf "${CT_TARBALLS_DIR}"
    1.22      fi
    1.23      if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
    1.24 -        mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.$$"
    1.25 -        chmod -R u+w "${CT_SRC_DIR}.$$"
    1.26 -        setsid nohup rm -rf "${CT_SRC_DIR}.$$" >/dev/null 2>&1 &
    1.27 +        CT_DoExecLog ALL rm -rf "${CT_SRC_DIR}"
    1.28      fi
    1.29      if [ -d "${CT_INSTALL_DIR}" ]; then
    1.30 -        mv "${CT_INSTALL_DIR}" "${CT_INSTALL_DIR}.$$"
    1.31 -        chmod -R u+w "${CT_INSTALL_DIR}.$$"
    1.32 -        setsid nohup rm -rf "${CT_INSTALL_DIR}.$$" >/dev/null 2>&1 &
    1.33 +        CT_DoExecLog ALL rm -rf "${CT_INSTALL_DIR}"
    1.34      fi
    1.35      if [ -d "${CT_DEBUG_INSTALL_DIR}" ]; then
    1.36 -        mv "${CT_DEBUG_INSTALL_DIR}" "${CT_DEBUG_INSTALL_DIR}.$$"
    1.37 -        chmod -R u+w "${CT_DEBUG_INSTALL_DIR}.$$"
    1.38 -        setsid nohup rm -rf "${CT_DEBUG_INSTALL_DIR}.$$" >/dev/null 2>&1 &
    1.39 +        CT_DoExecLog ALL rm -rf "${CT_DEBUG_INSTALL_DIR}"
    1.40      fi
    1.41      # In case we start anew, get rid of the previously saved state directory
    1.42      if [ -d "${CT_STATE_DIR}" ]; then
    1.43 -        mv "${CT_STATE_DIR}" "${CT_STATE_DIR}.$$"
    1.44 -        chmod -R u+w "${CT_STATE_DIR}.$$"
    1.45 -        setsid nohup rm -rf "${CT_STATE_DIR}.$$" >/dev/null 2>&1 &
    1.46 +        CT_DoExecLog ALL rm -rf "${CT_STATE_DIR}"
    1.47      fi
    1.48  fi
    1.49  
    1.50  # Create the directories we'll use, even if restarting: it does no harm to
    1.51  # create already existent directories, and CT_BUILD_DIR needs to be created
    1.52  # anyway
    1.53 -mkdir -p "${CT_TARBALLS_DIR}"
    1.54 -mkdir -p "${CT_SRC_DIR}"
    1.55 -mkdir -p "${CT_BUILD_DIR}"
    1.56 -mkdir -p "${CT_INSTALL_DIR}"
    1.57 -mkdir -p "${CT_PREFIX_DIR}"
    1.58 -mkdir -p "${CT_DEBUG_INSTALL_DIR}"
    1.59 -mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
    1.60 -mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
    1.61 -mkdir -p "${CT_STATE_DIR}"
    1.62 +CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
    1.63 +CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
    1.64 +CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
    1.65 +CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
    1.66 +CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
    1.67 +CT_DoExecLog ALL mkdir -p "${CT_DEBUG_INSTALL_DIR}"
    1.68 +CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
    1.69 +CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
    1.70 +CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}"
    1.71  
    1.72  # Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
    1.73  # the previous build was successful. To be able to move the logfile there,
    1.74  # switch them back to read/write
    1.75 -chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
    1.76 +CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
    1.77  
    1.78  # Redirect log to the actual log file now we can
    1.79  # It's quite understandable that the log file will be installed in the install
    1.80 @@ -250,19 +238,19 @@
    1.81      # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
    1.82      # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail with
    1.83      #  "ld: cannot open crti.o: No such file or directory"
    1.84 -    mkdir -p "${CT_SYSROOT_DIR}/lib"
    1.85 -    mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
    1.86 +    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
    1.87 +    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
    1.88  
    1.89      # Prevent gcc from installing its libraries outside of the sys-root
    1.90 -    ln -sf "sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
    1.91 +    CT_DoExecLog ALL ln -sf "sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
    1.92  
    1.93      # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/
    1.94      # so as to have all libraries in the same directory (we can do that
    1.95      # because we are *not* multilib).
    1.96      if [ "${CT_ARCH_64}" = "y" ]; then
    1.97 -        ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
    1.98 -        ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
    1.99 -        ln -sf "sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
   1.100 +        CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
   1.101 +        CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
   1.102 +        CT_DoExecLog ALL ln -sf "sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
   1.103      fi
   1.104  
   1.105      # Determine build system if not set by the user
   1.106 @@ -303,7 +291,7 @@
   1.107      # Now we have mangled our BUILD and HOST tuples, we must fake the new
   1.108      # cross-tools for those mangled tuples.
   1.109      CT_DoLog DEBUG "Making build system tools available"
   1.110 -    mkdir -p "${CT_PREFIX_DIR}/bin"
   1.111 +    CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
   1.112      for m in BUILD HOST; do
   1.113          r="CT_REAL_${m}"
   1.114          v="CT_${m}"
   1.115 @@ -341,7 +329,7 @@
   1.116              if [ -n "${where}" ]; then
   1.117                  CT_DoLog DEBUG "  '${!v}-${tool}' -> '${where}'"
   1.118                  printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_PREFIX_DIR}/bin/${!v}-${tool}"
   1.119 -                chmod 700 "${CT_PREFIX_DIR}/bin/${!v}-${tool}"
   1.120 +                CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/${!v}-${tool}"
   1.121              else
   1.122                  # We'll at least need some of them...
   1.123                  case "${tool}" in
   1.124 @@ -372,8 +360,9 @@
   1.125      # Some makeinfo versions are a pain in [put your most sensible body part here].
   1.126      # Go ahead with those, by creating a wrapper that keeps partial files, and that
   1.127      # never fails:
   1.128 +    CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
   1.129      printf "#${BANG}/bin/sh\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/bin/makeinfo"
   1.130 -    chmod 700 "${CT_PREFIX_DIR}/bin/makeinfo"
   1.131 +    CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/makeinfo"
   1.132  
   1.133      # Help gcc
   1.134      CT_CFLAGS_FOR_HOST=
   1.135 @@ -420,8 +409,8 @@
   1.136      if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
   1.137          if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
   1.138              mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.force.$$"
   1.139 -            setsid nohup rm -rf "${CT_SRC_DIR}.force.$$" >/dev/null 2>&1
   1.140 -            mkdir -p "${CT_SRC_DIR}"
   1.141 +            CT_DoExecLog ALL rm -rf "${CT_SRC_DIR}.force.$$"
   1.142 +            CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   1.143          fi
   1.144          CT_DoStep INFO "Extracting and patching toolchain components"
   1.145          do_kernel_extract
   1.146 @@ -474,14 +463,14 @@
   1.147      CT_DoLog DEBUG "Removing access to the build system tools"
   1.148      find "${CT_PREFIX_DIR}/bin" -name "${CT_BUILD}-"'*' -exec rm -fv {} \; |CT_DoLog DEBUG
   1.149      find "${CT_PREFIX_DIR}/bin" -name "${CT_HOST}-"'*' -exec rm -fv {} \; |CT_DoLog DEBUG
   1.150 -    rm -fv "${CT_PREFIX_DIR}/bin/makeinfo" |CT_DoLog DEBUG
   1.151 +    CT_DoExecLog DEBUG rm -fv "${CT_PREFIX_DIR}/bin/makeinfo"
   1.152  
   1.153      if [ "${CT_BARE_METAL}" != "y" ]; then
   1.154          CT_DoLog EXTRA "Installing the populate helper"
   1.155          sed -r -e 's|@@CT_TARGET@@|'"${CT_TARGET}"'|g;' \
   1.156              "${CT_LIB_DIR}/scripts/populate.in"           \
   1.157              >"${CT_PREFIX_DIR}/bin/${CT_TARGET}-populate"
   1.158 -        chmod 755 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-populate"
   1.159 +        CT_DoExecLog ALL chmod 755 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-populate"
   1.160      fi
   1.161  
   1.162      # Create the aliases to the target tools
   1.163 @@ -490,36 +479,33 @@
   1.164      for t in "${CT_TARGET}-"*; do
   1.165          if [ -n "${CT_TARGET_ALIAS}" ]; then
   1.166              _t=$(echo "$t" |sed -r -e 's/^'"${CT_TARGET}"'-/'"${CT_TARGET_ALIAS}"'-/;')
   1.167 -            ln -sv "${t}" "${_t}" 2>&1
   1.168 +            CT_DoExecLog ALL ln -sv "${t}" "${_t}"
   1.169          fi
   1.170          if [ -n "${CT_TARGET_ALIAS_SED_EXPR}" ]; then
   1.171              _t=$(echo "$t" |sed -r -e "${CT_TARGET_ALIAS_SED_EXPR}")
   1.172 -            ln -sv "${t}" "${_t}" 2>&1
   1.173 +            CT_DoExecLog ALL ln -sv "${t}" "${_t}"
   1.174          fi
   1.175 -    done |CT_DoLog ALL
   1.176 +    done
   1.177      CT_Popd
   1.178  
   1.179      # Remove the generated documentation files
   1.180      if [ "${CT_REMOVE_DOCS}" = "y" ]; then
   1.181      	CT_DoLog INFO "Removing installed documentation"
   1.182 -        rm -rf "${CT_PREFIX_DIR}/"{,usr/}{man,info}
   1.183 -        rm -rf "${CT_SYSROOT_DIR}/"{,usr/}{man,info}
   1.184 -        rm -rf "${CT_DEBUG_INSTALL_DIR}/"{,usr/}{man,info}
   1.185 +        CT_DoExecLog ALL rm -rf "${CT_PREFIX_DIR}/"{,usr/}{man,info}
   1.186 +        CT_DoExecLog ALL rm -rf "${CT_SYSROOT_DIR}/"{,usr/}{man,info}
   1.187 +        CT_DoExecLog ALL rm -rf "${CT_DEBUG_INSTALL_DIR}/"{,usr/}{man,info}
   1.188      fi
   1.189  fi
   1.190  
   1.191  CT_DoEnd INFO
   1.192  
   1.193 -if [ "${CT_LOG_FILE_COMPRESS}" = y ]; then
   1.194 -    CT_DoLog EXTRA "Compressing log file"
   1.195 -    exec >/dev/null
   1.196 -    bzip2 -9 "${CT_LOG_FILE}"
   1.197 -fi
   1.198 +# From now-on, it can become impossible to log any time, because
   1.199 +# either we're compressing the log file, or it can become RO any
   1.200 +# moment... Consign all ouptut to oblivion...
   1.201 +CT_DoLog INFO "Finishing installation (may take a few seconds)..."
   1.202 +exec >/dev/null 2>&1
   1.203  
   1.204 -if [ "${CT_INSTALL_DIR_RO}" = "y" ]; then
   1.205 -    # OK, now we're done, set the toolchain read-only
   1.206 -    # Don't log, the log file may become read-only any moment...
   1.207 -    chmod -R a-w "${CT_INSTALL_DIR}" >/dev/null 2>&1
   1.208 -fi
   1.209 +[ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}"
   1.210 +[ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
   1.211  
   1.212  trap - EXIT