#!/bin/bash # Yocto ADT Installer # # Copyright 2010-2011 by Intel Corp. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. usage () { INST_ARCH=`uname -m` INST_OS=`uname -o| tr '[A-Z]' '[a-z]'` INST_KR=`uname -r| tr '[A-Z]' '[a-z]'` echo_info "#########################################################################" echo_info "# Welcome to Yocto Application Developement Tools (ADT) Installer" echo_info "# " echo_info "# Host Machine:\t\t\t\t"$INST_ARCH echo_info "# OS info:\t\t\t\t$INST_KR" echo_info "# Yocto ADT version to be installed:\t$YOCTOADT_VERSION" echo_info "# supported target architectures:\t$YOCTOADT_SUPPORTED_TARGETS" echo_info "# supported target root_fs images:\t$YOCTOADT_SUPPORTED_ROOTFS" echo_info "#########################################################################\n" echo_info "Systemwide installation. Installation will occur under $INSTALL_FOLDER\n" echo_info "############################################################################" echo_info "# Your system installation configurations from adt_installer.conf" echo_info "############################################################################" echo_info "# Cross toolchains:\t\t$YOCTOADT_TARGETS" echo_info "# Install Qemu:\t\t\t$YOCTOADT_QEMU" echo_info "# Install NFS utilities:\t$YOCTOADT_NFS_UTIL" #echo_info "# Install bitbake + UI:\t\t$YOCTOADT_BITBAKE" #echo_info "# Install metadata:\t$YOCTOADT_METADATA" #echo_info "############################################################################\n" echo_info "\n##############################################################################" echo_info "# Your rootfs image(s) and target sysroot selections from adt_installer.conf" echo_info "##############################################################################" prompt=1 for arch_type in $YOCTOADT_TARGETS; do download_images $arch_type $prompt done echo_info "############################################################################\n" select_install_type } validate_config() { for selected_arch_type in $YOCTOADT_TARGETS; do found=0 select_machine_var="\$YOCTOADT_TARGET_MACHINE_$selected_arch_type" select_machine=`eval echo $select_machine_var` show_error_banner=0 for supported_arch_type in $YOCTOADT_SUPPORTED_TARGETS; do if [ "$selected_arch_type" == "$supported_arch_type" ]; then found=1 break fi done if [ $found == 0 ]; then echo_info "[ADT_INST] Error: YOCTADT_TARGETS in adt_installer.conf contains invalid entries: $YOCTOADT_TARGETS. Valid values are: $YOCTOADT_SUPPORTED_TARGETS" show_error_banner=1 elif [ -z "$select_machine" ]; then echo_info "[ADT_INST] Error: No MACHINE was defined for $selected_arch_type architecture! This is needed to install the toolchain and the correct environment settings." echo_info "[ADT_INST] To do that, in adt-installer.conf, set the following variable: YOCTOADT_TARGET_MACHINE_$selected_arch_type" show_error_banner=1 fi if [ $show_error_banner == 1 ]; then echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi done for arch_type in $YOCTOADT_SUPPORTED_TARGETS; do #select_target_var="\$YOCTOADT_TARGET_$arch_type" #select_target=`eval echo $select_target_var` #if [ "$select_target" != "Y" ] || [ "$selected_target" != "y" ]; then # continue; #fi target_sysroot_image_var="\$YOCTOADT_TARGET_SYSROOT_IMAGE_$arch_type" target_sysroot_image=`eval echo $target_sysroot_image_var` select_rootfs_var="\$YOCTOADT_ROOTFS_$arch_type" select_rootfs=`eval echo $select_rootfs_var` if [ "$select_rootfs" == "" ] && [ "$target_sysroot_image" == "" ]; then continue; fi for image_type in $select_rootfs; do #validate rootfs type defined in YOCTOADT_ROOTFS_{ARCH} is valid and in YOCTOADT_SUPPORTED_ROOTFS found=0 for supported_rootfs_type in $YOCTOADT_SUPPORTED_ROOTFS; do if [ "$image_type" == "$supported_rootfs_type" ]; then found=1 break fi done if [ $found == 0 ]; then #the rootfs type listed for downloading is not valid echo_info "[ADT_INST] Error: Selected YOCTOADT_ROOTFS_$arch_type value: $image_type, is not valid! Valid values are: $YOCTOADT_SUPPORTED_ROOTFS " echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi done found=0 for image_type in $select_rootfs; do #validate that rootfs to be extracted must be in the item: YOCTOADT_ROOTFS_${ARCH} if [ "$target_sysroot_image" == "$image_type" ]; then found=1 break fi done # the rootfs image to be extracted is not selected if [ $found == 0 ]; then echo_info "[ADT_INST] Error: YOCTOADT_TARGET_SYSROOT_IMAGE_$arch_type selection: $target_sysroot_image is not included in YOCTOADT_ROOTFS_$arch_type selections: $select_rootfs" echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi done } #detect opkg installed or not, for installing sdk, we will use #this installed local opkg install_opkg() { if [ ! -x "$LOCAL_OPKG_LOC/bin/opkg-cl" ]; then echo_info "OPKG is not setup, setting up opkg in local, which is required for installing yocto ADT...\n" if [ -d $LOCAL_OPKG_LOC ]; then echo_info "Deleting old OPKG folder, which doesn't contain executables... " rm -rf $LOCAL_OPKG_LOC fi parent_folder=`pwd` cd $LOCAL_OPKG_FOLDER check_result opkg_source_dir=`ls -d opkg-*` if [ $opkg_source_dir == "" ]; then echo_info "[ADT_INST] Error: OPKG source directory is not found!" echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi cd $opkg_source_dir check_result echo_info "Configure opkg ...\n" autoreconf ./configure --prefix=$parent_folder/$LOCAL_OPKG_LOC --with-opkglibdir=$OPKG_LIBDIR --enable-shared=no --disable-curl --disable-ssl-curl --disable-gpg --disable-shave >> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE check_result echo_info "Make opkg ...\n" make &>> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE check_result echo_info "Make Install opkg ...\n" make install &>> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE #if meet error when installing opkg, cancel the installation check_result cd $parent_folder echo_info "Successfully installed OPKG.\n" fi } confirm_download() { #avoid repeated reminding if [ "$override_oldfile" == 1 ]; then return $pre_result else override_oldfile=1 fi while true; do #echo_info "[ADT_INST] Files [$1] already exists. If you continue downloading, old files will be overrided." #echo_info "[ADT_INST] Further prompts will not be given if there're more existing files to be downloaded." #echo_info "[ADT_INST] Do you want to continue downloading? Please enter Y/N:" echo_info "\nFile [$1] already exists, which means you've downloaded the qemu kernel and rootfs file(s) before. If you choose continue downloading, old files will be overridden." echo_info "[ADT_INST] Do you want to continue downloading? Please enter Y/N:" read YOCTOADT_INSTALL YOCTOADT_INSTALL=`tr '[a-z]' '[A-Z]'<<<"$YOCTOADT_INSTALL"` if [ "$YOCTOADT_INSTALL" == "Y" ]; then pre_result=0 return 0 elif [ "$YOCTOADT_INSTALL" == "N" ]; then pre_result=1 return 1 fi done } download_file() { local filename=`echo ${1##*/}` if [ -f "$LOCAL_DOWNLOAD/$filename" ]; then confirm_download $filename result="$?" if [ ! "$result" == "0" ]; then return else echo "Removing old file [$1]" rm -rf "$LOCAL_DOWNLOAD/$filename" fi fi echo_info "Downloading file: $filename..." wget "$YOCTOADT_REPO/rootfs/$1" -P $LOCAL_DOWNLOAD --progress=bar:force 2>&1 | tee -a "$YOCTOADT_INSTALL_LOG_FILE" } #Need three input params: # $1 arch_type(arm powerpc x86 mips) # $2 machine(qemuarm beagleboard) # $3 rootfs_image_type (a list of sdk sato minimal lsb) get_image() { local machine=$2 if [ "$1" == "x86" ] || [ "$1" == "x86_64" ]; then kernel="bzImage-$machine.bin" elif [ "$1" == "ppc" ] || [ "$1" == "mips" ]; then kernel="vmlinux-$machine.bin" else kernel="zImage-$machine.bin" fi #echo_info "[ADT_INST] Downloading qemu kernel binary: $qemu_kernel" download_file $machine/$kernel check_result for image_type in $select_rootfs; do #echo_info "[ADT_INST] Downloading rootfs file: core-image-$image_type-$machine.tar.bz2" filename="core-image-$image_type-$machine.tar.bz2" download_file $machine/$filename check_result done } download_images() { select_rootfs_var="\$YOCTOADT_ROOTFS_$1" select_sysroot_image_var="\$YOCTOADT_TARGET_SYSROOT_IMAGE_$1" select_sysroot_var="\$YOCTOADT_TARGET_SYSROOT_LOC_$1" select_machine_var="\$YOCTOADT_TARGET_MACHINE_$1" select_rootfs=`eval echo $select_rootfs_var` select_sysroot_image=`eval echo $select_sysroot_image_var` select_sysroot=`eval echo $select_sysroot_var` select_machine=`eval echo $select_machine_var` if [ -n "$select_sysroot" ]; then select_sysroot=`readlink -m $select_sysroot` fi if [ "$select_rootfs" != "" ]; then if [ $2 ]; then #echo_info "\n############################################################################" #echo_info "# To be downloaded rootfs image details defined in adt_installer.conf" #echo_info "############################################################################" echo_info "# Target architecture:\t\t$1" echo_info "# Target machine:\t\t$select_machine" echo_info "# Root_fs images:\t\t$select_rootfs" echo_info "# Target sysroot image:\t\t$select_sysroot_image" echo_info "# Target sysroot loc:\t\t$select_sysroot" echo_info "\n" #echo_info "############################################################################\n" else get_image $1 $select_machine $select_rootfs fi fi } #Main body of installer clear run_path=`dirname $0` cd $run_path if [ ! -f "scripts/util" ]; then echo -e "[ADT_INST] Error: Script file: util, can't be found under: $run_path!" echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi if [ ! -f "scripts/adt_installer_internal" ]; then echo -e "[ADT_INST] Error: Script file: adt_installer_internal, can't be found under: $run_path!" echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi config_file="adt_installer.conf" if [ ! -f "$config_file" ]; then echo_info "[ADT_INST] Error: Installation configuration file: adt_installer.conf is not found!\n" echo_info "\n##################################################################################" echo_info "# Meet error(s) when installing Yocto ADT. Please check log file for details. " echo_info "##################################################################################\n" exit -1 fi . scripts/data_define . scripts/util if [ -f "$YOCTOADT_INSTALL_LOG_FILE" ]; then rm $YOCTOADT_INSTALL_LOG_FILE fi echo -n "Please enter the install location (default: $DEFAULT_INSTALL_FOLDER): " read INSTALL_FOLDER if [ "$INSTALL_FOLDER" = "" ]; then INSTALL_FOLDER=$DEFAULT_INSTALL_FOLDER fi eval INSTALL_FOLDER=$(printf "%q" "$INSTALL_FOLDER") if [ -d "$INSTALL_FOLDER" ]; then export INSTALL_FOLDER=$(cd "$INSTALL_FOLDER"; pwd) else export INSTALL_FOLDER=$(readlink -m "$INSTALL_FOLDER") fi if [ -n "$(echo $INSTALL_FOLDER|grep ' ')" ]; then echo "The target directory path ($INSTALL_FOLDER) contains spaces. Abort!" exit 1 fi clear usage user_inst_type="$?" validate_config check_result #check adt_repo exist wget --spider $YOCTOADT_REPO 2>&1 | tee -a "$YOCTOADT_INSTALL_LOG_FILE" if grep -q "404 Not Found" $YOCTOADT_INSTALL_LOG_FILE; then echo -e "[ADT_INST] Error: YOCTOADT_REPO does not exist: $YOCTOADT_REPO" echo -e "\n#############################################################################" echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. " echo -e "#############################################################################\n" exit -1 fi #firstly we need to install opkg host install_opkg #Create folders for holding rootfs/qemu images if [ ! -d "$LOCAL_DOWNLOAD" ]; then echo_info "Creating new images downloading folder: $LOCAL_DOWNLOAD ..." mkdir -p $LOCAL_DOWNLOAD fi #downloading required qemu images/rootfs if [ "$user_inst_type" == "0" ]; then override_oldfile=1 else override_oldfile=0 fi for arch_type in $YOCTOADT_TARGETS; do download_images $arch_type done scripts/adt_installer_internal $user_inst_type result="$?" #echo_info "\n############################################################" if [ "$result" == "0" ]; then echo_info "\n############################################################" echo_info "# Yocto ADT has been successfully installed." echo_info "############################################################\n" fi