#!/bin/sh

#
# Create and configure a shadow tree for building the
# the PCN system for a particular architecture.
#
# Usage:
#	./configure <config> [ <build_name> ]
#

if [ $# -eq 1 ]; then
    config=$1
    build_name=${config}
elif [ $# -eq 2 ]; then
    config=$1
    build_name=$2
else
    echo "Usage: ${0} <config> [ <build_name> ]"
    exit 1
fi

if [ ! -d support ]; then
    echo "Error: No support directory."
    echo "       Is this being run from the top level PCN directory?"
    exit 1
fi

. support/constants


configfile=${G_CONFIGS_DIR}/${config}.cf/config
cmainfile=${G_CONFIGS_DIR}/${config}.cf/cmain.c
fmainfile=${G_CONFIGS_DIR}/${config}.cf/fmain.c

if [ -r ${configfile} ]; then
    . ${configfile}
else
    echo "Invalid configuration file: ${configfile}"
    exit 1
fi

if [ ! -r ${cmainfile} ]; then
    echo "Incomplete configuration -- missing cmain.c file: ${cmainfile}"
    exit 1
fi
if [ ! -r ${fmainfile} ]; then
    echo "Incomplete configuration -- missing fmain.c file: ${fmainfile}"
    exit 1
fi

. ${G_SUPPORT_DIR}/install_vars

current_dir=`pwd`
shadow_tree=${current_dir}/${G_SUPPORT_DIR}/shadow_tree

if [ ! -d ${G_BUILD_DIR} ]; then
    mkdir ${G_BUILD_DIR}
fi
shadow_dir=${G_BUILD_DIR}/${build_name}
if [ -s ${shadow_dir} ]; then
    echo "Build directory already exists: ${shadow_dir}"
    exit 1
else
    echo "Creating build directory: ${shadow_dir}"
    mkdir ${shadow_dir}
fi


#
# Create the Makefile header that contains all of the controlling
# parameters for the build
#
makefile_hdr_base=${shadow_dir}/Makefile.hdr
makefile_hdr=${current_dir}/${makefile_hdr_base}

echo "Creating Makefile header in ${makefile_hdr_base}"
rm -f ${makefile_hdr}
echo "#This Makefile is generated automatically.  Do not modify it." > ${makefile_hdr}

# stuff from the support/constants file
echo "G_VERSION_STR=${G_VERSION_STR}" >> ${makefile_hdr}
echo "G_BUILD_DIR=${G_BUILD_DIR}" >> ${makefile_hdr}
echo "G_CONFIGS_DIR=${G_CONFIGS_DIR}" >> ${makefile_hdr}
echo "G_CONTRIB_DIR=${G_CONTRIB_DIR}" >> ${makefile_hdr}
echo "G_DOCS_DIR=${G_DOCS_DIR}" >> ${makefile_hdr}
echo "G_EX_DIR=${G_EX_DIR}" >> ${makefile_hdr}
echo "G_MAN_DIR=${G_MAN_DIR}" >> ${makefile_hdr}
echo "G_SCRIPTS_DIR=${G_SCRIPTS_DIR}" >> ${makefile_hdr}
echo "G_SOURCE_DIR=${G_SOURCE_DIR}" >> ${makefile_hdr}
echo "G_SUPPORT_DIR=${G_SUPPORT_DIR}" >> ${makefile_hdr}
echo "G_TESTS_DIR=${G_TESTS_DIR}" >> ${makefile_hdr}
echo "G_BOOT_DIR=${G_BOOT_DIR}" >> ${makefile_hdr}
echo "G_COMPILER_DIR=${G_COMPILER_DIR}" >> ${makefile_hdr}
echo "G_INCLUDE_DIR=${G_INCLUDE_DIR}" >> ${makefile_hdr}
echo "G_LINKER_DIR=${G_LINKER_DIR}" >> ${makefile_hdr}
echo "G_MAIN_DIR=${G_MAIN_DIR}" >> ${makefile_hdr}
echo "G_MESSAGE_DIR=${G_MESSAGE_DIR}" >> ${makefile_hdr}
echo "G_PCNO_DIR=${G_PCNO_DIR}" >> ${makefile_hdr}
echo "G_PIPE_DIR=${G_PIPE_DIR}" >> ${makefile_hdr}
echo "G_RUN_DIR=${G_RUN_DIR}" >> ${makefile_hdr}
echo "G_RUNTIME_DIR=${G_RUNTIME_DIR}" >> ${makefile_hdr}
echo "G_STDIO_DIR=${G_STDIO_DIR}" >> ${makefile_hdr}
echo "G_SYS_DIR=${G_SYS_DIR}" >> ${makefile_hdr}
echo "G_VT_DIR=${G_VT_DIR}" >> ${makefile_hdr}
echo "G_COMPILER_NAME=${G_COMPILER_NAME}" >> ${makefile_hdr}
echo "G_COMPILER_SCRIPT_NAME=${G_COMPILER_SCRIPT_NAME}" >> ${makefile_hdr}
echo "G_LINKER_NAME=${G_LINKER_NAME}" >> ${makefile_hdr}
echo "G_MERGE_PAMS_NAME=${G_MERGE_PAMS_NAME}" >> ${makefile_hdr}
echo "G_PRINT_PAM_NAME=${G_PRINT_PAM_NAME}" >> ${makefile_hdr}

# stuff from the config file
echo "G_CONFIG=${config}" >> ${makefile_hdr}
echo "INSTALL_BASE_DIR=${INSTALL_BASE_DIR}" >> ${makefile_hdr}
echo "G_BUILD_CONTRIBS=${G_BUILD_CONTRIBS}" >> ${makefile_hdr}
echo "G_ARCH=${G_ARCH}" >> ${makefile_hdr}
echo "G_XCOMP_TARGET=${G_XCOMP_TARGET}" >> ${makefile_hdr}
echo "G_EXE_FILE_MODE=${G_EXE_FILE_MODE}" >> ${makefile_hdr}
echo "G_FILE_MODE=${G_FILE_MODE}" >> ${makefile_hdr}
echo "G_DIR_MODE=${G_DIR_MODE}" >> ${makefile_hdr}
echo "G_CC=${G_CC}" >> ${makefile_hdr}
echo "G_OPT_CFLAGS=${G_OPT_CFLAGS}" >> ${makefile_hdr}
echo "G_DEBUG_CFLAGS=${G_DEBUG_CFLAGS}" >> ${makefile_hdr}
echo "G_CLIBS=${G_CLIBS}" >> ${makefile_hdr}
echo "G_FC=${G_FC}" >> ${makefile_hdr}
echo "G_OPT_FFLAGS=${G_OPT_FFLAGS}" >> ${makefile_hdr}
echo "G_DEBUG_FFLAGS=${G_DEBUG_FFLAGS}" >> ${makefile_hdr}
echo "G_FLIBS=${G_FLIBS}" >> ${makefile_hdr}
echo "G_OFILE=${G_OFILE}" >> ${makefile_hdr}
echo "G_LDFLAGS=${G_LDFLAGS}" >> ${makefile_hdr}
echo "G_DEFS=${G_DEFS}" >> ${makefile_hdr}
echo "G_STRIP_TRAILING_UNDERSCORE=${G_STRIP_TRAILING_UNDERSCORE}" >> ${makefile_hdr}
echo "G_MD_MODULE=${G_MD_MODULE}" >> ${makefile_hdr}
echo "G_SR_MODULE=${G_SR_MODULE}" >> ${makefile_hdr}
echo "X_BIN_DIR=${X_BIN_DIR}" >> ${makefile_hdr}
echo "X_INC_DIR=${X_INC_DIR}" >> ${makefile_hdr}
echo "X_LIB_DIR=${X_LIB_DIR}" >> ${makefile_hdr}
echo "X_CC=${X_CC}" >> ${makefile_hdr}
echo "X_CFLAGS=${X_CFLAGS}" >> ${makefile_hdr}
echo "X_LDFLAGS=${X_LDFLAGS}" >> ${makefile_hdr}
echo "G_LEX=${G_LEX}" >> ${makefile_hdr}
echo "G_LEX_FLAGS=${G_LEX_FLAGS}" >> ${makefile_hdr}
echo "G_YACC=${G_YACC}" >> ${makefile_hdr}
echo "G_YACC_FLAGS=${G_YACC_FLAGS}" >> ${makefile_hdr}
echo "G_CPP=${G_CPP}" >> ${makefile_hdr}
echo "G_MAKE=${G_MAKE}" >> ${makefile_hdr}
echo "G_AR=${G_AR}" >> ${makefile_hdr}
echo "G_RANLIB=${G_RANLIB}" >> ${makefile_hdr}
echo "G_PERL=${G_PERL}" >> ${makefile_hdr}
echo "G_CP=${G_CP}" >> ${makefile_hdr}
echo "G_RM=${G_RM}" >> ${makefile_hdr}
echo "G_MV=${G_MV}" >> ${makefile_hdr}
echo "G_ECHO=${G_ECHO}" >> ${makefile_hdr}
echo "G_MKDIR=${G_MKDIR}" >> ${makefile_hdr}
echo "G_CHMOD=${G_CHMOD}" >> ${makefile_hdr}
echo "G_SED=${G_SED}" >> ${makefile_hdr}
echo "G_TOUCH=${G_TOUCH}" >> ${makefile_hdr}
echo "G_BASENAME=${G_BASENAME}" >> ${makefile_hdr}
echo "G_EXPR=${G_EXPR}" >> ${makefile_hdr}
echo "G_CAT=${G_CAT}" >> ${makefile_hdr}
echo "G_LN=${G_LN}" >> ${makefile_hdr}
echo "SHELL=${G_SHELL}" >> ${makefile_hdr}
echo "PARALLEL=${PARALLEL}" >> ${makefile_hdr}

# stuff from support/install_vars file
echo "INSTALL_BIN_DIR=${INSTALL_BIN_DIR}" >> ${makefile_hdr}
echo "INSTALL_LIB_DIR=${INSTALL_LIB_DIR}" >> ${makefile_hdr}
echo "INSTALL_INC_DIR=${INSTALL_INC_DIR}" >> ${makefile_hdr}
echo "INSTALL_EX_DIR=${INSTALL_EX_DIR}" >> ${makefile_hdr}
echo "INSTALL_MAN_DIR=${INSTALL_MAN_DIR}" >> ${makefile_hdr}
echo "INSTALL_DOCS_DIR=${INSTALL_DOCS_DIR}" >> ${makefile_hdr}
echo "INST_DISC_FILE=${INST_DISC_FILE}" >> ${makefile_hdr}

echo "BUILD_PATH=${current_dir}/${shadow_dir}" >> ${makefile_hdr}


#
# Drop the top level Makefile info Build/<config>
#
echo "Copying ${G_SUPPORT_DIR}/Makefile to ${shadow_dir}"
${G_CP} ${G_SUPPORT_DIR}/Makefile ${shadow_dir}/.


#
# Create the shadow trees
#
for target_dir in src contrib
do
    echo "Creating ${target_dir} shadow tree for ${config} in ${shadow_dir}"
    cd ${shadow_dir}
    mkdir ${target_dir}
    cd ${target_dir}

    ${shadow_tree} ../../../${target_dir} ../../.. ${G_COMPILER_SCRIPT_NAME} ${makefile_hdr} "  " include
    run_status=$?
    if [ ${run_status} -ne 0 ]; then
        echo "${0}: Failed to create ${target_dir} shadow tree for ${config} in ${shadow_dir}"
        exit ${run_status}
    fi

    cd ${current_dir}
done


#
# Drop the cmain.c and fmain.c files into the new shadow tree
#
main_dir="${shadow_dir}/${G_SOURCE_DIR}/${G_MAIN_DIR}"
echo "Copying cmain.c and fmain.c from the config directory to ${main_dir}"
${G_CP} ${cmainfile} ${fmainfile} ${main_dir}/.

