diff options
author | Jonathan Bauer | 2013-03-15 18:07:22 +0100 |
---|---|---|
committer | Jonathan Bauer | 2013-03-15 18:07:22 +0100 |
commit | c61c35397320ca4b36d25ea9b9b146d40e84c387 (patch) | |
tree | 3d01880e0ac69a0e29ca7515d9ca136916557faf /remote/setup_target | |
parent | yet another new structure (diff) | |
download | tm-scripts-c61c35397320ca4b36d25ea9b9b146d40e84c387.tar.gz tm-scripts-c61c35397320ca4b36d25ea9b9b146d40e84c387.tar.xz tm-scripts-c61c35397320ca4b36d25ea9b9b146d40e84c387.zip |
fix stage3.1 build script
Diffstat (limited to 'remote/setup_target')
-rwxr-xr-x | remote/setup_target | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/remote/setup_target b/remote/setup_target new file mode 100755 index 00000000..c1a45787 --- /dev/null +++ b/remote/setup_target @@ -0,0 +1,261 @@ +#!/bin/bash + +MODE_DIR="${ROOT_DIR}/remote" +MODULES_DIR="${MODE_DIR}/modules" + +# check for target directory +TARGET_DIR="${MODE_DIR}/targets/${TARGET}" +[ -d $TARGET_DIR ] || perror "Given target directory does not exist: $TARGET" +TARGET_BUILD_DIR="${MODE_DIR}/builds/${TARGET}" + +# Keep track of processed modules +PROCESSED_MODULES="" + +initial_checks () { + # check for required tools + for BIN in git locate depmod + do + local TEST=$(which ${BIN}) + [ -z "$TEST" ] && pinfo "Installing $BIN..." && apt-get install $BIN + done +} + + +read_config () { + unset REQUIRED_BINARIES + unset REQUIRED_LIBRARIES + unset REQUIRED_DIRECTORIES + unset REQUIRED_FILES + unset REQUIRED_MODULES + unset REQUIRED_PACKAGES + unset REQUIRED_DEPENDENCIES + + local MODULE_CONFIG="${MODULE_DIR}/${MODULE}.conf" + + if [ -e "${MODULE_CONFIG}.${PACKET_MANAGER}" ]; then + # a specific tool.conf seems to exist, try to use that one + # TODO: Maybe move this down right after loading the generic one, to allow "overloading".... but might be a bit confusing + . "${MODULE_CONFIG}.${PACKET_MANAGER}" || perror "Sourcing '${MODULE_CONFIG}.${PACKET_MANAGER}' failed." + else + # otherwise, use the generic one + [ ! -e "${MODULE_CONFIG}" ] && perror "Config for '$MODULE' not found." + . "${MODULE_CONFIG}" || perror "Sourcing '${MODULE_CONFIG}' failed." + fi +} + +read_build () { + local BUILD_SCRIPT="${MODULE_DIR}/${MODULE}.build" + + [ ! -e "${BUILD_SCRIPT}" ] && perror "Build script for specified tool not found." + + . "${BUILD_SCRIPT}" || perror "Sourcing '${BUILD_SCRIPT}' failed." +} + +copyfileswithdependencies () { + + [ ! -d $MODULE_BUILD_DIR ] && pinfo "No build directory found, skipping dependency copying" && return 0 + cd $MODULE_BUILD_DIR + + COPYFILES_LIST="list_wanted_stage3.2" + [ -e ${COPYFILES_LIST} ] && rm ${COPYFILES_LIST} + + + [ ! -z "${REQUIRED_BINARIES}" ] && pinfo "Gathering required binaries from config file..." + for FILENAME in ${REQUIRED_BINARIES} + do + local FILE_CANDIDATES=$( find . -name "${FILENAME}" -a \( -type f -o -type l \) ) + pdebug "Candidates for $FILENAME are: $FILE_CANDIDATES" + local FINAL_LIST="" + for FILE in $FILE_CANDIDATES; do + local TESTFILE="$(readlink -f "$FILE")" + pdebug " $FILE leads to $TESTFILE" + [ -f "$TESTFILE" -a -x "$TESTFILE" ] && [ "x$(grep -l -E '^(.ELF|#!)' "$TESTFILE")" != "x" ] && FINAL_LIST="$FINAL_LIST $FILE" + done + FINAL_LIST=$(trim "$FINAL_LIST") + pdebug " Final list is $FINAL_LIST" + if [ -z "$FINAL_LIST" ]; then + pwarning "\tNo Binary found for ${FILENAME}. Skipping." + continue + fi + if [[ "$FINAL_LIST" == *" "* ]]; then + pwarning "Found more than one match for required file '$FILENAME': $FINAL_LIST" + else + pdebug "\tFound ${FILENAME} at ${FILE}" + fi + for FILE in $FINAL_LIST; do + strip $FILE || pwarning "Could not strip '${FILE}'" + get_link_chain "${MODULE_BUILD_DIR}/${FILE}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}" + get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${FILE}" >> "${COPYFILES_LIST}" + done + done + + [ ! -z "${REQUIRED_LIBRARIES}" ] && pinfo "Gathering required libraries from config file..." + for LIB in ${REQUIRED_LIBRARIES} + do + for LOCATION in $(find . -name ${LIB}.so\*) + do + pdebug "* $LOCATION" + strip $LOCATION || pwarning "Could not strip '${LOCATION}'" + get_link_chain "${MODULE_BUILD_DIR}/${LOCATION}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}" + get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${LOCATION}" >> "${COPYFILES_LIST}" + done + done + + [ ! -z "${REQUIRED_DIRECTORIES}" ] && pinfo "Gathering required directories from config file..." + local CURRENT_PWD=$(pwd) # Prevent calling pwd 50000 times inside the loop below + for ENTRY in ${REQUIRED_DIRECTORIES} + do + pdebug "* ./$ENTRY" + echo "./${ENTRY}" >> "${COPYFILES_LIST}" + for BIN in $(find "./${ENTRY}" -type f -not -name '*.a' | xargs grep -l '^.ELF') + do + pdebug " Searching libs for ${BIN}..." + get_link_chain "${MODULE_BUILD_DIR}/${BIN}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}" + get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${BIN}" >> "${COPYFILES_LIST}" + done + done + + [ ! -z "${REQUIRED_FILES}" ] && pinfo "Gathering required files from config file..." + for ENTRY in ${REQUIRED_FILES} + do + get_link_chain "${MODULE_BUILD_DIR}/${ENTRY}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}" + get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${MODULE_BUILD_DIR}/.${ENTRY}" >> "${COPYFILES_LIST}" + done + + + #copy to initramfsdir + pdebug "[stage32] File list generated at ${MODULE_BUILD_DIR}/${COPYFILES_LIST}." + if [ -s "$COPYFILES_LIST" ]; then + local CLISTCOUNT=$(cat "$COPYFILES_LIST" | wc -l) + pinfo "Copying $CLISTCOUNT files to '${TARGET_BUILD_DIR}'." + tarcopy "$(cat "$COPYFILES_LIST"|sort -u)" "${TARGET_BUILD_DIR}" + fi +} + +generate_target() { + + initial_checks + + [[ $TARGET == builds || $TARGET == modules ]] && \ + perror "Target directory cannot be named 'builds' nor 'modules'." + + pinfo "Generating '$TARGET_BUILD_DIR' for '$TARGET'" + + # if no arguments assume all. + if [ "x$1" = "x" -o "x$1" = "xall" ]; then + MODULES=$(ls ${TARGET_DIR}) + set -- $MODULES + else + # tools = arguments given + MODULES=$@ + fi + + pinfo "Activated modules in '${TARGET}':" + pinfo "\t$(echo ${MODULES})" + + # copy basic libs + pinfo "Copying libc and ld-linux used by ${SHELL}" + tarcopy "$(list_basic_libs)" "${TARGET_BUILD_DIR}" + + # now iterate over given tools and copy them + while (( "$#" )); do + process_module "$1" + shift + done + TOOL_STR="" +} + +process_module() { + [ "$#" -ne "1" ] && perror "process_module: want 1 param." + local MODULE="$1" + [[ "$PROCESSED_MODULES" == *"!${MODULE}!"* ]] && return # Already processed this module + PROCESSED_MODULES="${PROCESSED_MODULES}!${MODULE}!" + local MODULE_DIR="${TARGET_DIR}/${MODULE}" + local MODULE_BUILD_DIR="${MODULE_DIR}/build" + local TOOL_STR="" + pinfo ">>>>>>>>>>>>>>>>> Processing module [ $MODULE ]" + TOOL_STR="[${MODULE}]" + if [ -d "${MODULE_DIR}" ]; then + + #[ "x$DEBUG" != "x1" ] \ + # && echo "Logging to ${TOOL_DIR}/${TOOL}/stage32.log" \ + # && exec 6>&1 > ${TOOL_DIR}/${TOOL}/stage32.log + # TODO: Make above work with the new logging system (add function to logging.inc to switch logfile) + cd "${MODULE_DIR}" || perror "Module dir '${MODULE_DIR}' seems to exist, but cd to it failed." + pinfo "## Reading config" + read_config + # Check if this module has a dependency that wasn't built yet: + if [ ! -z "$REQUIRED_MODULES" ]; then + pinfo "$MODULE depends on ${REQUIRED_MODULES}...." + for DEP in $REQUIRED_MODULES; do + #[[ "$DESIRED_MODULES" != *"!${DEP}!"* ]] && perror "$TOOL has dependency $DEP, but $DEP is not in current profile." + process_module "$DEP" + done + # Read old config again, as it got overwritten by the deps + cd "${MODULE_DIR}" || perror "Tool dir '${MODULE_DIR}' seems to exist, but cd to it failed (after building deps)." + read_config + pinfo "<<<<<<<<<<<<<<<<< Dependency modules processed, back to module [ $MODULE ]" + fi + pinfo "## Reading build" + read_build + pinfo "## Installing dependencies" + install_dependencies + pinfo "## Fetching source" + fetch_source + pinfo "## Building" + build + # remove *.la files as they might confuse libtool/linker of other tool packages + find "${MODULE_DIR}/build" -name '*.la' -exec rm -f {} \; + pinfo "## Copying files with dependencies" + copyfileswithdependencies + pinfo "## Post copy" + post_copy + + # reset pipes + #[ "x$DEBUG" != "x1" ] && exec 1>&6 6>&- + # TODO + pinfo "Module completed." + else + pwarning "Module directory for '$MODULE' not found." + fi +} + +clean_modules() { + if [ "x$1" = "x" -o "x$1" = "xall" ]; then + if [ -d ${TARGET_BUILD_DIR} ]; then + pinfo "Cleaning '${TARGET_BUILD_DIR}'" \ + && rm -rf "${TARGET_BUILD_DIR}"/* \ + || perror "Error deleting $TARGET_BUILD_DIR" + fi + set -- $(ls ${TARGET_DIR}) + fi + cd ${TARGET_DIR} + while (( "$#" )); do + clean_module $(readlink -f $1) + shift + done + cd - &> /dev/null +} + +clean_module() { + pinfo "Cleaning '$1'..." + local MODULE_DIR=$1 + if [ -e ${MODULE_DIR}/.built ]; then + rm "${MODULE_DIR}/.built" || perror "Could not clear built flag" + fi + if [ -e ${MODULE_DIR}/.fetched_source ]; then + rm "${MODULE_DIR}/.fetched_source" || perror "Could not clear fetched_source flag" + fi + if [ -d ${MODULE_DIR}/build ]; then + rm -rf "${MODULE_DIR}/build" || perror "Could not delete build path" + fi + if [ -d ${MODULE_DIR}/src ]; then + rm -rf "${MODULE_DIR}/src" || perror "Could not delete src path" + fi + if [ -e ${MODULE_DIR}/list_binaries_and_files ]; then + rm "${MODULE_DIR}/list_binaries_and_files" || perror "Could not delete list_binaries_and_files" + fi + if [ -e ${MODULE_DIR}/stage32.log ]; then + rm "${MODULE_DIR}/stage32.log" || perror "Could not delete stage32.log" + fi +} |