#!/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. parse_config() { INST_ARCH=`uname -m` case $INST_ARCH in i[3-6]86) OPKG_CONFIG_FILE=$YOCTOADT_OPKG_CONF_FILE_32 OECORE_NATIVE_SYSROOT="$INSTALL_FOLDER/sysroots/$INST_ARCH$SDK_VENDOR-linux/" ;; x86_64) OPKG_CONFIG_FILE=$YOCTOADT_OPKG_CONF_FILE_64 OECORE_NATIVE_SYSROOT="$INSTALL_FOLDER/sysroots/x86_64$SDK_VENDOR-linux/" ;; *) echo_info "[ADT_INST] Error: Installation Machine is not supported!" exit -1 ;; esac } get_sudo_app() { username=$(id -nu) # find the owner of the parent dir=$1 while [ 1 ]; do if [ -d $dir ]; then owner=$(stat -c %U $dir) break else dir=$(dirname $dir) fi done if [ "$owner" = "$username" ]; then true else echo sudo fi } # this function accepts arch_type (x86, x86_64, arm, ppc, mips) as the first # argument, returning the location of the target rootfs get_target_rootfs_location() { [ -z "$1" ] && return arch_type=$1 # rootfs extraction directory target_sysroot_var="\$YOCTOADT_TARGET_SYSROOT_LOC_$arch_type" target_sysroot=`eval echo $target_sysroot_var` if [ "$target_sysroot" == "" ]; then return else echo "`readlink -m $target_sysroot`" fi } #let us install a qemu-native firstly #installation step 2 install_native_sdk() { echo_info "\nStart installing selected native ADT for archs: $YOCTOADT_TARGETS..." # where the packages are installed. NATIVE_INSTALL_DIR=$INSTALL_FOLDER if [ -d "$INSTALL_FOLDER" ]; then echo_info "\nNative ADT installation directory \"$INSTALL_FOLDER\" already exists! Continue installation will override its contents!" confirm_install $1 fi #Now begin to install native sdk and extract qemu rootfs which needs privilege rights #depending on the install location SUDO=$(get_sudo_app $NATIVE_INSTALL_DIR) if [ -n "$SUDO" ]; then echo_info "#######################################################################" echo_info "Please note from this point on installation requires sudo password ..." echo_info "#######################################################################" fi #we need to make this directory firstly since opkg need to use it. OPKG_LOCK_DIR="$NATIVE_INSTALL_DIR/$OPKG_LIBDIR/opkg" if [ ! -d "$OPKG_LOCK_DIR" ]; then $SUDO mkdir -p $OPKG_LOCK_DIR echo_info "Successfully create directory $OPKG_LOCK_DIR. " #if user delete /opt/xxx, while dangling folders there, report error elif [ ! -d "$INSTALL_FOLDER" ]; then echo_info "\nDangling opkg cache folder $OPKG_LOCK_DIR detected. Continue installation will remove the folder!" confirm_install $1 $SUDO rm -rf $OPKG_LOCK_DIR $SUDO mkdir -p $OPKG_LOCK_DIR #if user are updating installing, just let him/her go, give her/him prompt else echo_info "ADT has already been installed. Will update its contents..." fi #first update repository if [ "x$SUDO" = "x" ]; then OPKG_CMD="$LOCAL_OPKG_LOC/bin/opkg-cl" else OPKG_CMD="sudo -E $LOCAL_OPKG_LOC/bin/opkg-cl" fi echo_info "Updating opkg..." $OPKG_CMD -f $OPKG_CONFIG_FILE -o $NATIVE_INSTALL_DIR update &>> $YOCTOADT_INSTALL_LOG_FILE check_result echo_info "opkg update process ended..." #install below must sdk-host packages OPKG_INSTALL_CMD="$OPKG_CMD " OPKG_INSTALL_NATIVE_CMD="$OPKG_INSTALL_CMD --force-overwrite -f $OPKG_CONFIG_FILE -o $NATIVE_INSTALL_DIR install" BASE_HOSTSDK_PKGNAMES="pseudo opkg pkgconfig libtool autoconf automake" for pkg in $BASE_HOSTSDK_PKGNAMES; do echo_info "Installing ${pkg} nativesdk ...\n" $OPKG_INSTALL_NATIVE_CMD nativesdk-${pkg} &>> $YOCTOADT_INSTALL_LOG_FILE check_result done for target_type in $YOCTOADT_TARGETS; do machine_var="\$YOCTOADT_TARGET_MACHINE_$target_type" machine=`eval echo $machine_var` echo_info "Installing cross canadian packages for $machine ..." $OPKG_INSTALL_NATIVE_CMD packagegroup-cross-canadian-$machine &>> $YOCTOADT_INSTALL_LOG_FILE check_result target_sysroot=`get_target_rootfs_location $target_type` [ -z "$target_sysroot" ] && continue # get the environment setup script paths: original (the one before relocation) # and relocated env_script_original=`$OPKG_CMD -f $OPKG_CONFIG_FILE -o $NATIVE_INSTALL_DIR files meta-environment-$machine|\ grep environment-setup` env_script_relocated=$INSTALL_FOLDER/${env_script_original##*/} # opkg will not install packagegroup-cross-canadian package if it was already # installed. So, the environment script is in one place or the other. [ -e "$INSTALL_FOLDER/$env_script_original" ] && env_script=$INSTALL_FOLDER/$env_script_original [ -e "$env_script_original" ] && env_script=$env_script_original [ -e "$env_script_relocated" ] && env_script=$env_script_relocated $SUDO sed -i -e "s%SDKTARGETSYSROOT=.*%SDKTARGETSYSROOT=$target_sysroot%g" $env_script done if [ "$YOCTOADT_QEMU" == "Y" ] || [ "$YOCTOADT_QEMU" == "y" ]; then echo_info "\nInstalling qemu native ..." $OPKG_INSTALL_NATIVE_CMD nativesdk-qemu &>> $YOCTOADT_INSTALL_LOG_FILE check_result $OPKG_INSTALL_NATIVE_CMD nativesdk-qemu-helper &>> $YOCTOADT_INSTALL_LOG_FILE check_result fi if [ "$YOCTOADT_NFS_UTIL" == "Y" ] || [ "$YOCTOADT_NFS_UTIL" == "y" ]; then echo_info "\nInstalling unfs ..." $OPKG_INSTALL_NATIVE_CMD nativesdk-unfs3 &>> $YOCTOADT_INSTALL_LOG_FILE check_result fi # Lose the ./opt/${DISTRO}/${SDK_VERSION} part, we don't really need to keep # the entire directory structure. We could patch opkg to do that but it's far # simpler to do that here and achieve the same result. # This is done in two steps: if [ -d $NATIVE_INSTALL_DIR/$DEFAULT_INSTALL_FOLDER ]; then # Step 1: copy ./opt/${DISTRO}/${SDK_VERSION} contents to $NATIVE_INSTALL_DIR. # We cannot use move if $NATIVE_INSTALL_DIR is not empty (for example: contains # another SDK) $SUDO cp -r $NATIVE_INSTALL_DIR/$DEFAULT_INSTALL_FOLDER/* $NATIVE_INSTALL_DIR # delete the source directory now $SUDO rm -rf $NATIVE_INSTALL_DIR/$DEFAULT_INSTALL_FOLDER/* # Step 2: Delete the ./opt/${DISTRO}/${SDK_VERSION} directories too, they should be empty dir=$NATIVE_INSTALL_DIR/$DEFAULT_INSTALL_FOLDER while [ "$dir" != "$NATIVE_INSTALL_DIR" ]; do # if the user chose / as the install folder, then we should leave /opt in place if [ "$dir" = "/opt" ]; then break fi # try to delete the directory, only if it's empty $SUDO rmdir $dir if [ $? -ne 0 ]; then break fi # go to the next directory dir=$(dirname $dir) done # Step 3: Rewrite the *.list files to contain the correct paths $SUDO find $NATIVE_INSTALL_DIR/var/lib/opkg -type f -exec sed -i -e '#^$DEFAULT_INSTALL_FOLDER#$NATIVE_INSTALL_DIR#' {} \; fi # Link the ld.so.cache file into the hosts filesystem if [ ! -f "$OECORE_NATIVE_SYSROOT/etc/ld.so.cache" ]; then echo_info "Link the ld.so.cache file into the host filesystem" $SUDO ln -s /etc/ld.so.cache $OECORE_NATIVE_SYSROOT/etc/ld.so.cache check_result fi # relocate binaries echo_info "\nRelocating binaries ..." escaped_sdkpath=$(echo $DEFAULT_INSTALL_FOLDER |sed -e "s:[\+\.]:\\\\\\\\\0:g") # We don't change the script in-place since we may want the user to re-run # adt-installer script sed -e "s:##DEFAULT_INSTALL_DIR##:$escaped_sdkpath:" scripts/relocate_sdk.py > scripts/relocate_sdk_tmp.py chmod +x scripts/relocate_sdk_tmp.py dl_path=$(find $OECORE_NATIVE_SYSROOT/lib -name "ld-linux*") executable_files=$(find $OECORE_NATIVE_SYSROOT -type f -perm /111) $SUDO scripts/relocate_sdk_tmp.py $INSTALL_FOLDER $dl_path $executable_files check_result # replace /opt/${DISTRO}/${SDK_VERSION} with the install folder in all configs env_setup_script=$(find $NATIVE_INSTALL_DIR/ -name "environment-setup-*") $SUDO sed -i -e "s:$DEFAULT_INSTALL_FOLDER:$NATIVE_INSTALL_DIR:g" $env_setup_script find $OECORE_NATIVE_SYSROOT -type f -exec file '{}' \; | grep ":.*\(ASCII\|script\|source\).*text" | \ cut -d':' -f1 | xargs $SUDO sed -i -e "s:$DEFAULT_INSTALL_FOLDER:$NATIVE_INSTALL_DIR:g" # change all symlinks pointing to /opt/${DISTRO}/${SDK_VERSION} for l in $(find $NATIVE_INSTALL_DIR -type l); do $SUDO ln -sfn $(readlink $l|sed -e "s:$DEFAULT_INSTALL_FOLDER:$NATIVE_INSTALL_DIR:") $l done # find out all perl scripts in $OECORE_NATIVE_SYSROOT and modify them # replacing the host perl with SDK perl. for perl_script in $($SUDO grep -m 1 "^#!.*perl" -rl $OECORE_NATIVE_SYSROOT); do $SUDO sed -i -e "s:^#! */usr/bin/perl.*:#! /usr/bin/env perl:g" -e \ "s: /usr/bin/perl: /usr/bin/env perl:g" $perl_script done echo_info "\nSuccessfully installed selected native ADT!" } #Need three input params, $1 -- arch_type(arm powerpc x86 mips) #2 -- user installation type #customer or scilent install_target() { target_sysroot=`get_target_rootfs_location $1` [ -z "$target_sysroot" ] && return 0 target_sysroot_image_var="\$YOCTOADT_TARGET_SYSROOT_IMAGE_$1" target_sysroot_image=`eval echo $target_sysroot_image_var` if [ "$target_sysroot_image" == "" ]; then echo_info "[ADT_INST] Error: YOCTOADT_TARGET_SYSROOT_IMAGE_$1 selection is empty, failed to create target sysroot!" return 1 fi echo_info "Installing target sysroot for arch: $1, rootfs type: $target_sysroot_image, location: $target_sysroot" target_machine_var="\$YOCTOADT_TARGET_MACHINE_$1" target_machine=`eval echo $target_machine_var` sysroot_image_name="core-image-$target_sysroot_image-$target_machine.tar.bz2" #echo_info "Extracting rootfs: $sysroot_image_name, using pseudo..." # sudo password might be needed to install the target sysroot SUDO=$(get_sudo_app $target_sysroot) $SUDO scripts/extract_rootfs $sysroot_image_name $target_sysroot $OECORE_NATIVE_SYSROOT $user_inst_type check_result } #Main part . scripts/data_define . scripts/util parse_config #secondly we will start to install native tools user_inst_type=$1 install_native_sdk $user_inst_type check_result for arch_type in $YOCTOADT_TARGETS; do install_target $arch_type check_result done