#!/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 | grep -E 'GNU|makepp'`" = x; then
      MAKE=gmake
    else
      MAKE=make
    fi
  fi
else
  MAKE=$GNUMAKE
fi

if test "x`$MAKE -v 2>/dev/null | grep -E '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
