#!/bin/bash

# -----------------------------------------------------------------------------

# Скрипт для формирования log'ов
. `dirname $0`/scr.log

# ---------- Настройки --------------------------------------------------------

# Абсолютный путь до каталога с исходниками и скриптами
d=`dirname $0`
GCOV_DIR=`cd $d ; pwd`

# Настройки по умолчанию
BUILD_DIR="."
LOG_FILE="/dev/null"
LOG_MODE="both"

check_options()
{
  if [ "$MODE" = "cross" ] ; then
    # В кросс-режиме задаём компилятор по умолчанию, поскольку он чужой
    # и конкретные настройки снаружи нам незачем
    [ -z "$CC" ] && CC="gcc-9.3.0"
    [ -z "$CFLAGS" ] && CFLAGS="-O2"
  elif [ "$MODE" = "native" ] ; then
    # В native-режиме потребуем обязательно задавать компилятор
    [ -z "$CC" ] && log_fatal_error "Не задан параметр CC"
    [ -z "$CFLAGS" ] && log_fatal_error "Не задан параметр CFLAGS"
  else
    log_fatal_error "Некорректно значение MODE=$MODE"
  fi

  # В native-сборке флаги, задающие режим компиляции, мы устанавливаем
  # сами на освновании параметра TARGET. В cross-режиме значение TARGET
  # вроде бы как неактуально
  if [ "$MODE" = "native" ]; then
    case "$TARGET" in
      e2k)
        CC="$CC -mptr64"
        ;;
      e90-v9)
        CC="$CC -m64"
        ;;
      *)
        log_fatal_error "Неизвестное значение TARGET=$TARGET"
        ;;
    esac
  fi

  # По текущему состоянию значение PREFIX неакутально, потому как не видели
  # завязок на абсолютный путь, но для общности параметр введём, чтобы
  # в случае чего в точках вызова не пришлось ничего переделывать и выглядело
  # симметрично с остальными сборками
  [ -z "$PREFIX" ] && log_fatal_error "Не указана опция PREFIX"

  [ -z "$INSTALL_DIR" ] && INSTALL_DIR=$PREFIX
}

