summaryrefslogblamecommitdiffstats
path: root/remote/setup_tools
blob: 6709919736a9edc444cf46a5bb8766257011a6a9 (plain) (tree)
1
2
3
4
5
6
7
8
9

           
                             

                                     

                               
 
                 
 
                             
          

                                                                                    
            

 
 
               
 
                                                          
 
                                                                         
 
                        

 

              
                                                            
 
                                                                                       
 
                         

 

                            
                                                                                                   
                
 
 
                                             
                                                        

                
                                                                                                  
                                            
          



                                                                                                                                                                      
                  


                                                                                              
             
 
                                                                                                    
                                        
          
                                                      
                  
                                            

                                                                                                                


                    

                                                                                                        

                                            

                                                        
































                                                                                                                                                             

            
                                                                                            
                                      
          
                                                        

            
 
                             







                                                                                                         



                                  


                   
        
                                                 
        
                                          
                                 
                    
                                


                                                                                                                    
                                          
                                                                       

                  


                                                                       

 
                     
 

                      

                      


                                                  
                             
                
 
                                                    
                      
                            
                        



                                                                    





                                                                                                                           
                                   


                                                          
                                            
                                                  
                                    
                                           
                             

                                                                                                       
                                                                  
                                                 
                                            
                                 
                                      
 
                                     


                                                                 
                    

                                                                      
                  

                     
                   

 
               

                                                  




                                                                                 









                                                 
 

                              
                                      



                                                                         















                                                                                                            


                    
#!/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 $@