IF (NOT DEFINED PROJECT_NAME)

  CMAKE_MINIMUM_REQUIRED( VERSION 2.4 )
  PROJECT(Mesquite)
  SET( PACKAGE_NAME "Mesquite" )

  MACRO(ADD_OPTION_AND_DEFINE USER_OPTION_NAME MACRO_DEFINE_NAME DOCSTRING DEFAULT_VALUE)
    #MESSAGE("ADD_OPTION_AND_DEFINE: '${USER_OPTION_NAME}' '${MACRO_DEFINE_NAME}' '${DEFAULT_VALUE}'")
    SET( ${USER_OPTION_NAME} "${DEFAULT_VALUE}" CACHE BOOL "${DOCSTRING}" )
    IF(NOT ${MACRO_DEFINE_NAME} STREQUAL "")
      SET(${MACRO_DEFINE_NAME} "${DEFAULT_VALUE}")
    ENDIF()
  ENDMACRO()

  SET( ${PACKAGE_NAME}_ENABLE_TESTS "OFF" CACHE BOOL "Build Tests" )
  IF (${PACKAGE_NAME}_ENABLE_TESTS)
    ENABLE_TESTING()
  ENDIF()

ELSE()

  INCLUDE(AddOptionAndDefine)
  INCLUDE(PackageMacros)

  #
  # A) Define the package
  #

  PACKAGE(Mesquite DISABLE_STRONG_WARNINGS)
  SET( ${PACKAGE_NAME}_ENABLE_TESTS ${Trilinos_ENABLE_TESTS} )

ENDIF()


INCLUDE(CheckFunctionExists)
INCLUDE(CheckIncludeFile)
SET ( CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
INCLUDE(AutoconfHeader)

MACRO(APPEND_DEFINE DEFINE_LIST DEFINE_NAME)
  IF(${DEFINE_NAME})
    SET( ${DEFINE_LIST} "${${DEFINE_LIST}} -D${DEFINE_NAME}" )
  ENDIF()
ENDMACRO()

#
# B) Set up package-specific options
#

# Read the package version number specified as the second argument
# to the AC_INIT macro in a GNU Autoconf configure.in file.
#
# Define the following variables:
# VERSION_STRING:  The second argument to AC_INIT
# MAJOR_VERSION:   For a version string of the form m.n.p..., m
# MINOR_VERSION:   For a version string of the form m.n.p..., n
# PATCH_VERSION:   For a version string of the form m.n.p..., p

file( READ "configure.ac" configure_IN )
string( REGEX REPLACE "^.*AC_INIT *\\([^,]+, *([^, )]+).*$" "\\1" VERSION_STRING "${configure_IN}" )
string( REGEX REPLACE "^([0-9]+)(\\..*)?$" "\\1" MAJOR_VERSION "${VERSION_STRING}" )
string( REGEX REPLACE "^[0-9]+\\.([0-9]+)(\\..*)?$" "\\1" MINOR_VERSION "${VERSION_STRING}" )
if ( VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+" )
  string( REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" PATCH_VERSION "${VERSION_STRING}" )
endif ( VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+" )


SET(MSQ_VERSION ${VERSION_STRING})
SET(MSQ_VERSION_MAJOR ${MAJOR_VERSION})
SET(MSQ_VERSION_MINOR ${MINOR_VERSION})
SET(MSQ_VERSION_PATCH ${PATCH_VERSION})
SET(MSQ_VERSION_STRING "\"Mesquite ${MSQ_VERSION}\"")


#check for specific functions
CHECK_FUNCTION_EXISTS(times     HAVE_TIMES)
CHECK_FUNCTION_EXISTS(clock     HAVE_CLOCK)
CHECK_FUNCTION_EXISTS(cbrt      HAVE_CBRT)
CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
CHECK_FUNCTION_EXISTS(vsprintf  HAVE_VSPRINTF)
CHECK_FUNCTION_EXISTS(finite    HAVE_FINITE)
CHECK_FUNCTION_EXISTS(_Isfinite HAVE__ISFINITE)

#check for header files
CHECK_INCLUDE_FILE(ieeefp.h    MSQ_HAVE_IEEEFP_H)
CHECK_INCLUDE_FILE(ieeefp.h    MSQ_HAVE_STDINT_H)
CHECK_INCLUDE_FILE(inttypes.h  MSQ_HAVE_INTTYPES_H)
CHECK_INCLUDE_FILE(termios.h   HAVE_TERMIOS_H)
CHECK_INCLUDE_FILE(sys/ioctl.h HAVE_SYS_IOCTL_H)
CHECK_INCLUDE_FILE(dlfcn.h     HAVE_DLFCN_H)
CHECK_INCLUDE_FILE(fcntl.h     HAVE_FCNTL_H)

#check for ITAPS files
FIND_FILE( IMESH_DEFS  iMesh-Defs.inc ENV IMESH_DEFS  )
FIND_FILE( IGEOM_DEFS  iGeom-Defs.inc ENV IGEOM_DEFS  )
FIND_FILE( IREL_DEFS   iMesh-Defs.inc ENV IREL_DEFS   )
IF (TPL_ENABLE_MPI)
  FIND_FILE( IMESHP_DEFS iMesh-Defs.inc ENV IMESHP_DEFS )
ENDIF()

IF(NOT HAVE_TIMES AND NOT HAVE_CLOCK)
  MESSAGE( FATAL_ERROR
    "\n***"
    "\n*** ERROR: Neither the function times nor the function clock could be found. At least one of these needs to exist or Mesquite cannot build properly."
    "\n***\n"
    )
ENDIF()

ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_SHARED
  HAVE_Mesquite_SHARED
  "Build as shared library (e.g. Linux *.so, or Windows *.dll)."
  OFF )

#this needs to be done more like the mesquite version where 
#there is a loop to determine the value. Not sure how to do
#this though. Likely through a try compile.
SET(${PACKAGE_NAME}_MSQ_FUNCTION "" CACHE STRING "Set c++ preprocessor macro for function name.")
SET(MSQ_FUNCTION ${${PACKAGE_NAME}_MSQ_FUNCTION})

ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_TRAP_FPE
  MSQ_TRAP_FPE
  "Enable to turn on floating point exception trapping."
  ON )

ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_DISABLE_DEBUG_ASSERTS
  NDEBUG
  "Disable asserts in debug mode."
  ON )

ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_USE_FUNCTION_TIMERS
  MSQ_USE_FUNCTION_TIMERS
  "Enable function timers."
  OFF )

