cmake_minimum_required(VERSION 3.5)
project(dbtools)

include(CheckCXXCompilerFlag)
include(CheckIncludeFileCXX)

if(MSVC)
#  set(Boost_USE_STATIC_LIBS "ON")
#  set(OPENSSL_USE_STATIC_LIBS "TRUE")
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
endif()

if(WIN32)
  find_library(BCRYPT_LIBRARY bcrypt)
else()
  find_package(OpenSSL REQUIRED)
endif()
find_package(Boost REQUIRED COMPONENTS iostreams program_options)
check_include_file_cxx(boost/container/flat_map.hpp HAVE_BOOST_CONTAINERS)
check_include_file_cxx(boost/utility/string_view.hpp HAVE_BOOST_STRING_VIEW)
find_package(ZLIB)
find_package(BZip2)
find_program(INDENT NAMES clang-format clang-format-6.0 clang-format-5.0 clang-format-4.0 DOC "clang-format version")

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og")
  check_cxx_compiler_flag(-march=native HAVE_MARCH_NATIVE)
  if(HAVE_MARCH_NATIVE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  endif()
endif()

if(CMAKE_VERSION VERSION_GREATER 3.7)
  set(SUPPORTS_CXX17 1)
else()
  set(SUPPORTS_CX X17 0)
endif()

configure_file("db_config.h.in" "db_config.h")

set(MY_LIBRARIES ${Boost_LIBRARIES})
if(ZLIB_FOUND)
  set(MY_LIBRARIES ${MY_LIBRARIES} ${ZLIB_LIBRARIES})
endif()
if(BZIP2_FOUND)
  set(MY_LIBRARIES ${MY_LIBRARIES} ${BZIP2_LIBRARIES})
endif()

add_library(dbio STATIC database.cpp io_primitives.cpp db_labelsv1.cpp
  db_oldstyle.cpp utils.cpp bits.cpp boolexp.cpp)
if(SUPPORTS_CXX17)
  set_property(TARGET dbio PROPERTY CXX_STANDARD 17)
else()
  set_property(TARGET dbio PROPERTY CXX_STANDARD 14)
endif()
if(WIN32)
  target_compile_definitions(dbio PRIVATE _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING _CRT_SECURE_NO_WARNINGS)
endif()
target_include_directories(dbio PRIVATE ${Boost_INCLUDE_DIRS} "${CMAKE_SOURCE_DIR}/..")

add_executable(db2dot db2dot.cpp)
if(SUPPORTS_CXX17)
  set_property(TARGET db2dot PROPERTY CXX_STANDARD 17)
else()
  set_property(TARGET db2dot PROPERTY CXX_STANDARD 14)
endif()
target_include_directories(db2dot PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(db2dot dbio ${MY_LIBRARIES})

add_executable(dbupgrade dbupgrade.cpp)
if(SUPPORTS_CXX17)
  set_property(TARGET dbupgrade PROPERTY CXX_STANDARD 17)
else()
  set_property(TARGET dbupgrade PROPERTY CXX_STANDARD 14)
endif()
target_include_directories(dbupgrade PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(dbupgrade dbio ${MY_LIBRARIES})

add_executable(grepdb grepdb.cpp)
if(SUPPORTS_CXX17)
  set_property(TARGET grepdb PROPERTY CXX_STANDARD 17)
else()
  set_property(TARGET grepdb PROPERTY CXX_STANDARD 14)
endif()
target_include_directories(grepdb PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(grepdb dbio ${MY_LIBRARIES})

add_executable(pwutil pwutil.cpp hasher.cpp)
if(SUPPORTS_CXX17)
  set_property(TARGET pwutil PROPERTY CXX_STANDARD 17)
else()
  set_property(TARGET pwutil PROPERTY CXX_STANDARD 14)
endif()
target_include_directories(pwutil PRIVATE ${OPENSSL_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
if(WIN32)
  target_link_libraries(pwutil dbio ${BCRYPT_LIBRARY} ${MY_LIBRARIES})
else()
  target_link_libraries(pwutil dbio OpenSSL::Crypto ${MY_LIBRARIES})
endif()

add_custom_target(indent COMMAND ${INDENT} -i --style=file *.cpp *.h
  COMMENT "Formatting source files")

add_custom_command(OUTPUT README.html 
  COMMAND pandoc -t html5 -s --toc --toc-depth=2 -o README.html README.md
  MAIN_DEPENDENCY README.md
  COMMENT "Creating README.html")
add_custom_target(html DEPENDS README.html)
