include(GenerateExportHeader)

if(SCIP)
   find_package(SCIP QUIET)
endif()
if(SCIP_FOUND)
   set(PAPILO_HAVE_SCIP 1)
else()
   set(PAPILO_HAVE_SCIP 0)
endif()

if(SOPLEX)
   find_package(SOPLEX QUIET)
endif()
if(SOPLEX_FOUND)
   set(PAPILO_HAVE_SOPLEX 1)
else()
   set(PAPILO_HAVE_SOPLEX 0)
endif()

if(HIGHS)
   find_package(HIGHS QUIET)
endif()
if(HIGHS_FOUND)
   set(PAPILO_HAVE_HIGHS 1)
else()
   set(PAPILO_HAVE_HIGHS 0)
endif()

set(CMAKE_CXX_STANDARD 14)

include_directories(${SCIP_INCLUDE_DIRS} ${SOPLEX_INCLUDE_DIRS} ${HIGHS_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
find_package(Boost REQUIRED OPTIONAL_COMPONENTS iostreams serialization program_options)

if(Boost_IOSTREAMS_FOUND)
   set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS})
   set(CMAKE_REQUIRED_LIBRARIES ${Boost_LIBRARIES})
   check_cxx_source_compiles(
      "#include <boost/iostreams/filter/gzip.hpp>
       int main() { auto decomp = boost::iostreams::gzip_decompressor(); (void)decomp; return 0; }"
      PAPILO_USE_BOOST_IOSTREAMS_WITH_ZLIB )
   check_cxx_source_compiles(
      "#include <boost/iostreams/filter/bzip2.hpp>
       int main() { auto decomp = boost::iostreams::bzip2_decompressor(); (void)decomp; return 0; }"
      PAPILO_USE_BOOST_IOSTREAMS_WITH_BZIP2 )
endif()

if(Boost_IOSTREAMS_FOUND AND Boost_SERIALIZATION_FOUND AND Boost_PROGRAM_OPTIONS_FOUND)
   add_executable(duplicates  ${CMAKE_CURRENT_LIST_DIR}/../src/duplicates.cpp)
   set_target_properties(duplicates PROPERTIES OUTPUT_NAME duplicates RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" )
   target_link_libraries(duplicates papilo-core ${Boost_LIBRARIES})
   target_compile_definitions(duplicates PRIVATE PAPILO_USE_EXTERN_TEMPLATES PAPILO_MPS_WRITER)
   add_executable(papilo-executable ${CMAKE_CURRENT_LIST_DIR}/../src/papilo.cpp)

   if(PAPILO_HAVE_SCIP)
      list(APPEND linked_solvers "SCIP")
      set(PAPILO_HAVE_SCIP 1 PARENT_SCOPE)
      target_compile_definitions(papilo-executable PRIVATE PAPILO_HAVE_SCIP)
   endif()
   if(PAPILO_HAVE_SOPLEX)
      list(APPEND linked_solvers "SoPlex")
      set(PAPILO_HAVE_SOPLEX 1 PARENT_SCOPE)
      target_compile_definitions(papilo-executable PRIVATE PAPILO_HAVE_SOPLEX)
   endif()
   if(PAPILO_HAVE_HIGHS)
      list(APPEND linked_solvers "HiGHS")
      set(PAPILO_HAVE_HIGHS 1 PARENT_SCOPE)
      find_package(OpenMP)
      target_compile_definitions(papilo-executable PRIVATE PAPILO_HAVE_HIGHS)
   endif()
   if(linked_solvers)
      message(STATUS "Linking solvers: ${linked_solvers}")
   else()
      message(STATUS "No solvers linked")
   endif()
   set_target_properties(papilo-executable PROPERTIES OUTPUT_NAME papilo RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" )
   target_link_libraries(papilo-executable papilo-core ${SOPLEX_LIBRARIES} ${SCIP_LIBRARIES} ${HIGHS_LIBRARIES} ${Boost_LIBRARIES})
   target_compile_definitions(papilo-executable PRIVATE PAPILO_USE_EXTERN_TEMPLATES PAPILO_MPS_WRITER)

   add_executable(convMPS EXCLUDE_FROM_ALL ${CMAKE_CURRENT_LIST_DIR}/../src/convMPS.cpp)
   set_target_properties(convMPS PROPERTIES OUTPUT_NAME convMPS RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
   target_link_libraries(convMPS papilo-core ${Boost_LIBRARIES})


endif()

if(PAPILO_HAVE_SCIP AND PAPILO_HAVE_SOPLEX)
   add_library(papilolib SHARED ${CMAKE_CURRENT_LIST_DIR}/../src/papilolib.cpp)
   set_target_properties(papilolib PROPERTIES OUTPUT_NAME papilo LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
   target_include_directories(papilolib INTERFACE
      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
   target_link_libraries(papilolib papilo ${SOPLEX_PIC_LIBRARIES} ${SCIP_LIBRARIES})
   if( Boost_IOSTREAMS_FOUND )
      target_compile_definitions(papilolib PRIVATE PAPILO_MPS_WRITER)
      target_link_libraries(papilolib ${Boost_IOSTREAMS_LIBRARY})
   endif()
   generate_export_header(papilolib)
endif()