IF(${PACKAGE_NAME}_ENABLE_DEBUG)
  SET(MSQ_ENABLE_DEBUG)
ENDIF()

IF(${PACKAGE_NAME}_ENABLE_ExodusII)
  SET(HAVE_LIBEXOIIV2C ON)
ENDIF()


#
# ) Output config data
#

SET( MESQUITE_DEFINES "" )
APPEND_DEFINE( MESQUITE_DEFINES MSQ_TRAP_FPE )
APPEND_DEFINE( MESQUITE_DEFINES MSQ_ENABLE_DEBUG )
APPEND_DEFINE( MESQUITE_DEFINES NDEBUG )
APPEND_DEFINE( MESQUITE_DEFINES MSQ_USE_FUNCTION_TIMERS )
APPEND_DEFINE( MESQUITE_DEFINES MSQ_TRAP_FPE )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_TIMES )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_CLOCK )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_CBRT )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_VSNPRINTF )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_VSPRINTF )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_FINITE )
APPEND_DEFINE( MESQUITE_DEFINES HAVE__ISFINITE )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_IEEEFP_H )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_INTTYPES_H )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_TERMIOS_H )
APPEND_DEFINE( MESQUITE_DEFINES MSQ_TRAP_FPE )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_SYS_IOCTL_H )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_DLFCN_H )
APPEND_DEFINE( MESQUITE_DEFINES HAVE_FCNTL_H )


autoconf_header( ${CMAKE_CURRENT_SOURCE_DIR}/include/mesquite_version.h.in
                 ${CMAKE_CURRENT_BINARY_DIR}/include/mesquite_version.h )
autoconf_header( ${CMAKE_CURRENT_SOURCE_DIR}/include/mesquite_config.h.in
                 ${CMAKE_CURRENT_BINARY_DIR}/include/mesquite_config.h )


#
# C) Add the libraries, tests, and examples
#


# Add the list of include paths

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/testSuite)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/itaps)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/itaps)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/Mesh)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/Misc)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/Control)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/Control/Wrappers)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/MappingFunction)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/MappingFunction/Linear)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/MappingFunction/Lagrange)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityAssessor)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/Shape)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/Smoothness)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/Volume)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/Untangle)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/TMP)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/TMP/2D)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityMetric/TMP/3D)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/TargetCalculator)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectiveFunction)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/FeasibleNewton)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/TrustRegion)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/ConjugateGradient)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/Randomize)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/Relaxation)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/SteepestDescent)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/NonSmoothDescent)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/VertexMover/QuasiNewton)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/QualityImprover/TopologyModifier)

ADD_SUBDIRECTORY(itaps)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(utils)

IF (${PACKAGE_NAME}_ENABLE_TESTS)
  IF (NOT ${PROJECT_NAME} STREQUAL "Mesquite")

    PACKAGE_ADD_TEST_DIRECTORIES(testSuite)

    #PACKAGE_ADD_EXAMPLE_DIRECTORIES(example)

    #
    # D) Do standard postprocessing
    #

    PACKAGE_POSTPROCESS()

  ELSE()

    ADD_SUBDIRECTORY(testSuite)

  ENDIF()
ENDIF()
