source: scripts/funcs/tarball-funcs.sh @ 617118d

clfs-1.2clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since 617118d was 617118d, checked in by Jim Gifford <clfs@…>, 18 years ago

r561@server (orig r559): root | 2005-06-05 02:38:49 -0700
Fixed Directory Structure

  • Property mode set to 100755
File size: 7.0 KB
Line 
1#!/bin/bash
2#
3# Tarball handling functions for cross-lfs build
4# -----------------------------------------------
5# $LastChangedBy$
6# $LastChangedDate$
7# $LastChangedRevision$
8# $HeadURL$
9#
10
11# Check for stuff
12#----------------
13
14# Check for a grep which takes -E
15for dir in "" /bin/ /usr/bin/ /usr/xpg4/bin/ /usr/local/bin/ ; do
16   echo X | ${dir}grep -E X > /dev/null 2>&1 &&
17   {
18      export GREP="${dir}grep"
19      break
20   }
21done
22
23if [ "${GREP}" = "" ]; then
24   echo "install a grep on the system that handles -E"
25   exit 1
26fi
27
28fetch() {
29
30   # find and fetch files with wget by using the google "I'm feeling lucky" search
31   #------------------------------------------------------------------------------
32   # Many, many thanks to Glenn Sommer <glemsom_at_hotpop.com> for this damn cool
33   # bit of scriptage ;-)
34   #
35   # Probably a bit more sanity checking wouldn't go astray... but hey ;-)
36
37   if [ -z "${1}" ]; then
38      echo "fetch: error, no file specified" 2>&1
39      return 1
40   fi
41
42   echo -n " o searching for ${1} tarball ... "
43
44   # We search for "Index of" - hoping to catch some ftp server
45   # And then we search for the filename
46   google_lucky_search="http://www.google.com/search?hl=en&q=%22Index+of%22+${1}&btnI=I%27m+Feeling+Lucky&meta="
47
48   location=`wget -c -U Mozilla ${google_lucky_search} 2>&1 | 
49   grep Location | \
50   head -n 1 | \
51   sed -e 's/Location: \(.*\) \[following\].*$/\1/'`
52   rm -f index.html
53
54   if [ -z "${location}" ]; then
55      echo "failed"
56      return 1
57   fi
58
59   echo -e "found"
60   echo " o retrieving ${location}${1}"
61   wget -c ${location}${1} 2>&1
62
63}
64
65fetch_tarball() { # ${1} should be a package name w version
66   for type in tar.bz2 tar.gz tgz tar bleh; do
67      fetch ${1}.${type}
68      if [ "${?}" = "0" ]; then return 0 ; fi
69      # if the following is true, we failed in our mission
70      if [ "${type}" = "bleh" ]; then return 1 ; fi
71   done
72}
73
74unpack_tarball() { # ${1}=<package-${PACKAGE_VER}> ${2}
75   local pkgname=${1}
76   shift
77   local filelist="${@}"
78   # Easier add of .tgz
79
80   # if PACKAGE_VER was not set for this package, warn but exit with no error.
81   # this is so we can disable the build of a package by not exporting its
82   # PACKAGE_VER variable in plfs-packages
83   echo "${pkgname}" | ${GREP} -E \\-$ > /dev/null 2>&1
84   if [ "${?}" = 0 ]; then
85      echo "unpack_tarball: skipping script ${0}, package version not set"
86      exit 0
87   fi
88   
89   local archive=`ls -t ${TARBALLS}/${pkgname}* 2> /dev/null | \
90      ${GREP} -E ${pkgname}.\(tgz\|tar.gz\|tar.bz2\|tar\)$ | head -n 1`
91
92   if [ -z ${archive} ]; then
93      echo "unpack_tarball: unable to locate tarball for '${pkgname}' in ${TARBALLS} ... exiting"
94      exit 1
95   fi
96
97   case ${archive} in
98      *.gz | *.tgz )   local CAT="gzip -dc" ;;
99      *.bz2 )          local CAT="bzcat"    ;;
100      *.tar )          local CAT="cat"    ;;
101      * )   echo "unpack_tarball: unable to determine tarball type... exiting"
102            exit 1 ;;
103   esac
104
105   # May as well provide a method for passing back the directory the tarball
106   # unpacks to.
107   # Should save some trauma when a tarball doesn't extract to where is expected
108   # ( usually package-${PACKAGE_VER} but not always... )
109   # store in environment as PKGDIR.
110
111   echo -e "\n${BRKLN}"
112   echo -n "Checking tarball install directory... "
113   export PKGDIR=`${CAT} ${archive} | tar -tf - | \
114      head -n 1 | sed -e 's@^\./@@g' -e 's@/.*$@@g'`
115
116   if [ -z ${PKGDIR} ]; then
117      echo "Error: unable to determine tarball contents, exiting"
118      exit 1
119   else
120      echo "${PKGDIR}"
121   fi
122
123   # If we are not doing a full unpack of the tarball, don't delete ${PKGDIR}
124   if [ ! -z "${filelist}" ]; then
125      # prepend ${PKGDIR} to each required file
126      filelist=`echo ${filelist} | \
127         sed "s@\([-+_a-zA-Z0-9/.]* \?\)@${PKGDIR}/\1@g"`
128   elif [ -d ${PKGDIR} ]; then
129      echo -n "Removing existing ${PKGDIR} directory... "
130      rm -rf ${PKGDIR} && echo "DONE" || 
131      echo "Error removing ${PKGDIR}... "; #return 1
132   fi
133
134
135   echo "Unpacking ${archive}"
136   ${CAT} ${archive} | tar -xf - ${filelist} 2> /dev/null &&
137   echo " o ${1} unpacked successfully" ||
138   {
139      echo "unpack_tarball: unable to unpack tarball ${archive}... exiting"
140      exit 1
141   }
142
143   return 0
144}
145
146check_tarballs () {
147   # ${GREP}s through the either the calling script or the script(s)
148   # passed as args for calls to unpack_tarball.
149   # This function expects the scripts to be stored in ${SCRIPTS}.
150   #
151   # It will store the list of packages required in the list PKGS
152   # All will have their variable components unexpanded.
153
154   LIST=""
155   ARGS="${@}"
156   if [ ! -z "${ARGS}" ]; then
157      for script in ${ARGS}; do
158         if [ -f ${SCRIPTS}/${script} ]; then
159            LIST="${LIST} ${SCRIPTS}/${script}"
160         else
161            echo "check_tarballs: build script ${SCRIPTS}/${script} not found... skipping" 1>&2
162         fi
163      done
164   elif [ ! -z ${SELF} -a -f ${SCRIPTS}/${SELF} ]; then
165      LIST=${SCRIPTS}/${SELF}
166   fi
167
168   test -z "${LIST}" &&
169   {
170      echo "check_tarballs: no build scripts found... exiting"
171      exit 1
172   }
173
174   # Retrieve package defs from unpack_tarball calls into a list
175   local PKGS="$( cat ${LIST} | \
176                 ${GREP} -E '^[[:blank:]]*unpack_tarball (\w|-)*\${\w*}' | \
177                 awk '{print $2}' | sort -u )"
178
179   echo -e "\nChecking for required tarballs in ${TARBALLS}\n${BRKLN}"
180
181   # loop through list
182   for pkg in ${PKGS} ; do
183
184      # check if the ${PKG_VER} variable is set in plfs-config
185      # If not ignore the package
186      ver_var=`echo ${pkg} | sed 's@.*\(${.*}\).*@\1@g'`
187      eval ver=${ver_var}
188      if [ -z ${ver} ]; then continue ; fi
189
190      # do variable expansion on ${pkg}
191      eval pkgname=${pkg}
192      # check if this package is used
193      check_pkg_used ${pkgname} || continue
194      echo -n " o Looking for ${pkgname}... "
195      # check for the existence of the tarball
196      #local archive=`ls -t ${TARBALLS}/${pkgname}.@(tgz|tar.gz|tar.bz2) \
197      #  2> /dev/null | head -n 1`
198      local archive=`ls -t ${TARBALLS}/${pkgname}* 2> /dev/null | \
199      ${GREP} -E ${pkgname}.\(tgz\|tar.gz\|tar.bz2\|tar\)$ | head -n 1`
200
201      if [ -z "${archive}" ]; then
202         echo "not found"
203
204         # Attempt to download it from the net
205         cd ${TARBALLS}
206         fetch_tarball ${pkgname} || {
207            echo -e "XXXXXX NOT FOUND: Unable to locate tarball for '${pkgname}'  XXXXXX"
208            exit 1
209         }
210      else
211         echo -e "OK\n   Found: ${archive}"
212      fi
213
214   done
215   echo -e " o ALL OK\n${BRKLN}\n"
216}
217
218# Following two functions are interim hacks for check_patches and
219# check_tarballs to get around conditional packages/patches
220# these will be revisited
221
222check_pkg_used () {
223   case ${1} in
224      glibc-linuxthreads* )
225         #test Y = "${USE_NPTL}" && return 1
226         return 1
227      ;;
228      nptl-* )
229         test Y = "${USE_NPTL}" || return 1
230      ;;
231      udev-* )
232         test Y = "${UDEV}" || return 1
233      ;;
234   esac
235   return 0
236}
237
238# Export functions
239export -f check_tarballs
240export -f fetch
241export -f fetch_tarball
242export -f unpack_tarball
243export -f check_pkg_used
244
Note: See TracBrowser for help on using the repository browser.