summaryrefslogblamecommitdiffstats
path: root/contrib/mingw/build-autotools.sh
blob: f72ffbe9e119b5b34354a5cba589ab045eb64d19 (plain) (tree)
























































































































































































































































































                                                                                   
#! /bin/sh

terminate()
{
  echo "error: $*" >&2
  if [ $? -eq 0 ]; then
    exit 222
  fi
  exit $?
}

check()
{
  if [ $? -ne 0 ]; then
    terminate $*
  fi
}

source=$(dirname $0)

if [ "$source" = "." ]; then
  source=$(pwd)
fi

build=none
clean=no
prefix=none

while [ $# -gt 0 ];
do
  case $1 in
    -b)
      shift
      build=$1
      ;;
    -c)
      shift
      config=$1
      ;;
    -d)
      set -x
      ;;
    -h)
      usage
      exit 223
      ;;
    -p)
      shift
      prefix=$1
      ;;
    -s)
      shift
      source=$1
      ;;
    *)
      terminate "invalid option (try -h): $1"
      ;;
  esac
  shift
done

#
# dirdepth: find the depth of a directory
#
# $1 : path
#
dirdepth()
{
  local depth=0
  local p=$1
  p=$(echo $p | sed -e "s/^\///g")
  p=$(echo $p | sed -e "s/\/$//g")
  while [ $p != . ];
  do
    depth=$(expr $depth + 1)
    p=$(dirname $p)
  done
  echo $depth
}

#
# build_package()
#
# $1 : package
# $2 : package source
# $3 : tar options
# $4 : patch list
#
build_package()
{
  local mydir=$(pwd)

  if [ ! -f $source/$2 ]; then
    terminate "$1 source is not present or not a file: $2"
  fi

  for p in $4
  do
    if [ ! -f $source/$p ]; then
      terminate "$1 patch is not present or not a file: $p"
    fi
  done

  echo "cd $build"
  cd $build
  check "changing to $build directory"

  echo "tar $3 $source/$2"
  tar $3 $source/$2
  check "extraction of source: $2"

  echo "cd $build/$1"
  cd $build/$1
  check "changing to $build/$1 directory"

  for p in $4
  do
    echo "patch -p0 < $source/$p"
    patch -p0 < $source/$p
    check "patching $autoconf with $p"
  done

  echo "cd $build"
  cd $build
  check "changing to $build directory"

  echo "rm -rf mingw32-$1"
  rm -rf mingw32-$1
  check "removing mingw32-$1 build directory"

  echo "mkdir mingw32-$1"
  mkdir mingw32-$1
  check "creating mingw32-$1"

  echo "cd $build/mingw32-$1"
  cd $build/mingw32-$1
  check "changing to $build/mingw32-$1"

  echo "$build/$1/configure --prefix=$prefix"
  $build/$1/configure --prefix=$prefix
  check "configuring $1"

  echo "make"
  make
  check "building $1"

  echo "make DESTDIR=$build/install-$1 install"
  make DESTDIR=$build/install-$1 install
  check "installing to $build/install-$1"

  echo find $build/install-$1$prefix -type f
  local files=$(find $build/install-$1$prefix -type f)
  check "reading $1 file list"

  of=$prefix/Uninstall/$1-files
  echo "b install-$1$prefix" | sed -e "s/\//\\\\/g" >> $of

  re_path=$(echo $build/install-$1$prefix/ | sed -e 's/\//\\\//g' -e 's/\./\\\./g')

  dirs=
  for f in $files
  do
    if [ $(basename $f) = dir ]; then
      continue
    fi
    f=$(echo $f | sed -e "s/$re_path//g")
    found=no
    fd=$(dirname $f)
    for d in $dirs
    do
      if [ $d = $fd ]; then
        found=yes
        break;
      fi
    done
    if [ $found = no ]; then
      echo "d $fd" | sed -e "s/\//\\\\/g" >> $of
      dirs="$fd $dirs"
    fi
    echo "f $f" | sed -e "s/\//\\\\/g" >> $of
  done

  for d in $dirs
  do
    while [ $d != . ]
    do
      found=no
      for rd in $dirs
      do
        if [ "$d" = "$rd" ]; then
          found=yes
          break
        fi
      done
      if [ $found = no ]; then
        dirs="$dirs $d"
      fi
      d=$(dirname $d)
    done
  done

  sorted_dirs=
  for d in $dirs
  do
    depth=$(dirdepth $d)
    nsp=
    for sd in $sorted_dirs
    do
      if [ ! -z "$d" ]; then
        spd=$(dirdepth $sd)
        if [ $depth -ge $spd ]; then
          sd="$d $sd"
          d=
        fi
      fi
      nsp="$nsp $sd"
    done
    if [ ! -z "$d" ]; then
      nsp="$nsp $d"
    fi
    sorted_dirs=$nsp
  done

  for d in $sorted_dirs
  do
    echo "D $d" | sed -e "s/\//\\\\/g" >> $of
  done

  echo "cd $mydir"
  cd $mydir
  check "changing to $mydir"
}

munch_path()
{
  local p=$1
  if [ $(echo $p | sed -e "s/[a-zA-Z]:.*/yes/g") = yes ]; then
    p=$(echo $p | sed -e "s/^[a-zA-Z]:/\/\0/g" -e "s/://g")
  fi
  echo $p
}

if [ $build = none ]; then
  terminate "no build specified (try -h)"
fi

if [ $prefix = none ]; then
  terminate "no prefix specified (try -h)"
fi

source=$(munch_path $source)
build=$(munch_path $build)
prefix=$(munch_path $prefix)
config=$(munch_path $config)

if [ ! -d $build ]; then
  terminate "build path is not a directory or does not exist: $build"
fi

if [ ! -d $prefix ]; then
  terminate "prefix path is not a directory or does not exist: $prefix"
fi

if [ ! -f $config ]; then
  terminate "could find package configuration file: $config"
fi

. $config

# Need to handle paths carefully as a problem seems to exist
# with autoconf when it is in the path.
if [ $(echo $package_name | sed -e "s/autoconf-.*/yes/g") != yes ]; then
 export PATH=$prefix/bin:$PATH
fi

build_package $package_name \
              $package_source \
              $package_taropts \
              "$package_patches"

exit $?