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

           
                             

                                     

                               
 

            
                                  
                                    
                                                                                      


          
               
 
                                                    
 
                                        



                                                                   
                        

 

              
                                                      
 
                                         



                                                                         
                         

 

                            
                                                                                
                
 
 
                                             
                                                        
        
                                            
          





                                                                                          

                                                                     

                                                                       
                                                                                                                                 
            



                                                                                           
                                                  
                    
                                                     
                          

                                                                 






                                                                  

                                                                                                          

                          
              
                                    
                                                                                  
             
 
                                        
          
                                                       
                  
                                                             


                    



                                                               
                                                                                         
                   
                                                                                                                                              













                                                                                                           
                                                                














                                                                                                                          
          
                                                     


                             
                                                                                       



                                  


                   
        
                                                 
        
                                          
                                                                 
                    
                                



                                                                                                                    
                                                                       

                  
                                                                   
                                 

 
                     
 


                                                  
                             
                
 
                                      
                      

                                                    
                      
                            
                       
                                  
                    
                                  

                                                
                                 



                                                 
                                 
                                      


                                                        




                     
               

                                                  

                                                                         









                                                 
 

                              
                                        



                                                                         




                                                                                          
                     


                    
#!/bin/bash

MODULE_DIR=${ROOT_DIR}/remote

#Create tools directory if not exists
TOOL_DIR=${MODULE_DIR}/tools
INIT_DIR=${MODULE_DIR}/stage3.2

setup_git ()
{
	if [ ! -z "${GIT}" ]; then
		GIT_BIN=$(which git)
		[ -z "${GIT_BIN}" ] && echo "Installing git..." && apt-get install git
	fi
}

read_config () 
{
	TOOL_CONFIG=${TOOL_DIR}/${TOOL}/${TOOL}.conf

	if [ ! -e ${TOOL_CONFIG} ]; then
		 echo "ERROR: Config for specified tool not found."
		 exit 1
	fi

	. ${TOOL_CONFIG}
}

read_build () 
{
	BUILD_SCRIPT=${TOOL_DIR}/${TOOL}/${TOOL}.build

	if [ ! -e ${BUILD_SCRIPT} ]; then
		 echo "ERROR: Build script for specified tool not found."
		 exit 1
	fi

	. ${BUILD_SCRIPT}
}

