#!/bin/sh
#
# Copyright (C) 2002-2022 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.
#
#
# Call the `configure' script located in `builds/unix'.
#

rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk

# respect GNUMAKE environment variable for backward compatibility
if test "x$GNUMAKE" = x; then
  if test "x$MAKE" = x; then
    if test "x`make -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then
      MAKE=gmake
    else
      MAKE=make
    fi
  fi
else
  MAKE=$GNUMAKE
fi

if test "x`$MAKE -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then
  echo "GNU make (>= 3.81) or makepp (>= 2.0) is required to build FreeType2." >&2
  echo "Please try" >&2
  echo >&2
  echo "  MAKE=<GNU make command name> $0" >&2
  echo >&2
  echo "or" >&2
  echo >&2
  echo "  MAKE=\"makepp --norc-substitution\" $0" >&2
  exit 1
fi

# Get `dirname' functionality.  This is taken and adapted from autoconf's
# m4sh.m4 (_AS_EXPR_PREPARE, AS_DIRNAME_EXPR, and AS_DIRNAME_SED).

if expr a : '\(a\)' >/dev/null 2>&1; then
  ft_expr=expr
else
  ft_expr=false
fi

ft2_dir=`(dirname "$0") 2>/dev/null                         ||
         $ft_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
                  X"$0" : 'X\(//\)[^/]' \| \
                  X"$0" : 'X\(//\)$' \| \
                  X"$0" : 'X\(/\)' \| \
                  .     : '\(.\)' 2>/dev/null               ||
         echo X"$0" |
           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
                  s//\1/
                  q
                }
                /^X\(\/\/\)[^/].*/{
                  s//\1/
                  q
                }
                /^X\(\/\/\)$/{
                  s//\1/
                  q
                }
                /^X\(\/\).*/{
                  s//\1/
                  q
                }
                s/.*/./; q'`

abs_curr_dir=`pwd`
abs_ft2_dir=`cd "$ft2_dir" && pwd`

# `--srcdir=' option can override abs_ft2_dir

if test $# -gt 0; then
  for x in "$@"; do
    case x"$x" in
    x--srcdir=*)
      abs_ft2_dir=`echo $x | sed 's/^--srcdir=//'` ;;
    esac
  done
fi

# build a dummy Makefile if we are not building in the source tree;
# we use inodes to avoid issues with symbolic links
inode_src=`ls -id $abs_ft2_dir | awk '{print $1}'`
inode_dst=`ls -id $abs_curr_dir | awk '{print $1}'`

if test $inode_src != $inode_dst; then
  if test ! -d docs; then
    mkdir docs
    echo "Copying documentation assets"
    cp -R $abs_ft2_dir/docs/markdown $abs_curr_dir/docs
  fi
  if test ! -r $abs_curr_dir/modules.cfg; then
    echo "Copying \`modules.cfg'"
    cp $abs_ft2_dir/modules.cfg $abs_curr_dir
  fi
  echo "Generating \`Makefile'"
  echo "TOP_DIR        := $abs_ft2_dir"           > Makefile
  echo "OBJ_DIR        := $abs_curr_dir"         >> Makefile
  echo "OBJ_BUILD      := \$(OBJ_DIR)"           >> Makefile
  echo "DOC_DIR        := \$(OBJ_DIR)/docs"      >> Makefile
  echo "FT_LIBTOOL_DIR := \$(OBJ_DIR)"           >> Makefile
  echo "ifndef FT2DEMOS"                         >> Makefile
  echo "  include \$(TOP_DIR)/Makefile"          >> Makefile
  echo "else"                                    >> Makefile
  echo "  TOP_DIR_2 := \$(TOP_DIR)/../ft2demos"  >> Makefile
  echo "  PROJECT   := freetype"                 >> Makefile
  echo "  CONFIG_MK := \$(OBJ_DIR)/config.mk"    >> Makefile
  echo "  include \$(TOP_DIR_2)/Makefile"        >> Makefile
  echo "endif"                                   >> Makefile
fi

# call make

CFG=
# work around zsh bug which doesn't like `${1+"$@"}'
case $# in
0) ;;
*) for x in "$@"; do
     case x"$x" in
     x--srcdir=* ) CFG="$CFG '$x'/builds/unix" ;;
     *) CFG="$CFG '$x'" ;;
     esac
   done ;;
esac
CFG=$CFG $MAKE setup unix

# eof
