[edk2-devel] [PATCH v2 1/1] Remove bashisms from shell scripts and simplify Python detection

Rebecca Cran rebecca at bsdio.com
Sat May 6 18:29:21 UTC 2023


Remove bashisms from edksetup.sh and BaseTools/BuildEnv. This allows any
POSIX shell to use those scripts (e.g. dash on Debian, or /bin/sh on
FreeBSD), removing the dependency on bash.

Also, since we no longer support Python 2.x and need at least Python
3.6, simplify edksetup.sh. Instead of looping over the output of
  'whereis python3', which on a Linux system might return something like
'python3: /usr/bin/python3 /usr/lib/python3 /etc/python3
/usr/share/python3 /usr/share/man/man1/python3.1.gz', just set
PYTHON_COMMAND to python3.

Signed-off-by: Rebecca Cran <rebecca at bsdio.com>
---
 BaseTools/BuildEnv | 30 +++----
 edksetup.sh        | 89 +++-----------------
 2 files changed, 26 insertions(+), 93 deletions(-)

diff --git a/BaseTools/BuildEnv b/BaseTools/BuildEnv
index 275f4c5901aa..bd6235d74fa7 100755
--- a/BaseTools/BuildEnv
+++ b/BaseTools/BuildEnv
@@ -20,7 +20,8 @@ SetWorkspace() {
   #
   # Set $WORKSPACE
   #
-  export WORKSPACE=`pwd`
+  WORKSPACE=$(pwd)
+  export WORKSPACE
 
   return 0
 
@@ -35,8 +36,7 @@ RestorePreviousConfiguration() {
     export CONF_PATH=$WORKSPACE/Conf
     if [ ! -d $WORKSPACE/Conf ] && [ -n "$PACKAGES_PATH" ]
     then
-      PATH_LIST=${PACKAGES_PATH//:/ }
-      for DIR in $PATH_LIST
+      for DIR in $(echo $PACKAGES_PATH | tr ':' ' ')
       do
         if [ -d $DIR/Conf ]
         then
@@ -70,7 +70,13 @@ 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 "  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
@@ -84,7 +90,7 @@ StoreCurrentConfiguration() {
   #
   OUTPUT_FILE=$CONF_PATH/BuildEnv.sh
   #echo Storing current configuration into $OUTPUT_FILE
-  echo "# Auto-generated by ${BASH_SOURCE[0]}" >| $OUTPUT_FILE
+  echo "# Auto-generated by BaseTools/BuildEnv" >| $OUTPUT_FILE
   GenerateShellCodeToSetVariable WORKSPACE $OUTPUT_FILE
   GenerateShellCodeToSetVariable EDK_TOOLS_PATH $OUTPUT_FILE
   GenerateShellCodeToUpdatePath $OUTPUT_FILE
@@ -130,10 +136,9 @@ SetEdkToolsPath() {
   #
   # Try $PACKAGES_PATH
   #
-  if [ -n "$PACKAGES_PATH"]
+  if [ -n "$PACKAGES_PATH" ]
   then
-    PATH_LIST=${PACKAGES_PATH//:/ }
-    for DIR in $PATH_LIST
+    for DIR in $(echo $PACKAGES_PATH | tr ':' ' ')
     do
       if [ -d $DIR/BaseTools ]
       then
@@ -156,10 +161,7 @@ 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
+  echo $(uname -sm | tr ' ' '-')
 }
 
 GetEdkToolsPathBinDirectory() {
@@ -180,8 +182,6 @@ GetEdkToolsPathBinDirectory() {
 
 AddDirToStartOfPath() {
   DIRNAME=$1
-  PATH=$DIRNAME:$DIRNAME:$DIRNAME:$PATH
-  PATH=${PATH//$DIRNAME:/}
   PATH=$DIRNAME:$PATH
   export PATH
 }
@@ -199,7 +199,7 @@ AddEdkToolsToPath() {
   EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory`
 
   # check if the edk2basetools pip package is available
-  if $PYTHON_COMMAND -c "import edk2basetools" &> /dev/null; then
+  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
diff --git a/edksetup.sh b/edksetup.sh
index 06d2f041e635..cab3a8c113e0 100755
--- a/edksetup.sh
+++ b/edksetup.sh
@@ -20,7 +20,7 @@
 SCRIPTNAME="edksetup.sh"
 RECONFIG=FALSE
 
-function HelpMsg()
+HelpMsg()
 {
   echo "Usage: $SCRIPTNAME [Options]"
   echo
@@ -38,7 +38,7 @@ function HelpMsg()
   echo "source $SCRIPTNAME"
 }
 
-function SetWorkspace()
+SetWorkspace()
 {
   #
   # If WORKSPACE is already set, then we can return right now
@@ -49,10 +49,10 @@ function SetWorkspace()
     return 0
   fi
 
-  if [ ! ${BASH_SOURCE[0]} -ef ./$SCRIPTNAME ] && [ -z "$PACKAGES_PATH" ]
+  if [ ! -f ${SCRIPTNAME} ] && [ -z "$PACKAGES_PATH" ]
   then
-    echo Run this script from the base of your tree.  For example:
-    echo "  cd /Path/To/Edk/Root"
+    echo Source this script from the base of your tree.  For example:
+    echo "  cd /Path/To/Edk2/Clone"
     echo "  . $SCRIPTNAME"
     return 1
   fi
@@ -75,7 +75,7 @@ function SetWorkspace()
   return 0
 }
 
-function SetupEnv()
+SetupEnv()
 {
   if [ -n "$EDK_TOOLS_PATH" ]
   then
@@ -85,9 +85,7 @@ function SetupEnv()
     . $WORKSPACE/BaseTools/BuildEnv
   elif [ -n "$PACKAGES_PATH" ]
   then
-    PATH_LIST=$PACKAGES_PATH
-    PATH_LIST=${PATH_LIST//:/ }
-    for DIR in $PATH_LIST
+    for DIR in $(echo $PACKAGES_PATH | tr ':' ' ')
     do
       if [ -f "$DIR/BaseTools/BuildEnv" ]
       then
@@ -105,81 +103,16 @@ function SetupEnv()
   fi
 }
 
-function SetupPython3()
+SetupPython3()
 {
-  if [ $origin_version ];then
-    origin_version=
-  fi
-  for python in $(whereis python3)
-  do
-    python=$(echo $python | grep "[[:digit:]]$" || true)
-    python_version=${python##*python}
-    if [ -z "${python_version}" ] || (! command -v $python >/dev/null 2>&1);then
-      continue
-    fi
-    if [ -z $origin_version ];then
-      origin_version=$python_version
-      export PYTHON_COMMAND=$python
-      continue
-    fi
-      if [[ "$origin_version" < "$python_version" ]]; then
-      origin_version=$python_version
-      export PYTHON_COMMAND=$python
-    fi
-  done
-  return 0
+  export PYTHON_COMMAND=python3
 }
 
-function SetupPython()
+SourceEnv()
 {
-  if [ $PYTHON_COMMAND ] && [ -z $PYTHON3_ENABLE ];then
-    if ( command -v $PYTHON_COMMAND >/dev/null 2>&1 );then
-      return 0
-    else
-      echo $PYTHON_COMMAND Cannot be used to build or execute the python tools.
-      return 1
-    fi
-  fi
-
-  if [ $PYTHON3_ENABLE ] && [ $PYTHON3_ENABLE == TRUE ]
-  then
-    SetupPython3
-  fi
-
-  if [ $PYTHON3_ENABLE ] && [ $PYTHON3_ENABLE != TRUE ]
-  then
-    if [ $origin_version ];then
-      origin_version=
-    fi
-    for python in $(whereis python2)
-    do
-      python=$(echo $python | grep "[[:digit:]]$" || true)
-      python_version=${python##*python}
-      if [ -z "${python_version}" ] || (! command -v $python >/dev/null 2>&1);then
-        continue
-      fi
-      if [ -z $origin_version ]
-      then
-        origin_version=$python_version
-        export PYTHON_COMMAND=$python
-        continue
-      fi
-      if [[ "$origin_version" < "$python_version" ]]; then
-        origin_version=$python_version
-        export PYTHON_COMMAND=$python
-      fi
-    done
-    return 0
-  fi
-
   SetupPython3
-}
-
-function SourceEnv()
-{
-  SetWorkspace &&
+  SetWorkspace
   SetupEnv
-  SetupPython
 }
 
 I=$#
-- 
2.40.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#104201): https://edk2.groups.io/g/devel/message/104201
Mute This Topic: https://groups.io/mt/98729619/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list