Index: BLFS/libs/func_dependencies
===================================================================
--- BLFS/libs/func_dependencies	(revision 2ca2992447bd738be73f3a6e761fc3ddc8740578)
+++ BLFS/libs/func_dependencies	(revision 2ca2992447bd738be73f3a6e761fc3ddc8740578)
@@ -0,0 +1,343 @@
+#!/bin/bash
+#
+# $Id$
+#
+set -e
+
+declare -i cntr=0
+declare -a spaceSTR="                                                                   "
+
+#----------------------------#
+generate_dependency_tree() { #
+#----------------------------#
+: <<inline_doc
+    function:   Create a dependency tree for the TARGET
+    input vars: none
+    externals:  vars: TARGET
+                      PKGXML
+		      DEP_LEVEL
+                func: do_dependencies
+    modifies:   vars: PKGXML
+                      BLFS_XML
+    returns:    nothing
+    output:     files: $TARGET.dep
+                       $TARGET-index.xml.tmp
+                       depure.txt
+    on error:   nothing
+    on success: nothing
+inline_doc
+
+  local ENTRY_START
+  local ENTRY_END
+
+  #---------------------
+  # Create the working directory and cd into it
+  if [[ -d $TARGET ]] ; then
+    echo -e "\tERROR: Looks like $TARGET has been already processed."
+    echo -e "\tPlease delete or rename the $TARGET directory.\n"
+    exit 1
+  else
+    mkdir $TARGET && cd $TARGET
+  fi
+
+  #---------------------
+  # XML file of the target package
+  PKGXML=`grep "^$TARGET[[:space:]]" ../packages | cut -f2`
+
+  #---------------------
+  # The BLFS sources directory.
+  BLFS_XML=`echo $PKGXML | sed -e 's,/.*,,'`
+
+  if [[ ! -d ../$BLFS_XML ]] ; then
+    echo -e "\tThe BLFS book sources directory is missing.\n"
+    echo -e "\tExecution aborted.\n"
+    cd .. && rmdir $TARGET
+    exit 1
+  fi
+
+  #---------------------
+  # XInclude stuff
+  ENTRY_START="<xi:include xmlns:xi=\"http://www.w3.org/2003/XInclude\" href=\"../"
+  ENTRY_END="\"/>"
+
+  echo -en "\tGenerating $TARGET dependencies tree ..."
+
+  #---------------------
+  # Create target package dependencies list
+  case $TARGET in
+    # Meta-packages at target level
+    # KDE and Gnome-{core,full} could be made via packages.sh, but not sure yet how.
+    alsa ) # When target "alsa", use all alsa-* packages
+      mkdir dependencies
+      echo -e "alsa-oss\nalsa-firmware\nalsa-tools\nalsa-utils\n \
+               alsa-plugins\nalsa-lib" > dependencies/$TARGET.dep
+      ;;
+    xorg7 ) # At atarget level, add also x-config and x-setup
+      mkdir dependencies
+      echo -e "x-config\nx-setup\nrman\nxterm2\nxorg7-driver\nxorg7-server\nluit\n \
+               xorg7-font\nxorg7-data\nxorg7-app\nxbitmaps\nmesalib\nlibdrm\n \
+               xorg7-lib\nxorg7-util\nxorg7-proto" > dependencies/$TARGET.dep
+      ;;
+    * ) # Default
+      xsltproc --stringparam dependencies $DEP_LEVEL \
+               -o dependencies/$TARGET.dep \
+               ../libs/dependencies.xsl ../$PKGXML
+      ;;
+  esac
+
+  #---------------------
+  # Start with a clean $TARGET-index.xml.tmp file
+  > $TARGET-index.xml.tmp
+
+  #---------------------
+  # Write the XInclude
+  echo -e "    $ENTRY_START$PKGXML$ENTRY_END" >> $TARGET-index.xml.tmp
+
+  #------------------P---
+  # Start with a clean depure.txt file
+  > depure.txt
+
+  #---------------------
+  # If have dependencies, write its XInclude and find sub-dependencies
+  if [[ -f dependencies/$TARGET.dep ]]; then
+    echo -e "Start loop for PKG $TARGET\n" >> depure.txt
+    mkdir xincludes && do_dependencies $TARGET
+  fi
+
+  echo "done"
+}
+
+
+
+#-----------------------#
+do_dependencies()  {    #  Loop to find sub-dependencies  :::WARNING::: THIS IS A RECURVISE FUNCTION
+#-----------------------#
+: <<inline_doc
+    function:   Loop through all the packages and create a sub-dependency tree
+    input vars: $1, package name
+    externals:  vars:  $DEP_LEVEL
+                       $TARGET
+                       $PRINT_SERVER
+                       $KBR5
+                       $GHOSTSCRIPT
+                       $MAILSERVER
+                file:  depure.txt
+                       $TARGET-index.xml.tmp
+                       $PKG.dep
+                       $PKG.inc
+    modifies:   files
+    returns:    nothing
+    output:     file:  $PKG-xinc.tmp
+                       depure.txt
+                       $TARGET-index.xml.tmp
+    on error:   exit
+    on success:
+inline_doc
+
+  set -e
+  local PKG=$1
+  local saveIFS=$IFS
+  local DEP_LV=$DEP_LEVEL
+  local line line2 DEP
+  echo -e "\tPKG is $PKG" >> depure.txt
+  echo -e "\tDEP_LEVEL for $PKG is $DEP_LV\n" >> depure.txt
+
+  #------------------
+  #  If a premade xinclude file exists, use it. If not, create one
+  if [[ -f xincludes/$PKG.xinc ]] ; then
+    echo -e "\tReusing xinclude file for PKG $PKG" >> depure.txt
+    IFS=$'\x0A'
+    for line in `cat xincludes/$PKG.xinc` ; do
+      IFS=$saveIFS
+      # Remove the Xinclude entry if found. We want the most newer one.
+      # Using double quotes to let bash expand variables.
+      # Remove also the empty line created. Can not be done in one step
+      # due that d requires the pattner between /, but we have a lot of /
+      # inside the pattner.
+      sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
+      # Write the XInclude
+      echo -e "$line" >> $TARGET-index.xml.tmp
+    done
+    return
+  fi
+
+  #------------------
+  # Start with a clean $PKG.xinc.tmp file
+  > xincludes/$PKG.xinc.tmp
+  for DEP in `cat dependencies/$PKG.dep`; do
+    # Special packages (a lot of hacks)
+    case $DEP in
+
+      db ) # The proper version of DB is installed in LFS
+        continue ;;
+      hal-requirements ) # ID value don't have their own XML package file
+        continue ;;
+      perl-* | tk-perl )  DEP=perl-modules ;;
+
+        # Orphan links (proper link must be created when generating the book)
+      arts )              DEP=aRts ;; # That should be fixed in the BLFS book
+        # Set values for alternative packages
+        # X is a meta-package, thus handled in another way.
+      LPRng | cups )      DEP=$PRINT_SERVER ;;
+      mitkrb | heimdal )  DEP=$KBR5 ;;
+      gs | espgs )        DEP=$GHOSTSCRIPT ;;
+      server-mail )       DEP=$MAIL_SERVER ;;
+    esac
+
+    #------------------
+    echo -e "\tDEP for $PKG is $DEP" >> depure.txt
+    # Prevent circular dependencies when level 3
+    case $DEP in
+      python )
+        # cracklib-->python-->tk-->X-->linux-pam-->cracklib
+        [[ "$PKG" = "cracklib" ]] && continue
+        ;;
+      jadetex | perl-* | lynx | Links | w3m )
+        # Optional dependencies are runtime only
+        [[ "$PKG" = "docbook-utils" ]] && continue
+        ;;
+      libxslt )
+        # libxml2-->libxslt-->libxml2
+        [[ "$PKG" = "libxml2" ]] && continue
+        ;;
+      openldap | postgresql | $KBR5 )
+        # cyrus-sasl-->several-->cyrus-sasl
+        [[ "$PKG" = "cyrus-sasl" ]] && continue
+        ;;
+      doxygen )
+        # alsa-lib-->doxygen-->graphviz-->jdk-->alsa-lib
+        # Commented out due that it bomb "jdk 3" Why??
+        #[[ "$PKG" = "alsa-lib" ]] && continue
+        # libexif-->doxygen-->graphviz-->php-->libexif
+        [[ "$PKG" = "libexif" ]] && continue
+        ;;
+      qt )
+        # unixodbc-->qt-->unixodbc
+        [[ "$PKG" = "unixodbc" ]] && continue
+        ;;
+      espgs )
+        # sendmail-->espgs-->cups-->php-->sendmail
+        [[ "$PKG" = "$MAIL_SERVER" ]] && continue
+        ;;
+      graphviz )
+        # libexif-->graphviz-->php-->libexif
+        [[ "$PKG" = "libexif" ]] && continue
+        ;;
+      aRts )
+        # esound-->aRts-->esound
+        [[ "$PKG" = "esound" ]] && continue
+        ;;
+      gimp )
+        # imagemagick-->gimp-->imagemagick
+        [[ "$PKG" = "imagemagick" ]] && continue
+        ;;
+    esac
+
+    #------------------
+    echo -e "\tDEP_LEVEL for $DEP is $DEP_LV" >> depure.txt
+    # XML file of dependency package
+    DEP_XML=`grep "^$DEP[[:space:]]" ../packages | cut -f2`
+    echo -e "\t\tDEP_XML is $DEP_XML\n" >> depure.txt
+    case $DEP in
+      x-window-system ) ;; # No page for that (proper link must be created when generating the book)
+      xorg7 ) ;; # This page will be dump in the xorg7.xinc file
+      * )
+        # Remove the Xinclude entry if found
+        sed -e "s,^[[:space:]]*$ENTRY_START$DEP_XML$ENTRY_END,," \
+            -e '/./!d' -i xincludes/$PKG.xinc.tmp
+        # Write the XInclude
+        echo -e "    $ENTRY_START$DEP_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
+        ;;
+    esac
+
+    #------------------
+    # If not already created, create its dependencies list
+    if [[ ! -f dependencies/$DEP.dep ]] ; then
+      case $DEP in
+        alsa-lib ) ;; # Only one optional dependency and is recursive.
+                      # When placed inside the circular dependencies handler
+                      # some packages may bomb. But I don't know yet why
+        # Meta-packages at dependency level (ugly *.dep files, but work for now)
+        alsa ) # When dependency "alsa", use all alsa-* packages
+          echo -e "alsa-oss\nalsa-firmware\nalsa-tools\nalsa-utils\n \
+                   alsa-plugins\nalsa-lib" > dependencies/$DEP.dep
+          ;;
+        x-window-system ) # X11 alternatives
+          echo -e "x-config\nx-setup\n$X11" > dependencies/$DEP.dep
+          ;;
+        xorg7 )
+          echo -e "rman\nxterm2\nxorg7-driver\nxorg7-server\nluit\nxorg7-font\n \
+                   xorg7-data\nxorg7-app\nxbitmaps\nmesalib\nlibdrm\n \
+                   xorg7-lib\nxorg7-util\nxorg7-proto" > dependencies/$DEP.dep
+          ;;
+        * ) xsltproc --stringparam dependencies $DEP_LV \
+               -o dependencies/$DEP.dep ../libs/dependencies.xsl ../$DEP_XML
+          ;;
+      esac
+    fi
+
+    #------------------
+    # If needed, process its dependencies
+    if [[ -f dependencies/$DEP.dep ]] ; then
+      # If a premade xinclude file esist, include it
+      if [[ -f xincludes/$DEP.xinc ]] ; then
+        echo -e "\tReusing xinclude file for PKG $DEP (to solve $PKG)\n" >> depure.txt
+        IFS=$'\x0A'
+        for line2 in `cat xincludes/$DEP.xinc` ; do
+          IFS=$saveIFS
+          # Remove the Xinclude entry if found
+          sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
+          # Write the XInclude
+          echo -e "$line2" >> xincludes/$PKG.xinc.tmp
+        done
+      #------------------
+      # Create the xinclude file
+      else
+        echo -e "\nStart new loop for PKG $DEP (to solve $PKG)\n" >> depure.txt
+	#
+	# >>>>>> THIS IS A RECURSIVE FUNCTION CALL.. BEWARE OF GREMLINS. <<<<<<
+	#
+	# If the recursion depth is not too great this is an acceptable methodology for a script language
+	# However, uncontrolled recursion will cause a seg-fault due to stack issues with local variables.
+	#
+        set +e
+         [[ "${VERBOSITY}" > 0 ]] && echo -ne "\nrecursive call: $((++cntr)) ${spaceSTR:0:$cntr} ${RED}$DEP${OFF}"
+            do_dependencies $DEP
+         [[ "${VERBOSITY}" > 0 ]] && echo -ne  "\nrecursive ret:  $cntr ${spaceSTR:0:$((cntr--))} ${GREEN}$DEP${OFF}\tUsing the new xinclude file for PKG $DEP (to solve $PKG)"
+        set -e
+
+        # Include it when done
+        echo -e "\tUsing the new xinclude file for PKG $DEP (to solve $PKG)\n" >> depure.txt
+        IFS=$'\x0A'
+        for line2 in `cat xincludes/$DEP.xinc` ; do
+          IFS=$saveIFS
+          # Remove the Xinclude entry if found
+          sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
+          # Write the XInclude
+          echo -e "$line2" >> xincludes/$PKG.xinc.tmp
+        done
+      fi
+    fi
+  done
+
+  #------------------
+  if [[ "$PKG" = "xorg7" ]] ; then
+    # Add their XInclude
+    PKG_XML=`grep "^$PKG[[:space:]]" ../packages | cut -f2`
+    echo -e "    $ENTRY_START$PKG_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
+  fi
+
+  #------------------
+  mv xincludes/$PKG.xinc.tmp xincludes/$PKG.xinc
+  echo -e "Using the new xinclude file for PKG $PKG" >> depure.txt
+  IFS=$'\x0A'
+  for line in `cat xincludes/$PKG.xinc` ; do
+    IFS=$saveIFS
+    # Remove the Xinclude entry if found.
+    sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
+    # Write the XInclude
+    echo -e "$line" >> $TARGET-index.xml.tmp
+  done
+
+  echo -e "\nEnd loop for PKG $PKG\n" >> depure.txt
+}
