INCLUDE(CheckIncludeFile)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckLibraryExists)

SET(BISON_GENERATE_DEFINES TRUE)
SET(BISON_PREFIX_OUTPUTS TRUE)
INCLUDE(CMakeUserUseBison)
SET(FLEX_PREFIX_OUTPUTS TRUE)
INCLUDE(CMakeUserUseFlex)
IF( NOT BISON_EXECUTABLE OR NOT FLEX_EXECUTABLE )
  MESSAGE( SEND_ERROR "Bison and Flex are required" )
ENDIF( NOT BISON_EXECUTABLE OR NOT FLEX_EXECUTABLE ) 

ADD_DEFINITIONS(-DHAVE_CONFIG_H
  "\"-DPACKAGE_STRING=\\\"${PROJ_NAME} ${PROJ_VERSION}\\\"\""
  "\"-DPACKAGE_BUGREPORT=\\\"${PROJ_EMAIL}\\\"\""
)

IF(CMAKE_COMPILER_IS_GNUCC)
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

IF(CMAKE_COMPILER_IS_GNUCC)
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

IF(MSVC)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
  ADD_DEFINITIONS(-D_SCL_SECURE_NO_DEPRECATE)
  SET(CMAKE_C_FLAGS "${MY_C_FLAGS} /wd4100 /wd4101 /wd4189 /wd4706")
  STRING(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
  STRING(REGEX REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
  STRING(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
  STRING(REGEX REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
  
  # Use the highest warning level for visual studio.
  SET(CMAKE_C_WARNING_LEVEL 4)
  IF(CMAKE_C_FLAGS MATCHES "/W[0-4]")
    STRING(REGEX REPLACE "/W[0-4]" "/W4"
           CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
  ELSE(CMAKE_C_FLAGS MATCHES "/W[0-4]")
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
  ENDIF(CMAKE_C_FLAGS MATCHES "/W[0-4]")
ENDIF(MSVC)

IF(WIN32)
 SET(RES_SRCS ${RES_SRCS} dawg.rc)
ENDIF(WIN32)

IF(APPLE_BUNDLE_APP)
  SET(PROJ_MACOSX_BUNDLE MACOSX_BUNDLE)
ENDIF(APPLE_BUNDLE_APP)

CHECK_INCLUDE_FILE(unistd.h  HAVE_UNISTD_H)
CHECK_INCLUDE_FILE(process.h HAVE_PROCESS_H)
CHECK_INCLUDE_FILE(io.h HAVE_IO_H)
CHECK_INCLUDE_FILE(getopt.h  HAVE_GETOPT_H)
CHECK_INCLUDE_FILE(stdint.h  HAVE_STDINT_H)
CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)

CHECK_FUNCTION_EXISTS( getpid   HAVE_GETPID)
CHECK_FUNCTION_EXISTS(_getpid   HAVE__GETPID)
CHECK_FUNCTION_EXISTS( copysign HAVE_COPYSIGN)
CHECK_FUNCTION_EXISTS(_copysign HAVE__COPYSIGN)
CHECK_FUNCTION_EXISTS( snprintf HAVE_SNPRINTF)
CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_CURRENT_BINARY_DIR}")

BISON_FILE(parser.ypp)
FLEX_FILE(parser.lpp)

SET_SOURCE_FILES_PROPERTIES(lex.parser.cpp parser.tab.cpp PROPERTIES COMPILE_FLAGS "-I \"${CMAKE_CURRENT_SOURCE_DIR}\"")

IF(NOT HAVE_UNISTD_H)
  SET_SOURCE_FILES_PROPERTIES(lex.parser.cpp PROPERTIES COMPILE_FLAGS
  "-I \"${CMAKE_CURRENT_SOURCE_DIR}\" -I \"${CMAKE_CURRENT_SOURCE_DIR}/compat/unistd\"")
ENDIF(NOT HAVE_UNISTD_H)


IF(NOT HAVE_GETOPT_H)
  INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/compat/getopt")
  SET(COMPAT ${COMPAT} compat/getopt/getopt.c)
ENDIF(NOT HAVE_GETOPT_H)

ADD_EXECUTABLE(dawg ${PROJ_MACOSX_BUNDLE}
  dawg.cpp eigen.cpp indel.cpp matrix.cpp output.cpp rand.cpp tree.cpp var.cpp
  parser.lpp parser.ypp lex.parser.cpp parser.tab.cpp parser.tab.hpp
  dawg.h indel.h matrix.h rand.h tree.h var.h
  "${CMAKE_CURRENT_BINARY_DIR}/config.h"
  ${COMPAT}
  ${RES_SRCS})

TARGET_LINK_LIBRARIES(dawg ${CMAKE_REQUIRED_LIBRARIES})

IF(APPLE_BUNDLE_APP)
  SET_TARGET_PROPERTIES(dawg PROPERTIES OUTPUT_NAME ${PROJ_BUNDLE_NAME})
  SET(PROJ_INSTALL_EXTRA_ARGS BUNDLE DESTINATION "${PROJ_BUNDLE_LOCATION}")
ENDIF(APPLE_BUNDLE_APP)

INSTALL(TARGETS dawg RUNTIME DESTINATION bin ${PROJ_INSTALL_EXTRA_ARGS})

IF(UNIX)
  INSTALL(FILES dawg.desktop DESTINATION share/applications )
  INSTALL(FILES dawg.png DESTINATION share/pixmaps )
ENDIF(UNIX)

IF(APPLE_BUNDLE_APP)
  INSTALL(CODE "file(MAKE_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)")
  INSTALL(CODE "execute_process(COMMAND ln -s \"../MacOS/${PROJ_BUNDLE_NAME}\" dawg
                  WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)")
ENDIF(APPLE_BUNDLE_APP)

