-#
-# Copyright (c) 2006 - 2007, Intel Corporation
-# All rights reserved. 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.
-
+## @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"
-
-if [ ! -e ./Tools/BaseTools/BuildEnv.py ]
-then
- echo Run this script from the base of your tree. For example:
- echo " cd /Path/To/Edk/Root"
- echo " . Tools/BuildEnv"
- return
-fi
-
#
-# First, we run a python tool that will ask the user to configure
-# the environment in a (relatively) user friendly manner.
+# Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
#
-python ./Tools/BaseTools/BuildEnv.py $*
+
+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
+ PATH_LIST=${PACKAGES_PATH//:/ }
+ for DIR in $PATH_LIST
+ 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
+ PATH_LIST=${PACKAGES_PATH//:/ }
+ for DIR in $PATH_LIST
+ 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
+ [ $RECONFIG != TRUE ] && 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
+
+}
#
-# The python tool will write ./Conf/BuildEnv.sh to actually configure
-# the environment.
+# Run the main function
#
-if [ -e ./Conf/BuildEnv.sh ]
-then
- . ./Conf/BuildEnv.sh
-else
- echo There was a failure while trying to setup the environment!
-fi
-
+ScriptMain