build()
{
  local ar=`$CC -print-prog-name=ar`
  local src_dir
  local idir1 idir2 idir3 idir4 idir5 idir6 idir7 idir8 idir9

  # Объединим флаги, чтобы меньше было возни
  CC="$CC $CFLAGS"

  # Каталоги, откуда будут подключаться заголовочные файлы
  idir1="$GCOV_DIR/config/build-x86_64-unknown-linux-gnu/libiberty"
  idir2="$GCOV_DIR/config/host-x86_64-unknown-linux-gnu/libcpp"
  idir3="$GCOV_DIR/config/host-x86_64-unknown-linux-gnu/libdecnumber"
  idir4="$GCOV_DIR/config/host-x86_64-unknown-linux-gnu/gcc"
  idir5="$GCOV_DIR/gcc-4.7.3/libcpp"
  idir6="$GCOV_DIR/gcc-4.7.3/gcc"
  idir7="$GCOV_DIR/gcc-4.7.3/include"
  idir8="$GCOV_DIR/gcc-4.7.3/libcpp/include"
  idir9="$GCOV_DIR/gcc-4.7.3/libdecnumber"

  # Сборка libcpp
  src_dir="$GCOV_DIR/gcc-4.7.3/libcpp"
  out_dir="$BUILD_DIR/libcpp"
  log_cmd "mkdir -p $out_dir"
  cflags_l="-I$idir2 -I$idir5 -I$idir7 -I$idir8" 
  log_cmd "$CC $cflags_l $src_dir/charset.c -c -o $out_dir/charset.o"
  log_cmd "$CC $cflags_l $src_dir/directives-only.c -c -o $out_dir/directives-only.o"
  log_cmd "$CC $cflags_l $src_dir/directives.c -c -o $out_dir/directives.o"
  log_cmd "$CC $cflags_l $src_dir/errors.c -c -o $out_dir/errors.o"  
  log_cmd "$CC $cflags_l $src_dir/expr.c -c -o $out_dir/expr.o"
  log_cmd "$CC $cflags_l $src_dir/files.c -c -o $out_dir/files.o"
  log_cmd "$CC $cflags_l $src_dir/identifiers.c -c -o $out_dir/identifiers.o"
  log_cmd "$CC $cflags_l $src_dir/init.c -c -o $out_dir/init.o"
  log_cmd "$CC $cflags_l $src_dir/lex.c -c -o $out_dir/lex.o"
  log_cmd "$CC $cflags_l $src_dir/line-map.c -c -o $out_dir/line-map.o"
  log_cmd "$CC $cflags_l $src_dir/macro.c -c -o $out_dir/macro.o"
  log_cmd "$CC $cflags_l $src_dir/mkdeps.c -c -o $out_dir/mkdeps.o"
  log_cmd "$CC $cflags_l $src_dir/pch.c -c -o $out_dir/pch.o"
  log_cmd "$CC $cflags_l $src_dir/symtab.c -c -o $out_dir/symtab.o"
  log_cmd "$CC $cflags_l $src_dir/traditional.c -c -o $out_dir/traditional.o"
  log_cmd "$ar cru $out_dir/libcpp.a $out_dir/charset.o $out_dir/directives.o $out_dir/directives-only.o $out_dir/errors.o $out_dir/expr.o $out_dir/files.o $out_dir/identifiers.o $out_dir/init.o $out_dir/lex.o $out_dir/line-map.o $out_dir/macro.o $out_dir/mkdeps.o $out_dir/pch.o $out_dir/symtab.o $out_dir/traditional.o"

  # Сборка libiberty
  src_dir="$GCOV_DIR/gcc-4.7.3/libiberty"
  out_dir="$BUILD_DIR/libiberty"
  log_cmd "mkdir -p $out_dir"
  cflags_l="-DHAVE_CONFIG_H -I$idir1 -I$idir7" 
  log_cmd "$CC $cflags_l $src_dir/regex.c -c -o $out_dir/regex.o"
  log_cmd "$CC $cflags_l $src_dir/cplus-dem.c -c -o $out_dir/cplus-dem.o"
  log_cmd "$CC $cflags_l $src_dir/cp-demangle.c -c -o $out_dir/cp-demangle.o"
  log_cmd "$CC $cflags_l $src_dir/md5.c -c -o $out_dir/md5.o"
  log_cmd "$CC $cflags_l $src_dir/sha1.c -c -o $out_dir/sha1.o"
  log_cmd "$CC $cflags_l $src_dir/alloca.c -c -o $out_dir/alloca.o"
  log_cmd "$CC $cflags_l $src_dir/argv.c -c -o $out_dir/argv.o"
  log_cmd "$CC $cflags_l $src_dir/choose-temp.c -c -o $out_dir/choose-temp.o"
  log_cmd "$CC $cflags_l $src_dir/concat.c -c -o $out_dir/concat.o"
  log_cmd "$CC $cflags_l $src_dir/cp-demint.c -c -o $out_dir/cp-demint.o"
  log_cmd "$CC $cflags_l $src_dir/crc32.c -c -o $out_dir/crc32.o"
  log_cmd "$CC $cflags_l $src_dir/dyn-string.c -c -o $out_dir/dyn-string.o"
  log_cmd "$CC $cflags_l $src_dir/fdmatch.c -c -o $out_dir/fdmatch.o"
  log_cmd "$CC $cflags_l $src_dir/fibheap.c -c -o $out_dir/fibheap.o"
  log_cmd "$CC $cflags_l $src_dir/filename_cmp.c -c -o $out_dir/filename_cmp.o"
  log_cmd "$CC $cflags_l $src_dir/floatformat.c -c -o $out_dir/floatformat.o"
  log_cmd "$CC $cflags_l $src_dir/fnmatch.c -c -o $out_dir/fnmatch.o"
  log_cmd "$CC $cflags_l $src_dir/fopen_unlocked.c -c -o $out_dir/fopen_unlocked.o"
  log_cmd "$CC $cflags_l $src_dir/getopt.c -c -o $out_dir/getopt.o"
  log_cmd "$CC $cflags_l $src_dir/getopt1.c -c -o $out_dir/getopt1.o"
  log_cmd "$CC $cflags_l $src_dir/getpwd.c -c -o $out_dir/getpwd.o"
  log_cmd "$CC $cflags_l $src_dir/getruntime.c -c -o $out_dir/getruntime.o"
  log_cmd "$CC $cflags_l $src_dir/hashtab.c -c -o $out_dir/hashtab.o"
  log_cmd "$CC $cflags_l $src_dir/hex.c -c -o $out_dir/hex.o"
  log_cmd "$CC $cflags_l $src_dir/lbasename.c -c -o $out_dir/lbasename.o"
  log_cmd "$CC $cflags_l $src_dir/lrealpath.c -c -o $out_dir/lrealpath.o"
  log_cmd "$CC $cflags_l $src_dir/make-relative-prefix.c -c -o $out_dir/make-relative-prefix.o"
  log_cmd "$CC $cflags_l $src_dir/make-temp-file.c -c -o $out_dir/make-temp-file.o"
  log_cmd "$CC $cflags_l $src_dir/objalloc.c -c -o $out_dir/objalloc.o"
  log_cmd "$CC $cflags_l $src_dir/obstack.c -c -o $out_dir/obstack.o"
  log_cmd "$CC $cflags_l $src_dir/partition.c -c -o $out_dir/partition.o"
  log_cmd "$CC $cflags_l $src_dir/pexecute.c -c -o $out_dir/pexecute.o"
  log_cmd "$CC $cflags_l $src_dir/physmem.c -c -o $out_dir/physmem.o"
  log_cmd "$CC $cflags_l $src_dir/pex-common.c -c -o $out_dir/pex-common.o"
  log_cmd "$CC $cflags_l $src_dir/pex-one.c -c -o $out_dir/pex-one.o"
  log_cmd "$CC $cflags_l $src_dir/pex-unix.c -c -o $out_dir/pex-unix.o"
  log_cmd "$CC $cflags_l $src_dir/safe-ctype.c -c -o $out_dir/safe-ctype.o"
  log_cmd "$CC $cflags_l $src_dir/simple-object.c -c -o $out_dir/simple-object.o"
  log_cmd "$CC $cflags_l $src_dir/simple-object-coff.c -c -o $out_dir/simple-object-coff.o"
  log_cmd "$CC $cflags_l $src_dir/simple-object-elf.c -c -o $out_dir/simple-object-elf.o"
  log_cmd "$CC $cflags_l $src_dir/simple-object-mach-o.c -c -o $out_dir/simple-object-mach-o.o"
  log_cmd "$CC $cflags_l $src_dir/sort.c -c -o $out_dir/sort.o"
  log_cmd "$CC $cflags_l $src_dir/spaces.c -c -o $out_dir/spaces.o"
  log_cmd "$CC $cflags_l $src_dir/splay-tree.c -c -o $out_dir/splay-tree.o"
  log_cmd "$CC $cflags_l $src_dir/stack-limit.c -c -o $out_dir/stack-limit.o"
  log_cmd "$CC $cflags_l $src_dir/strerror.c -c -o $out_dir/strerror.o"
  log_cmd "$CC $cflags_l $src_dir/strsignal.c -c -o $out_dir/strsignal.o"
  log_cmd "$CC $cflags_l $src_dir/timeval-utils.c -c -o $out_dir/timeval-utils.o"
  log_cmd "$CC $cflags_l $src_dir/unlink-if-ordinary.c -c -o $out_dir/unlink-if-ordinary.o"
  log_cmd "$CC $cflags_l $src_dir/xatexit.c -c -o $out_dir/xatexit.o"
  log_cmd "$CC $cflags_l $src_dir/xexit.c -c -o $out_dir/xexit.o"
  log_cmd "$CC $cflags_l $src_dir/xmalloc.c -c -o $out_dir/xmalloc.o"
  log_cmd "$CC $cflags_l $src_dir/xmemdup.c -c -o $out_dir/xmemdup.o"
  log_cmd "$CC $cflags_l $src_dir/xstrdup.c -c -o $out_dir/xstrdup.o"
  log_cmd "$CC $cflags_l $src_dir/xstrerror.c -c -o $out_dir/xstrerror.o"
  log_cmd "$CC $cflags_l $src_dir/xstrndup.c -c -o $out_dir/xstrndup.o"
  log_cmd "$CC $cflags_l $src_dir/setproctitle.c -c -o $out_dir/setproctitle.o"
  log_cmd "$ar cru $out_dir/libiberty.a $out_dir/regex.o $out_dir/cplus-dem.o $out_dir/cp-demangle.o $out_dir/md5.o $out_dir/sha1.o $out_dir/alloca.o $out_dir/argv.o $out_dir/choose-temp.o $out_dir/concat.o $out_dir/cp-demint.o $out_dir/crc32.o $out_dir/dyn-string.o $out_dir/fdmatch.o $out_dir/fibheap.o $out_dir/filename_cmp.o $out_dir/floatformat.o $out_dir/fnmatch.o $out_dir/fopen_unlocked.o $out_dir/getopt.o $out_dir/getopt1.o $out_dir/getpwd.o $out_dir/getruntime.o $out_dir/hashtab.o $out_dir/hex.o $out_dir/lbasename.o $out_dir/lrealpath.o $out_dir/make-relative-prefix.o $out_dir/make-temp-file.o $out_dir/objalloc.o $out_dir/obstack.o $out_dir/partition.o $out_dir/pexecute.o $out_dir/physmem.o $out_dir/pex-common.o $out_dir/pex-one.o $out_dir/pex-unix.o $out_dir/safe-ctype.o $out_dir/simple-object.o $out_dir/simple-object-coff.o $out_dir/simple-object-elf.o $out_dir/simple-object-mach-o.o $out_dir/sort.o $out_dir/spaces.o $out_dir/splay-tree.o $out_dir/stack-limit.o $out_dir/strerror.o $out_dir/strsignal.o $out_dir/timeval-utils.o $out_dir/unlink-if-ordinary.o $out_dir/xatexit.o $out_dir/xexit.o $out_dir/xmalloc.o $out_dir/xmemdup.o $out_dir/xstrdup.o $out_dir/xstrerror.o $out_dir/xstrndup.o  $out_dir/setproctitle.o"

  # Сборка libdecnumber
  src_dir="$GCOV_DIR/gcc-4.7.3/libdecnumber"
  out_dir="$BUILD_DIR/libdecnumber"
  log_cmd "mkdir -p $out_dir"
  cflags_l="-I$idir3 -I$idir9"
  log_cmd "$CC $cflags_l $src_dir/decNumber.c -c -o $out_dir/decNumber.o"
  log_cmd "$CC $cflags_l $src_dir/decContext.c -c -o $out_dir/decContext.o"
  log_cmd "$CC $cflags_l $src_dir/bid/decimal32.c -c -o $out_dir/decimal32.o"
  log_cmd "$CC $cflags_l $src_dir/bid/decimal64.c -c -o $out_dir/decimal64.o"
  log_cmd "$CC $cflags_l $src_dir/bid/decimal128.c -c -o $out_dir/decimal128.o"
  log_cmd "$CC $cflags_l $src_dir/bid/bid2dpd_dpd2bid.c -c -o $out_dir/bid2dpd_dpd2bid.o"
  log_cmd "$CC $cflags_l $src_dir/bid/host-ieee32.c -c -o $out_dir/host-ieee32.o"
  log_cmd "$CC $cflags_l $src_dir/bid/host-ieee64.c -c -o $out_dir/host-ieee64.o"
  log_cmd "$CC $cflags_l $src_dir/bid/host-ieee128.c -c -o $out_dir/host-ieee128.o"
  log_cmd "$ar cru $out_dir/libdecnumber.a $out_dir/decNumber.o $out_dir/decContext.o $out_dir/decimal32.o $out_dir/decimal64.o $out_dir/decimal128.o $out_dir/bid2dpd_dpd2bid.o $out_dir/host-ieee32.o $out_dir/host-ieee64.o $out_dir/host-ieee128.o"

  # Сборка libcommon
  src_dir="$GCOV_DIR/gcc-4.7.3/gcc"
  out_dir="$BUILD_DIR/libcommon"
  log_cmd "mkdir -p $out_dir"
  cflags_l="-DIN_GCC -DHAVE_CONFIG_H -I$idir4 -I$idir6 -I$idir7 -I$idir8"
  log_cmd "$CC $cflags_l $src_dir/diagnostic.c -c -o $out_dir/diagnostic.o"
  log_cmd "$CC $cflags_l $src_dir/pretty-print.c -c -o $out_dir/pretty-print.o"
  log_cmd "$CC $cflags_l -DLOCALEDIR=\\\"/home/trampampam\\\" $src_dir/intl.c -c -o $out_dir/intl.o"
  log_cmd "$CC $cflags_l $src_dir/input.c -c -o $out_dir/input.o"
  log_cmd "$CC $cflags_l -DBASEVER=\\\"4.7.3\\\" -DDATESTAMP=\\\"\\\" -DREVISION=\\\"\\\" -DDEVPHASE=\\\"\\\" -DPKGVERSION=\\\"\\\" -DBUGURL=\\\"\\\" $src_dir/version.c -c -o $out_dir/version.o"
  log_cmd "$ar cru $out_dir/libcommon.a $out_dir/diagnostic.o $out_dir/pretty-print.o $out_dir/intl.o $out_dir/input.o $out_dir/version.o"

  # Сборка gcov
  src_dir="$GCOV_DIR/gcc-4.7.3/gcc"
  out_dir="$BUILD_DIR/gcc"
  log_cmd "mkdir -p $out_dir"
  cflags_l="-DIN_GCC -DHAVE_CONFIG_H -I$idir4 -I$idir6 -I$idir7 -I$idir8"
  log_cmd "$CC $cflags_l $src_dir/gcov.c -c -o $out_dir/gcov.o"
  log_cmd "mkdir -p $INSTALL_DIR/bin"
  log_cmd "$CC $out_dir/gcov.o $BUILD_DIR/libcommon/libcommon.a $BUILD_DIR/libcpp/libcpp.a $BUILD_DIR/libiberty/libiberty.a $BUILD_DIR/libdecnumber/libdecnumber.a -o $INSTALL_DIR/bin/gcov"
}

print_usage ()
{
  echo "Запуск:"
  echo "  $0 [LOG_FILE=<log_file>] [LOG_MODE=<file|echo|both>] \\"
  echo "             [TARGET=<target>] [MODE=<cross|native>] \\"
  echo "             [BUILD_DIR=<dir>] [PREFIX=<dir>] [INSTALL_DIR=<dir>] \\"
  echo "             CC=<cc> [CFLAGS=<cflags>]"
  exit 1
}

# -----------------------------------------------------------------------------

# Список допустимых настроек, задаваемых извне
options_list="TARGET MODE BUILD_DIR PREFIX INSTALL_DIR LOG_FILE LOG_MODE CC CFLAGS"

# Разбор опций
log_parse_cmd_line "$options_list" "$@"

# Инициализация логов
log_init "$LOG_MODE" "$LOG_FILE" "1"

# Запишем в логи текущую конфигурацию
log_print_arg_list "$0 $*"
log_print_var_list "$options_list"
log_line

# Сборка
check_options
build

# Выдача результата сборки
log_finish
