| ## @file | 
 | # Setup the environment for unix-like systems running a bash-like shell. | 
 | # This file must be "sourced" not merely executed. For example: ". edksetup.sh" | 
 | # | 
 | # Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> | 
 | # This program and the accompanying materials | 
 | # are licensed and made available under the terms and conditions of the BSD License | 
 | # which accompanies this distribution.  The full text of the license may be found at | 
 | # http://opensource.org/licenses/bsd-license.php | 
 | #  | 
 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | 
 | # | 
 |  | 
 | SetWorkspace() { | 
 |  | 
 |   # | 
 |   # If WORKSPACE is already set, then we can return right now | 
 |   # | 
 |   if [ -n "$WORKSPACE" ] | 
 |   then | 
 |     return 0 | 
 |   fi | 
 |  | 
 |   # | 
 |   # Set $WORKSPACE | 
 |   # | 
 |   export WORKSPACE=`pwd` | 
 |  | 
 |   return 0 | 
 |  | 
 | } | 
 |  | 
 | RestorePreviousConfiguration() { | 
 |   # | 
 |   # Restore previous configuration | 
 |   # | 
 |   if [ -z "$CONF_PATH" ] | 
 |   then | 
 |     export CONF_PATH=$WORKSPACE/Conf | 
 |     if [ ! -d $WORKSPACE/Conf ] && [ -n "$PACKAGES_PATH" ] | 
 |     then | 
 |       PACKAGES_PATH=${PACKAGES_PATH//:/ } | 
 |       for DIR in $PACKAGES_PATH | 
 |       do | 
 |         if [ -d $DIR/Conf ] | 
 |         then | 
 |           export CONF_PATH=$DIR/Conf | 
 |           break | 
 |         fi | 
 |       done | 
 |     fi | 
 |   fi | 
 |    | 
 |   PREVIOUS_CONF_FILE=$CONF_PATH/BuildEnv.sh | 
 |   if [ -e $PREVIOUS_CONF_FILE ] | 
 |   then | 
 |     echo Loading previous configuration from $PREVIOUS_CONF_FILE | 
 |     . $PREVIOUS_CONF_FILE | 
 |   fi | 
 | } | 
 |  | 
 | GenerateShellCodeToSetVariable() { | 
 |   VARIABLE=$1 | 
 |   OUTPUT_FILE=$2 | 
 |   VAR_VALUE="echo \${${VARIABLE}}" | 
 |   VAR_VALUE=`eval $VAR_VALUE` | 
 |   echo "if [ -z \"\$${VARIABLE}\" ]"             >> $OUTPUT_FILE | 
 |   echo "then"                                    >> $OUTPUT_FILE | 
 |   echo "  export ${VARIABLE}=${VAR_VALUE}"       >> $OUTPUT_FILE | 
 |   echo "fi"                                      >> $OUTPUT_FILE | 
 | } | 
 |  | 
 | GenerateShellCodeToUpdatePath() { | 
 |   OUTPUT_FILE=$1 | 
 |   echo "if [ -e $EDK_TOOLS_PATH_BIN ]"                        >> $OUTPUT_FILE | 
 |   echo "then"                                                 >> $OUTPUT_FILE | 
 |   echo "  if [ "\${PATH/$EDK_TOOLS_PATH_BIN/}" == "\$PATH" ]" >> $OUTPUT_FILE | 
 |   echo "  then"                                               >> $OUTPUT_FILE | 
 |   echo "    export PATH=$EDK_TOOLS_PATH_BIN:\$PATH"           >> $OUTPUT_FILE | 
 |   echo "  fi"                                                 >> $OUTPUT_FILE | 
 |   echo "fi"                                                   >> $OUTPUT_FILE | 
 | } | 
 |  | 
 | StoreCurrentConfiguration() { | 
 |   # | 
 |   # Write configuration to a shell script to allow for configuration to be | 
 |   # easily reloaded. | 
 |   # | 
 |   OUTPUT_FILE=$CONF_PATH/BuildEnv.sh | 
 |   #echo Storing current configuration into $OUTPUT_FILE | 
 |   echo "# Auto-generated by ${BASH_SOURCE[0]}" > $OUTPUT_FILE | 
 |   GenerateShellCodeToSetVariable WORKSPACE $OUTPUT_FILE | 
 |   GenerateShellCodeToSetVariable EDK_TOOLS_PATH $OUTPUT_FILE | 
 |   GenerateShellCodeToUpdatePath $OUTPUT_FILE | 
 | } | 
 |  | 
 | SetEdkToolsPath() { | 
 |  | 
 |   # | 
 |   # If EDK_TOOLS_PATH is already set, then we can return right now | 
 |   # | 
 |   if [ -n "$EDK_TOOLS_PATH" ] | 
 |   then | 
 |     return 0 | 
 |   fi | 
 |  | 
 |   # | 
 |   # Try $CONF_PATH/EdkTools | 
 |   # | 
 |   if [ -e $CONF_PATH/EdkTools ] | 
 |   then | 
 |     export EDK_TOOLS_PATH=$CONF_PATH/EdkTools | 
 |     return 0 | 
 |   fi | 
 |  | 
 |   # | 
 |   # Try $CONF_PATH/BaseToolsSource | 
 |   # | 
 |   if [ -e $CONF_PATH/BaseToolsSource ] | 
 |   then | 
 |     export EDK_TOOLS_PATH=$CONF_PATH/BaseToolsSource | 
 |     return 0 | 
 |   fi | 
 |  | 
 |   # | 
 |   # Try $WORKSPACE/BaseTools | 
 |   # | 
 |   if [ -e $WORKSPACE/BaseTools ] | 
 |   then | 
 |     export EDK_TOOLS_PATH=$WORKSPACE/BaseTools | 
 |     return 0 | 
 |   fi | 
 |  | 
 |   # | 
 |   # Try $PACKAGES_PATH | 
 |   # | 
 |   if [ -n "$PACKAGES_PATH"] | 
 |   then | 
 |     PACKAGES_PATH=${PACKAGES_PATH//:/ } | 
 |     for DIR in $PACKAGES_PATH | 
 |     do | 
 |       if [ -d $DIR/BaseTools ] | 
 |       then | 
 |         export EDK_TOOLS_PATH=$DIR/BaseTools | 
 |         return 0 | 
 |       fi | 
 |     done | 
 |   fi | 
 |  | 
 |   echo "Unable to determine EDK_TOOLS_PATH" | 
 |   echo | 
 |   echo "You may need to download the 'BaseTools' from buildtools.tianocore.org." | 
 |   echo "After downloading, either create a symbolic link to the source at" | 
 |   echo "\$WORKSPACE/Conf/BaseToolsSource, or set the EDK_TOOLS_PATH environment" | 
 |   echo "variable." | 
 |  | 
 | } | 
 |  | 
 | GetBaseToolsBinSubDir() { | 
 |   # | 
 |   # Figure out a uniq directory name from the uname command | 
 |   # | 
 |   UNAME_DIRNAME=`uname -sm` | 
 |   UNAME_DIRNAME=${UNAME_DIRNAME// /-} | 
 |   UNAME_DIRNAME=${UNAME_DIRNAME//\//-} | 
 |   echo $UNAME_DIRNAME | 
 | } | 
 |  | 
 | GetEdkToolsPathBinDirectory() { | 
 |   # | 
 |   # Figure out a uniq directory name from the uname command | 
 |   # | 
 |   BIN_SUB_DIR=`GetBaseToolsBinSubDir` | 
 |  | 
 |   if [ -e $EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR ] | 
 |   then | 
 |     EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR | 
 |   else | 
 |     EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/Bin/$BIN_SUB_DIR | 
 |   fi | 
 |  | 
 |   echo $EDK_TOOLS_PATH_BIN | 
 | } | 
 |  | 
 | AddDirToStartOfPath() { | 
 |   DIRNAME=$1 | 
 |   PATH=$DIRNAME:$DIRNAME:$DIRNAME:$PATH | 
 |   PATH=${PATH//$DIRNAME:/} | 
 |   PATH=$DIRNAME:$PATH | 
 |   export PATH | 
 | } | 
 |  | 
 | AddEdkToolsToPath() { | 
 |  | 
 |   # | 
 |   # If EDK_TOOLS_PATH is not set, then we cannot update PATH | 
 |   # | 
 |   if [ -z "$EDK_TOOLS_PATH" ] | 
 |   then | 
 |     return 1 | 
 |   fi | 
 |  | 
 |   EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory` | 
 |  | 
 |   AddDirToStartOfPath $EDK_TOOLS_PATH/BinWrappers/PosixLike | 
 |   AddDirToStartOfPath $EDK_TOOLS_PATH_BIN | 
 |  | 
 | } | 
 |  | 
 | CopySingleTemplateFile() { | 
 |  | 
 |   SRC_FILENAME=Conf/$1.template | 
 |   DST_FILENAME=$CONF_PATH/$1.txt | 
 |  | 
 |   if [ -e $DST_FILENAME ] | 
 |   then | 
 |     return | 
 |   fi | 
 |  | 
 |   echo "Copying \$EDK_TOOLS_PATH/$SRC_FILENAME" | 
 |   echo "     to $DST_FILENAME" | 
 |   SRC_FILENAME=$EDK_TOOLS_PATH/$SRC_FILENAME | 
 |   cp $SRC_FILENAME $DST_FILENAME | 
 |  | 
 | } | 
 |  | 
 | CopyTemplateFiles() { | 
 |  | 
 |   CopySingleTemplateFile build_rule | 
 |   CopySingleTemplateFile tools_def | 
 |   CopySingleTemplateFile target | 
 |  | 
 | } | 
 |  | 
 | ScriptMain() { | 
 |  | 
 |   SetWorkspace | 
 |   if [ -z $WORKSPACE ] | 
 |   then | 
 |     echo "Failure setting WORKSPACE" | 
 |     return 1 | 
 |   fi | 
 |  | 
 |   RestorePreviousConfiguration | 
 |  | 
 |   SetEdkToolsPath | 
 |   if [ -z $EDK_TOOLS_PATH ] | 
 |   then | 
 |     return 1 | 
 |   fi | 
 |  | 
 |   AddEdkToolsToPath | 
 |   if [ $? -ne 0 ] | 
 |   then | 
 |     echo "Failure adding EDK Tools into PATH!" | 
 |     return 1 | 
 |   fi | 
 |  | 
 |   StoreCurrentConfiguration | 
 |  | 
 |   echo WORKSPACE: $WORKSPACE | 
 |   echo EDK_TOOLS_PATH: $EDK_TOOLS_PATH | 
 |   echo CONF_PATH: $CONF_PATH | 
 |  | 
 |   CopyTemplateFiles | 
 |  | 
 | } | 
 |  | 
 | # | 
 | # Run the main function | 
 | # | 
 | ScriptMain | 
 |  |