#!/bin/sh

# This is a the master build script - it is intended to be run by parabuild
# It is called by a wrapper script in the shared repository which sets up
# the environment from the various BuildParams files and does all the build 
# result post-processing.
#
# PLEASE NOTE:
#
# * This script is interpreted on three platforms, including windows and cygwin
#   Cygwin can be tricky....
# * The special style in which python is invoked is intentional to permit
#   use of a native python install on windows - which requires paths in DOS form
# * This script relies heavily on parameters defined in BuildParams
# * The basic convention is that the build name can be mapped onto a mercurial URL,
#   which is also used as the "branch" name.

build_dir_Darwin()
{
  echo build-darwin-i386
}

build_dir_Linux()
{
  echo viewer-linux-i686-$(echo $1 | tr A-Z a-z)
}

build_dir_CYGWIN()
{
  echo build-vc80
}

installer_Darwin()
{
  ls -1td "$(build_dir_Darwin ${last_built_variant:-Release})/newview/"*.dmg 2>/dev/null | sed 1q
}

installer_Linux()
{
  ls -1td "$(build_dir_Linux ${last_built_variant:-Release})/newview/"*.tar.bz2 2>/dev/null | sed 1q
}

installer_CYGWIN()
{
  d=$(build_dir_CYGWIN ${last_built_variant:-Release})
  p=$(sed 's:.*=::' "$d/newview/${last_built_variant:-Release}/touched.bat")
  echo "$d/newview/${last_built_variant:-Release}/$p"
}

pre_build()
{
  local variant="$1"
  local build_dir="$2"
  begin_section "Pre$variant"
  #export PATH="/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/IDE/:$PATH"
  python develop.py \
    --incredibuild \
    --unattended \
    -t $variant \
    -G "$cmake_generator" \
   configure \
    -DVIEWER_CHANNEL:STRING="$viewer_channel" \
    -DVIEWER_LOGIN_CHANNEL:STRING="$login_channel" \
    -DINSTALL_PROPRIETARY:BOOL=ON \
    -DLOCALIZESETUP:BOOL=ON \
    -DPACKAGE:BOOL=ON
  end_section "Pre$variant"
}

build()
{
  local variant="$1"
  local build_dir="$2"
  if $build_viewer
  then
    begin_section "Viewer$variant"
    if python develop.py \
      --incredibuild \
      --unattended \
      -t $variant \
      -G "$cmake_generator" \
      build package
#     && \
#      python develop.py \
#        --incredibuild \
#      --unattended \
#      -t $variant \
#      -G "$cmake_generator" \
#      build package
    then
      echo true >"$build_dir"/build_ok
    else
      echo false >"$build_dir"/build_ok
    fi
    end_section "Viewer$variant"
  fi
}

# This is called from the branch independent script upon completion of all platform builds.
build_docs()
{
  begin_section Docs
  # Stub code to generate docs
  echo Hello world  > documentation.txt
  upload_item docs documentation.txt text/plain
  end_section Docs
}

# Check to see if we were invoked from the wrapper, if not, re-exec ourselves from there
if [ "x$arch" = x ]
then
  top=`hg root`
  if [ -x "$top/../buildscripts/hg/bin/build.sh" ]
  then
    exec "$top/../buildscripts/hg/bin/build.sh" "$top"
  else
    cat <<EOF
This script, if called in a development environment, requires that the branch
independent build script repository be checked out next to this repository.
This repository is located at http://hg.lindenlab.com/parabuild/buildscripts
EOF
    exit 1
  fi
fi

# Check to see if we're skipping the platform
eval '$build_'"$arch" || pass

# Run the version number update script
# File no longer exists in code-sep branch, so let's make sure it exists in order to use it.
if test -f scripts/update_version_files.py ; then
  begin_section UpdateVer
  scripts/update_version_files.py \
          --channel="$viewer_channel" \
          --server_channel="$server_channel" \
          --revision=$revision \
            --verbose \
  || fail update_version_files.py
  end_section UpdateVer
fi

# Now retrieve the version for use in the version manager
# First three parts only, $revision will be appended automatically.
build_viewer_update_version_manager_version=`scripts/get_version.py --viewer-version | sed 's/\.[0-9]*$//'`

