## @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 - 2016, Intel Corporation. All rights reserved.
# Copyright (c) 2016, Linaro Ltd. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
SetWorkspace() {
#
# If WORKSPACE is already set, then we can return right now
#
if [ -n "$WORKSPACE" ]
then
return 0
fi
#
# Set $WORKSPACE
#
WORKSPACE=$(pwd)
export WORKSPACE
return 0
}
RestorePreviousConfiguration() {
#
# Restore previous configuration
#
if [ -z "$CONF_PATH" ]
then
export CONF_PATH=$WORKSPACE/Conf
if [ ! -d $WORKSPACE/Conf ] && [ -n "$PACKAGES_PATH" ]
then
for DIR in $(echo $PACKAGES_PATH | tr ':' ' ')
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 " FOUND_TOOLS_PATH_BIN=0" >> $OUTPUT_FILE
echo " for DIR in \$(echo \$PATH | tr ':' ' '); do" >> $OUTPUT_FILE
echo " if [ \"\$DIR\" = \"$EDK_TOOLS_PATH_BIN\" ]; then" >> $OUTPUT_FILE
echo " FOUND_TOOLS_PATH_BIN=1" >> $OUTPUT_FILE
echo " fi" >> $OUTPUT_FILE
echo " done" >> $OUTPUT_FILE
echo " if [ \$FOUND_TOOLS_PATH_BIN = 0 ]" >> $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 BaseTools/BuildEnv" >| $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
for DIR in $(echo $PACKAGES_PATH | tr ':' ' ')
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
#
echo $(uname -sm | tr ' ' '-')
}
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:$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`
# check if the edk2basetools pip package is available
if $PYTHON_COMMAND -c "import edk2basetools" > /dev/null 2>&1; then
# if it is, use the pip version of the wrappers
echo "Using Pip Basetools"
AddDirToStartOfPath $EDK_TOOLS_PATH/BinPipWrappers/PosixLike
else
echo "Using EDK2 in-source Basetools"
AddDirToStartOfPath $EDK_TOOLS_PATH/BinWrappers/PosixLike
fi
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
}
#
# Run the main function
#
ScriptMain