| #!/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" ]; 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 -i |
| ./configure --prefix=$parent_folder/$LOCAL_OPKG_LOC --enable-shared=no --disable-curl --disable-ssl-curl --disable-gpg >> $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 |
| |