summaryrefslogtreecommitdiffstats
path: root/remote/setup_target
diff options
context:
space:
mode:
authorJonathan Bauer2013-03-15 18:07:22 +0100
committerJonathan Bauer2013-03-15 18:07:22 +0100
commitc61c35397320ca4b36d25ea9b9b146d40e84c387 (patch)
tree3d01880e0ac69a0e29ca7515d9ca136916557faf /remote/setup_target
parentyet another new structure (diff)
downloadtm-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-xremote/setup_target261
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
+}