#! /usr/bin/env bash

# file      : build/meta/vcsln
# copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
# license   : GNU GPL v2; see accompanying LICENSE file

# Process VC++ solution templates.
#
# Options:
#
# -b <base-dir>
# -o <output-file>
# -e <project-ext>
# -v <vc-version> {8, 9, 10, 11, 12}
#
# Arguments:
#
# <template-file>
#
trap 'exit 1' ERR

function error ()
{
  echo "$*" 1>&2
}

base=
output=
projext=
vcver=

while [ $# -gt 0 ]; do
  case $1 in
    -b)
      base=$2
      shift 2
      ;;
    -o)
      output=$2
      shift 2
      ;;
    -e)
      projext=$2
      shift 2
      ;;
    -v)
      vcver=$2
      shift 2
      ;;
    *)
      break
      ;;
  esac
done

input=$1

if [ "$input" = "" ]; then
  error "no input file"
  exit 1
fi

if [ "$base" = "" ]; then
  error "no base directory"
  exit 1
fi

if [ "$output" = "" ]; then
  error "no output file"
  exit 1
fi

if [ "$projext" = "" ]; then
  error "no VC++ project file extension"
  exit 1
fi

if [ "$vcver" = "" ]; then
  error "no VC++ version"
  exit 1
fi

m4=m4
u2d=todos

# Assume this script is never found via PATH.
#
meta=`dirname $0`

build="$meta/.."
install=$build/install/install

# Find all the project files.
#
all_proj_files=`find $base -name '*'$projext`

# Filter out subdirectories which already have solution files.
#
proj_files=
proj_names=
for f in $all_proj_files; do
  n=`echo "$f" | sed -e "s%^$base/\(.*\)/.*$%\1%"`

  # If there is no sub-directory for this project, then use the
  # root directory name.
  #
  if [ "$n" = "$f" ]; then
    n=`basename $base`
    d="."
  else
    d=$n
  fi

  while [ "$d" != "." ]; do
    if ls $base/$d/*.sln >/dev/null 2>&1; then
      break
    fi
    d=`dirname $d`
  done

  # If we din't find any solutions, then add this file to the list.
  #
  if [ "$d" = "." ]; then
    proj_names="$proj_names $n"
    proj_files="$proj_files $f"
  fi
done

# Determine available configurations and project uuids.
#
conf=
proj_uuids=
for f in $proj_files; do

  if [ "$conf" = "" ]; then
    if [ "$vcver" = "8" -o "$vcver" = "9" ]; then
      conf=`cat $f | fromdos | sed -n -e \
        '/^[ 	]*<Configuration$/{n;s/[ 	]*Name="\([^"]*\)"$/"\1",/p};d' -`
      conf=`echo $conf | sed -e 's/,$//'`
    else
      conf=`cat $f | fromdos | sed -n -e \
        's/^[ 	]*<ProjectConfiguration Include="\([^"]*\)">$/"\1",/p;d' -`
      conf=`echo $conf | sed -e 's/,$//'`
    fi
  fi

  if [ "$vcver" = "8" -o "$vcver" = "9" ]; then
    uuid=`cat $f | fromdos | sed -n -e \
      's/^[ 	]*ProjectGUID="{\([^}]*\)}"$/\1/p;d'`
  else
    uuid=`cat $f | fromdos | sed -n -e \
      's/^[ 	]*<ProjectGuid>{\([^}]*\)}<\/ProjectGuid>$/\1/p;d'`
  fi

  if [ "$proj_uuids" = "" ]; then
    proj_uuids=$uuid
  else
    proj_uuids="$proj_uuids $uuid"
  fi
done

proj_files=`echo $proj_files | sed -e "s%$base/%%g"`
proj_names=`echo $proj_names | sed -e "s%/%-%g"`

#error $proj_files
#error $proj_names
#error $proj_uuids
#error $conf

export configurations=$conf
export project_files=$proj_files
export project_names=$proj_names
export project_uuids=$proj_uuids

# Make sure the output directory exist.
#
$install -d -m 755 `dirname $output`

$m4 -P -D__meta_base__=$meta $meta/vcsln.m4 $input >$output
$u2d $output
chmod 644 $output