# Now run the build
cd indra
succeeded=true
build_processes=
last_built_variant=
for variant in $variants
do
  eval '$build_'"$variant" || continue
  eval '$build_'"$arch"_"$variant" || continue

  # Only the last built arch is available for upload
  last_built_variant="$variant"

  begin_section "Do$variant"
  build_dir=`build_dir_$arch $variant`
  build_dir_stubs="$build_dir/win_setup/$variant"
  rm -rf "$build_dir"
  mkdir -p "$build_dir"
  if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1
  then
    if $build_link_parallel
    then
      begin_section BuildParallel
      ( build "$variant" "$build_dir" > "$build_dir/build.log" 2>&1 ) &
      build_processes="$build_processes $!"
      end_section BuildParallel
    elif $build_coverity
    then
      mkdir -p "$build_dir/cvbuild"
      coverity_config=`cygpath --windows "$coverity_dir/config/coverity_config.xml"`
      coverity_tmpdir=`cygpath --windows "$build_dir/cvbuild"`
      coverity_root=`cygpath --windows "$top/latest"`
      case "$variant" in
      Release)
        begin_section Coverity
        begin_section CovBuild
        "$coverity_dir"/bin/cov-build\
           --verbose 4 \
           --config "$coverity_config"\
           --dir "$coverity_tmpdir"\
             python develop.py -t $variant -G "$cmake_generator" build "$coverity_product"\
          >> "$build_log" 2>&1\
         &&\
        end_section CovBuild\
         &&\
        begin_section CovAnalyze\
         &&\
        "$coverity_dir"/bin/cov-analyze\
           --cxx\
           --security\
           --concurrency\
           --dir "$coverity_tmpdir"\
          >> "$build_log" 2>&1\
         &&\
        end_section CovAnalyze\
         &&\
        begin_section CovCommit\
         &&\
        "$coverity_dir"/bin/cov-commit-defects\
           --product "$coverity_product"\
           --dir "$coverity_tmpdir"\
           --remote "$coverity_server"\
           --strip-path "$coverity_root"\
           --target "$branch/$arch"\
           --version "$revision"\
           --description "$repo: $variant $revision"\
           --user admin --password admin\
          >> "$build_log" 2>&1\
          || record_failure "Coverity Build Failed"
        # since any step could have failed, rely on the enclosing block to close any pending sub-blocks
        end_section Coverity
       ;;
      esac
      if test -r "$build_dir"/cvbuild/build-log.txt
      then
        upload_item log "$build_dir"/cvbuild/build-log.txt text/plain
      fi
    else
      begin_section "Build$variant"
      build "$variant" "$build_dir" >> "$build_log" 2>&1
      if `cat "$build_dir/build_ok"`
      then
        echo so far so good.
      else
        record_failure "Build of \"$variant\" failed."
      fi
      end_section "Build$variant"
    fi
  else
    record_failure "Build Prep for \"$variant\" failed."
  fi
  end_section "Do$variant"
done

# If we are building variants in parallel, wait, then collect results.
# This requires that the build dirs are variant specific
if $build_link_parallel && [ x"$build_processes" != x ]
then
  begin_section WaitParallel
  wait $build_processes
  for variant in $variants
  do
    eval '$build_'"$variant" || continue
    eval '$build_'"$arch"_"$variant" || continue

    begin_section "Build$variant"
    build_dir=`build_dir_$arch $variant`
    build_dir_stubs="$build_dir/win_setup/$variant"
    cat "$build_dir/build.log" >> "$build_log"
    if `cat "$build_dir/build_ok"`
    then
      echo so far so good.
    else
      record_failure "Parallel build of \"$variant\" failed."
    fi
    end_section "Build$variant"
  done
  end_section WaitParallel
fi

# check status and upload results to S3
if $succeeded
then
  if $build_viewer
  then
    begin_section Upload
    # Upload installer - note that ONLY THE FIRST ITEM uploaded as "installer"
    # will appear in the version manager.
    package=$(installer_$arch)
    if [ x"$package" = x ] || test -d "$package"
    then
      # Coverity doesn't package, so it's ok, anything else is fail
      succeeded=$build_coverity
    else
      upload_item installer "$package" binary/octet-stream

      # Upload crash reporter files.
      case "$last_built_variant" in
      Release)
        for symbolfile in $symbolfiles
        do
          upload_item symbolfile "$build_dir/$symbolfile" binary/octet-stream
        done
        ;;
      esac

      # Upload stub installers
      upload_stub_installers "$build_dir_stubs"
    fi
    end_section Upload
  else
    echo skipping viewer
  fi
else
  echo skipping upload of build results due to failed build.
fi

# The branch independent build.sh script invoking this script will finish processing
$succeeded || exit 1
