function (cfg_compile_options OPT CFG)
  add_compile_options ("$<$<CONFIG:${CFG}>:${OPT}>")
endfunction ()

set (CMAKE_CXX_STANDARD 17)
set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"   OR
    CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
    CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
  set (GCXX_LIKE TRUE)
  message (">> GCXX-LIKE COMPILER DETECTED")
endif ()

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  set (MSVC_LIKE TRUE)
  message (">> MSVC-LIKE COMPILER DETECTED")
endif ()

if (DEFINED MSVC_LIKE)
  add_compile_options (/W3)
  cfg_compile_options (/GS- RELEASE)
  cfg_compile_options (/Ot  RELEASE)
endif ()

if (DEFINED GCXX_LIKE)
  add_compile_options (-pedantic -Wall)
endif ()

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set (INSTALL_LOCAL TRUE)
  message (">> INSTALLING LOCALLY")
else ()
  message (">> INSTALLING TO ${CMAKE_INSTALL_PREFIX}")
endif ()

add_executable (jigsaw-cmd jigsaw.cpp)
target_compile_definitions (jigsaw-cmd PRIVATE __cmd_jigsaw)
set_target_properties (jigsaw-cmd PROPERTIES OUTPUT_NAME jigsaw)
if (DEFINED INSTALL_LOCAL)
  install (TARGETS jigsaw-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin")
else ()
  install (TARGETS jigsaw-cmd DESTINATION bin)
endif ()

add_executable (tripod-cmd jigsaw.cpp)
target_compile_definitions (tripod-cmd PRIVATE __cmd_tripod)
set_target_properties (tripod-cmd PROPERTIES OUTPUT_NAME tripod)
if (DEFINED INSTALL_LOCAL)
  install (TARGETS tripod-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin")
else ()
  install (TARGETS tripod-cmd DESTINATION bin)
endif ()

add_executable (marche-cmd jigsaw.cpp)
target_compile_definitions (marche-cmd PRIVATE __cmd_marche)
set_target_properties (marche-cmd PROPERTIES OUTPUT_NAME marche)
if (DEFINED INSTALL_LOCAL)
  install (TARGETS marche-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin")
else ()
  install (TARGETS marche-cmd DESTINATION bin)
endif ()

add_library (jigsaw-lib SHARED jigsaw.cpp)
target_compile_definitions (jigsaw-lib PRIVATE __lib_jigsaw)
set_target_properties (jigsaw-lib PROPERTIES OUTPUT_NAME jigsaw)
if (DEFINED INSTALL_LOCAL)
  install (TARGETS jigsaw-lib DESTINATION "${PROJECT_SOURCE_DIR}/lib")
else ()
  install (DIRECTORY inc/ DESTINATION include FILES_MATCHING PATTERN "*.h")
  install (TARGETS jigsaw-lib DESTINATION lib)
endif ()
