project(HAMoni CXX)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_SOURCE_DIR}/cmake/Modules/")
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_FLAGS "-Wall -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-deprecated-register")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -DDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-flto -O3 -DRELEASE -DNDEBUG")


set(VERSION_MAJOR 0)
set(VERSION_MINOR 0)
set(VERSION_PATCH 0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(BISON 3.0 REQUIRED)
find_package(FLEX REQUIRED)
find_package(Boost 1.67.0 REQUIRED COMPONENTS
  program_options unit_test_framework graph)
find_package(PPL REQUIRED)

find_path(GMP_INCLUDE_DIRS NAMES gmp.h gmpxx.h)
find_library(GMP_LIBRARY NAMES gmp libgmp)
find_library(GMPXX_LIBRARY NAMES gmpxx libgmpxx)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GMP DEFAULT_MSG GMP_INCLUDE_DIRS GMP_LIBRARY)

include_directories(
  src/
  ${PROJECT_BINARY_DIR}
  ${PPL_INCLUDES}
  ${GMP_INCLUDE_DIRS}
  ${Boost_INCLUDE_DIRS})

BISON_TARGET(constraint_parser
  src/constraint_parser.yy
  ${CMAKE_CURRENT_BINARY_DIR}/constraint_parser.tab.cc)
FLEX_TARGET(constraint_lexer
  src/constraint_lexer.l
  ${CMAKE_CURRENT_BINARY_DIR}/constraint_lexer.yy.cc)
ADD_FLEX_BISON_DEPENDENCY(constraint_lexer constraint_parser)

## Config for Main 
add_executable(hamoni 
  src/main.cc
  ${FLEX_constraint_lexer_OUTPUTS}
  ${BISON_constraint_parser_OUTPUTS})

target_link_libraries(hamoni
  ${Boost_GRAPH_LIBRARY}
  ${PPL_PPL_LIBRARY}
  ${GMP_LIBRARY}
  ${GMPXX_LIBRARY}
  ${Boost_PROGRAM_OPTIONS_LIBRARY})

# Configuration for the simulator
add_executable(hamoni-sim
  src/simulator.cc
  ${FLEX_constraint_lexer_OUTPUTS}
  ${BISON_constraint_parser_OUTPUTS})

target_link_libraries(hamoni-sim
  ${Boost_GRAPH_LIBRARY}
  ${PPL_PPL_LIBRARY}
  ${GMP_LIBRARY}
  ${GMPXX_LIBRARY}
  ${Boost_PROGRAM_OPTIONS_LIBRARY})

## Config for Test
enable_testing()

add_executable(unit_test
  test/unit_test.cc
  ${FLEX_constraint_lexer_OUTPUTS}
  ${BISON_constraint_parser_OUTPUTS}
  test/timed_word_parser_test.cc
  test/powerset_monitor_test.cc
  test/automaton_test.cc
  test/io_operators_test.cc
  test/vector_monitor_test.cc)

target_link_libraries(unit_test
  ${GMP_LIBRARY}
  ${Boost_GRAPH_LIBRARY}
  ${PPL_PPL_LIBRARY}
  ${GMPXX_LIBRARY}
  ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

add_test(NAME unit_test
  COMMAND $<TARGET_FILE:unit_test>
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

find_package(Doxygen)
option(BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" ${DOXYGEN_FOUND})

if(BUILD_DOCUMENTATION)
    if(NOT DOXYGEN_FOUND)
        message(FATAL_ERROR "Doxygen is needed to build the documentation.")
    endif()

    set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
    set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile)

    configure_file(${doxyfile_in} ${doxyfile} @ONLY)

    add_custom_target(doc
        COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc
        COMMENT "Generating API documentation with Doxygen"
        VERBATIM)

## It does not install the document by default
#    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION share/doc)
endif()
