Implement a restart facility.

If you select to debug ct-ng, then you have two new options:
 - DEBUG_CT_PAUSE_STEPS : pause between every steps,
 - DEBUG_CT_SAVE_STEPS  : save state between every steps.
To restart a saved state, just set the RESTART make variable when calling make:
  - make RESTART=<step_name>
This commit is contained in:
Yann E. MORIN"
2007-05-22 20:46:07 +00:00
parent 0c28252021
commit cb0d1fef8c
4 changed files with 422 additions and 187 deletions

View File

@ -304,7 +304,7 @@ CT_GetFile() {
if [ -r "${CT_LOCAL_TARBALLS_DIR}/${file}${ext}" -a \
"${CT_FORCE_DOWNLOAD}" != "y" ]; then
CT_DoLog EXTRA "Copying \"${file}\" from local copy"
cp -v "${CT_LOCAL_TARBALLS_DIR}/${file}${ext}" "${file}${ext}" |CT_DoLog DEBUG
cp -v "${CT_LOCAL_TARBALLS_DIR}/${file}${ext}" "${file}${ext}" |CT_DoLog ALL
return 0
fi
done
@ -460,3 +460,112 @@ CT_DoBuildTargetTriplet() {
esac
CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`"
}
# This function does pause the build until the user strikes "Return"
# Usage: CT_DoPause [optional_message]
CT_DoPause() {
local foo
local message="${1:-Pausing for your pleasure}"
CT_DoLog INFO "${message}"
read -p "Press \"Enter\" to continue, or Ctrl-C to stop..." foo >&6
return 0
}
# This function saves the state of the toolchain to be able to restart
# at any one point
# Usage: CT_DoSaveState <next_step_name>
CT_DoSaveState() {
[ "${CT_DEBUG_CT_SAVE_STEPS}" = "y" ] || return 0
local state_name="$1"
local state_dir="${CT_STATE_DIR}/${state_name}"
CT_DoLog DEBUG "Saving state to restart at step \"${state_name}\"..."
rm -rf "${state_dir}"
mkdir -p "${state_dir}"
case "${CT_DEBUG_CT_SAVE_STEPS_GZIP}" in
y) tar_opt=czf; tar_ext=".tar.gz";;
*) tar_opt=cf; tar_ext=".tar";;
esac
CT_DoLog DEBUG " Saving environment and aliases"
# We must omit shell functions
# 'isgrep' is here because I don't seem to
# be able to remove the functions names.
set |awk '
BEGIN { _p = 1; }
$0~/^[^ ] ()/ { _p = 0; }
_p == 1
$0 == "}" { _p = 1; }
' |egrep -v '^[^ ]+ \(\)' >"${state_dir}/env.sh"
CT_DoLog DEBUG " Saving CT_CC_CORE_PREFIX_DIR=\"${CT_CC_CORE_PREFIX_DIR}\""
CT_Pushd "${CT_CC_CORE_PREFIX_DIR}"
tar ${tar_opt} "${state_dir}/cc_core_prefix_dir${tar_ext}" .
CT_Popd
CT_DoLog DEBUG " Saving CT_PREFIX_DIR=\"${CT_PREFIX_DIR}\""
CT_Pushd "${CT_PREFIX_DIR}"
tar ${tar_opt} "${state_dir}/prefix_dir${tar_ext}" .
CT_Popd
if [ "${CT_LOG_TO_FILE}" = "y" ]; then
CT_DoLog DEBUG " Saving log file"
exec >/dev/null
case "${CT_DEBUG_CT_SAVE_STEPS_GZIP}" in
y) gzip -3 -c "${CT_LOG_FILE}" >"${state_dir}/log.gz";;
*) cat "${CT_LOG_FILE}" >"${state_dir}/log";;
esac
exec >>"${CT_LOG_FILE}"
fi
}
# This functions restores a previously saved state
# Usage: CT_DoLoadState <state_name>
CT_DoLoadState(){
local state_name="$1"
local state_dir="${CT_STATE_DIR}/${state_name}"
# We need to do something special with the log file!
if [ "${CT_LOG_TO_FILE}" = "y" ]; then
exec >"${state_dir}/tail.log"
fi
CT_DoLog DEBUG "Restoring state at step \"${state_name}\"..."
case "${CT_DEBUG_CT_SAVE_STEPS_GZIP}" in
y) tar_opt=xzf; tar_ext=".tar.gz";;
*) tar_opt=cf; tar_ext=".tar";;
esac
CT_DoLog DEBUG " Removing previous build directories"
chmod -R u+rwX "${CT_PREFIX_DIR}" "${CT_CC_CORE_PREFIX_DIR}"
rm -rf "${CT_PREFIX_DIR}" "${CT_CC_CORE_PREFIX_DIR}"
mkdir -p "${CT_PREFIX_DIR}" "${CT_CC_CORE_PREFIX_DIR}"
CT_DoLog DEBUG " Restoring CT_PREFIX_DIR=\"${CT_PREFIX_DIR}\""
CT_Pushd "${CT_PREFIX_DIR}"
tar ${tar_opt} "${state_dir}/prefix_dir${tar_ext}"
CT_Popd
CT_DoLog DEBUG " Restoring CT_CC_CORE_PREFIX_DIR=\"${CT_CC_CORE_PREFIX_DIR}\""
CT_Pushd "${CT_CC_CORE_PREFIX_DIR}"
tar ${tar_opt} "${state_dir}/cc_core_prefix_dir${tar_ext}"
CT_Popd
# Restore the environment, discarding any error message
# (for example, read-only bash internals)
CT_DoLog DEBUG " Restoring environment"
. "${state_dir}/env.sh" >/dev/null 2>&1 || true
if [ "${CT_LOG_TO_FILE}" = "y" ]; then
CT_DoLog DEBUG " Restoring log file"
exec >/dev/null
case "${CT_DEBUG_CT_SAVE_STEPS_GZIP}" in
y) zcat "${state_dir}/log.gz" >"${CT_LOG_FILE}";;
*) cat "${state_dir}/log" >"${CT_LOG_FILE}";;
esac
cat "${state_dir}/tail.log" >>"${CT_LOG_FILE}"
exec >>"${CT_LOG_FILE}"
rm -f "${state_dir}/tail.log"
fi
}