copyfileswithdependencies ()
{
	[ ! -d build ] && echo "No build directory for ${TOOL} found." && return
	cd build


	COPYFILES_LIST="list_wanted_stage3.2"
	[ -e ${COPYFILES_LIST} ] && rm ${COPYFILES_LIST}
	
	for FILENAME in ${REQUIRED_BINARIES}
	do
	  FILE=$(find . -name ${FILENAME} -type f -executable | xargs grep -l ELF)
	  if [ -z "$FILE" ]; then
		  echo "No Binary found for ${FILENAME}. Skipping." 
		  echo "-----------------------------------------------------------------"
		  continue
	  fi
	  echo "Found ${FILENAME} at ${FILE}. Searching libraries..."
	  echo ${FILE} >> ${COPYFILES_LIST}
	  # fetch dependencies
	  # quick fix to exclude libc*, else it copies unneeded libs...
	  for i in $(ldd ${FILE} |awk '{print $1 $2 $3}'|grep -v ld-linux|grep -v libc.so*|grep -v linux-gate|grep -v linux-vdso)
	  do
		arrIN=(${i//=>/ })
		echo "--------------------------------------------------------"
		echo "Searching ${arrIN[0]} under $(pwd)..."
		LOCAL_MATCHES=$(find . -name $(echo ${arrIN[0]}|awk -F "." '{print $1}').*)
		if [ "x${LOCAL_MATCHES}" != "x" ];
		then
			for llib in ${LOCAL_MATCHES};
			do
				echo "Copying ${llib}"
				echo ${llib} >> ${COPYFILES_LIST}
			done
		else
			echo "Did not found ${arrIN[0]} in $(pwd)"
			if [ -e ${arrIN[1]} ];
			then
				echo -n "Trying ${arrIN[1]} ..."
				echo " found! Copying."
				echo ${arrIN[1]} >> ${COPYFILES_LIST}
				[ -L ${arrIN[1]} ] && echo $(readlink -f ${arrIN[1]}) >> ${COPYFILES_LIST}
			fi
		fi
	  done
	  echo "Copied ${FILENAME}."
	  echo "-----------------------------------------------------------------"
	done 

	for LIB in ${REQUIRED_LIBRARIES}
	do
		for LOCATION in $(find . -name ${LIB}*)
		do
			echo ${LOCATION} >> ${COPYFILES_LIST}
		done
	done

	echo "Copying required directories from config file..."
	for ENTRY in ${REQUIRED_DIRECTORIES}
	do
		echo ".${ENTRY}" >> ${COPYFILES_LIST}
		for LIB in $(find .${ENTRY} -type f -not -name "*.a" | xargs grep -l ELF)
		do 
			for i in $(ldd ${LIB} |awk '{print $1 $2 $3}'|grep -v ld-linux|grep -v libc.so*|grep -v linux-gate|grep -v linux-vdso)
			do
				arrIN=(${i//=>/ })
				echo "--------------------------------------------------------"
				echo "Searching ${arrIN[0]} under $(pwd)..."
				LOCAL_MATCHES=$(find . -name $(echo ${arrIN[0]}|awk -F "." '{print $1}').*)
				if [ "x${LOCAL_MATCHES}" != "x" ];
				then
					for llib in ${LOCAL_MATCHES};
					do
						echo "Copying ${llib}"
						echo ${llib} >> ${COPYFILES_LIST}
					done
				else
					echo "Did not found ${arrIN[0]} in $(pwd)"
					if [ ! -z ${arrIN[1]} ];
					then
						echo -n "Trying ${arrIN[1]} ..."
						echo " found! Copying."
						echo ${arrIN[1]} >> ${COPYFILES_LIST}
						[ -L ${arrIN[1]} ] && echo $(readlink -f ${arrIN[1]}) >> ${COPYFILES_LIST}
					fi
				fi
			done
			echo "Copied ${LIB}."
			echo "-----------------------------------------------------------------"
		done
	done

	echo "Copying required files from config file..."
	for ENTRY in ${REQUIRED_FILES}
	do
		echo ".${ENTRY}" >> ${COPYFILES_LIST}
	done

	#copy to initramfsdir
	tar -cpv $(cat ${COPYFILES_LIST}|sort -u) | tar -xpv -C ${INIT_DIR} &>/dev/null
	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
	echo "Looking for libc and ld-linux used for ${SHELL}..."
	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
        	        echo "Found basic lib at: $i"
	                BASICLIBS="${BASICLIBS} $i $(readlink -f "$i")"
	        fi
	done
	tar -cpv ${BASICLIBS} | tar -xpv -C ${INIT_DIR} &>/dev/null
	echo "Basic libs copied."
}

generate_stage32 () {

	# if no arguments assume all.
	if [ "x$1" = "x" -o "x$1" = "xall" ]; then
		tools=$(ls ${TOOL_DIR})
		set -- $tools
	fi	

	# first copy libc and ld-linux
	get_basic_libs

	# now iterate over given tools and copy them
	cd ${TOOL_DIR}
	while (( "$#" )); do
		TOOL=$1
		if [ -d ${TOOL} ];
		then
	 		cd ${TOOL}
			read_config
			read_build		
			setup_git
			install_dependencies
			fetch_source
			build
			copyfileswithdependencies
			post_copy
			cd ${TOOL_DIR}
		else
			echo "Tool directory not found."
		fi
		shift
	done

}

clean_tools() {
	if [ "x$1" = "x" -o "x$1" = "xall" ]; then
		#clean all
		[ -d ${INIT_DIR} ] && echo -n "Cleaning ${INIT_DIR}..." \
			&& rm -rf ${INIT_DIR} && echo " done."
	        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
	echo -n "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)
        [ -e ${TOOLDIR}/.built ] && rm ${TOOLDIR}/.built
        [ -e ${TOOLDIR}/.fetched_source ] && rm ${TOOLDIR}/.fetched_source
        [ -d ${TOOLDIR}/build ] && rm -rf ${TOOLDIR}/build
	[ -d ${TOOLDIR}/src ] && rm -rf ${TOOLDIR}/src
	[ -e ${TOOLDIR}/list_binaries_and_files ] && rm ${TOOLDIR}/list_binaries_and_files
	echo " done."
}

#generate_stage32 $@