blob: 6709919736a9edc444cf46a5bb8766257011a6a9 (
plain) (
tree)
|
|
#!/bin/bash
MODULE_DIR=${ROOT_DIR}/remote
#Create tools directory if not exists
TOOL_DIR=${MODULE_DIR}/tools
INIT_DIR=${MODULE_DIR}/stage3.2
initial_checks ()
{
for BIN in git locate
do
local TEST=$(which ${BIN})
[ -z "$TEST" ] && pinfo "Installing $BIN..." && apt-get install $BIN
done
}
read_config ()
{
local TOOL_CONFIG=${TOOL_DIR}/${TOOL}/${TOOL}.conf
[ ! -e ${TOOL_CONFIG} ] && perror "Config for '$TOOL' not found."
. ${TOOL_CONFIG}
}
read_build ()
{
local BUILD_SCRIPT=${TOOL_DIR}/${TOOL}/${TOOL}.build
[ ! -e ${BUILD_SCRIPT} ] && perror "Build script for specified tool not found."
. ${BUILD_SCRIPT}
}
copyfileswithdependencies ()
{
[ ! -d build ] && pinfo "No build directory found, skipping dependency copying" && return 0
cd build
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
FILE=$(find . -name ${FILENAME} -type f -executable | xargs grep -l '^.ELF'|head -1) # FIXME: What happens on multiple matches? Maybe add " | head -1"
if [ -z "$FILE" ]; then
pwarning "\tNo Binary found for ${FILENAME}. Skipping."
continue
fi
pdebug "\tFound ${FILENAME} at ${FILE}"
echo "${FILE}" >> "${COPYFILES_LIST}"
get_dynamic_dependencies -l "${TOOL_DIR}/${TOOL}/build" "$FILE" >> "${COPYFILES_LIST}"
done
[ ! -z "${REQUIRED_LIBRARIES}" ] && pinfo "Gathering required libraries from config file..."
for LIB in ${REQUIRED_LIBRARIES}
do
for LOCATION in $(find . -name ${LIB})
do
pdebug "* $LOCATION"
echo "${LOCATION}" >> ${COPYFILES_LIST}
get_dynamic_dependencies -l "${TOOL_DIR}/${TOOL}/build" ${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}"
get_dynamic_dependencies -l "${TOOL_DIR}/${TOOL}/build" ${ENTRY} >> ${COPYFILES_LIST}
#as as \n
#echo "./${ENTRY}" >> "${COPYFILES_LIST}"
#for BIN in $(find "./${ENTRY}" -type f -not -name '*.a' | xargs grep -l '^.ELF')
#do
# pdebug " Searching libs for ${BIN}..."
# for i in $(ldd ${BIN} | awk '{print $1 $2 $3}' | grep -v ld-linux | grep -v libc.so | grep -v linux-gate | grep -v linux-vdso)
# do
# arrIN=(${i//=>/ })
# pdebug " Searching for ${arrIN[0]}...($i)"
# local LOCAL_MATCHES=$(find . -name "$(echo ${arrIN[0]} | awk -F '.' '{print $1}')".so\*)
# if [ "x${LOCAL_MATCHES}" != "x" ];
# then
# for llib in ${LOCAL_MATCHES};
# do
# pdebug " Found locally, copying ${llib}"
# echo ${llib} >> "${COPYFILES_LIST}"
# done
# else
# if [ ! -z ${arrIN[1]} ] && [ "x${arrIN[1]}" != "xnot" ];
# then
# pdebug " Not found locally but in system, copying ${arrIN[1]}"
# echo ${arrIN[1]} >> "${COPYFILES_LIST}"
# [ -L ${arrIN[1]} ] && echo $(readlink -f "${arrIN[1]}") >> "${COPYFILES_LIST}"
# else
# pwarning "Lib '${arrIN[0]}' from required dir '$ENTRY' neither found in build directory nor on this system."
# pwarning "If this lib is not supplied by another module, this module will probably fail in your final system"
# fi
# fi
# done
# done
done
[ ! -z "${REQUIRED_FILES}" ] && pinfo "Gathering required files from config file..."
for ENTRY in ${REQUIRED_FILES}
do
echo "./${ENTRY}" >> "${COPYFILES_LIST}"
done
#copy to initramfsdir
pdebug "[stage32] Completed file list generation at ${TOOL_DIR}/${TOOL}/build/${COPYFILES_LIST}."
if [ -s "$COPYFILES_LIST" ]; then
local CLISTCOUNT=$(cat "$COPYFILES_LIST" | wc -l)
pinfo "Copying $CLISTCOUNT files to stage 3.2 target directory."
tar -cp $(cat ${COPYFILES_LIST}|sort -u) | tar -xp -C "${INIT_DIR}"
local RET=$?
[ "x$RET" != "x0" ] && perror "Could not tar-copy to $INIT_DIR"
fi
unset REQUIRED_BINARIES
unset REQUIRED_LIBRARIES
unset REQUIRED_DIRECTORIES
unset REQUIRED_FILES
}
get_basic_libs () {
[ ! -d ${INIT_DIR} ] && mkdir ${INIT_DIR}
# copy libc and ld-linux separatly
pinfo "Adding basic libs"
BASICLIBS=""
for i in $(ldd ${SHELL})
do
if [ $(echo $i | grep '^/' | grep -c ld) -eq 1 -o $(echo $i | grep '^/' | grep -c libc.so) -eq 1 ];
then
pdebug "Adding $i"
BASICLIBS="${BASICLIBS} $i $(readlink -f "$i")"
fi
done
tar -cp ${BASICLIBS} | tar -xp -C ${INIT_DIR}
local RET=$?
[ "x$RET" != "x0" ] && perror "Could not tar-copy to $INIT_DIR"
}
generate_stage32 () {
initial_checks
get_basic_libs
# if no arguments assume all.
if [ "x$1" = "x" -o "x$1" = "xall" ]; then
tools=$(ls ${TOOL_DIR})
set -- $tools
fi
# now iterate over given tools and copy them
cd ${TOOL_DIR}
while (( "$#" )); do
TOOL=$1
TOOL_STR=""
pinfo ">>>>>>>>>>>>>>>> Processing module [ $TOOL ]"
TOOL_STR="[${TOOL}]"
if [ -d ${TOOL} ]; 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 "${TOOL}"
pinfo "## Reading config"
read_config
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 "${TOOL_DIR}/${TOOL}/build" -name '*.la' -exec rm -f {} \;
pinfo "## Copying files with dependencies"
copyfileswithdependencies
pinfo "## Post copy"
post_copy
cd ${TOOL_DIR}
# reset pipes
#[ "x$DEBUG" != "x1" ] && exec 1>&6 6>&-
# TODO
pinfo "## ## Module completed ## ##"
else
perror "Tool directory for '$TOOL' not found."
# maybe make this a warning instead of error?
fi
shift
done
TOOL_STR=""
}
clean_tools() {
if [ "x$1" = "x" -o "x$1" = "xall" ]; then
#clean all
if [ -d ${INIT_DIR} ]; then
pinfo "Cleaning ${INIT_DIR}..."
rm -rf "${INIT_DIR}" || perror "Error deleting $INIT_DIR"
pinfo "done."
fi
for TOOL in $(ls ${TOOL_DIR}); do
clean_tool $TOOL
done
else
while (( "$#" )); do
clean_tool $1
shift
done
fi
}
clean_tool() {
TOOLDIR=${TOOL_DIR}/$1
pinfo "Cleaning ${TOOLDIR}..."
#[ -e ${TOOLDIR}/build/list_wanted_stage3.2 ] && cd ${INIT_DIR} \
# && xargs rm < ${TOOLDIR}/build/list_wanted_stage3.2
#[ -d ${TOOLDIR}/data ] && cd ${INIT_DIR} \
# && xargs rm < $(find ${TOOLDIR}/data -type f)
if [ -e ${TOOLDIR}/.built ]; then
rm "${TOOLDIR}/.built" || perror "Could not clear built flag"
fi
if [ -e ${TOOLDIR}/.fetched_source ]; then
rm "${TOOLDIR}/.fetched_source" || perror "Could not clear fetched_source flag"
fi
if [ -d ${TOOLDIR}/build ]; then
rm -rf "${TOOLDIR}/build" || perror "Could not delete build path"
fi
if [ -d ${TOOLDIR}/src ]; then
rm -rf "${TOOLDIR}/src" || perror "Could not delete src path"
fi
if [ -e ${TOOLDIR}/list_binaries_and_files ]; then
rm "${TOOLDIR}/list_binaries_and_files" || perror "Could not delete list_binaries_and_files"
fi
pinfo "done."
}
#generate_stage32 $@
|