cmake_minimum_required(VERSION 3.0.0)

set(VERSION_MAJOR
    0
    CACHE STRING "Project major version number")
set(VERSION_MINOR
    "1"
    CACHE STRING "Project minor version number")
set(VERSION_PATCH
    "0"
    CACHE STRING "Project patch version number")
set(CN_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
mark_as_advanced(VERSION_MAJOR VERSION_MINOR VERSION_PATCH CN_VERSION)

project("cn-cbor" VERSION "${CN_VERSION}")

# ##############################################################################
# OPTIONS
# ##############################################################################

option(use_context "Use context pointer for CBOR functions" OFF)
option(verbose "Produce verbose makefile output" OFF)
option(optimize "Optimize for size" OFF)
option(fatal_warnings "Treat build warnings as errors" ON)
option(coveralls "Generate coveralls data" ON)
option(coveralls_send "Send data to coveralls site" OFF)
option(build_docs "Create docs using Doxygen" OFF)
option(build_tests "Create tests" ON)
option(no_floats "Build without floating point support" OFF)
option(align_reads "Use memcpy in ntoh*p()" OFF)

include(GNUInstallDirs)

set(dist_dir ${CMAKE_BINARY_DIR}/dist)
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cn-cbor.pc.in
               ${CMAKE_CURRENT_BINARY_DIR}/cn-cbor.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cn-cbor.pc DESTINATION lib/pkgconfig)

set(package_prefix "${CMAKE_PACKAGE_NAME}-${CMAKE_SYSTEM_NAME}")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dist_dir}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dist_dir}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dist_dir}/lib)

if(NOT CMAKE_BUILD_TYPE)
  if(optimize)
    set(CMAKE_BUILD_TYPE MinSizeRel)
    set(coveralls OFF)
    set(coveralls_send OFF)
  else()
    set(CMAKE_BUILD_TYPE Debug)
  endif()
endif()

if(MSVC)
  set(coveralls OFF)
endif()

message("Build type: ${CMAKE_BUILD_TYPE}")

if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
  message(STATUS "adding GCC/Clang options ")
  add_definitions(-std=gnu99 -Wall -Wextra -pedantic)
  if(fatal_warnings)
    add_definitions(-Werror)
  endif()
  if(optimize)
    add_definitions(-Os)
  endif()
elseif(MSVC)
  add_definitions(/W3)
  if(fatal_warnings)
    add_definitions(/WX)
  endif()
else()
  message(FATAL_ERROR "unhandled compiler id: ${CMAKE_C_COMPILER_ID}")
endif()

if(no_floats)
  add_definitions(-DCBOR_NO_FLOAT)
endif()

if(verbose)
  set(CMAKE_VERBOSE_MAKEFILE ON)
endif()

# ##############################################################################
# LIBRARY
# ##############################################################################

set(cbor_srcs src/cn-cbor.c src/cn-create.c src/cn-encoder.c src/cn-error.c
              src/cn-get.c src/cn-print.c)

if(align_reads)
  add_definitions(-DCBOR_ALIGN_READS)
endif()
if(use_context)
  add_definitions(-DUSE_CBOR_CONTEXT)
endif()
# default is static, can be shared if -DBUILD_SHARED_LIBS=ON passed to cmake
add_library(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE include/cn-cbor/cn-cbor.h ${cbor_srcs})
target_include_directories(
  ${PROJECT_NAME}
  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
  PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src)
if(MSVC)
  message("test: ${BUILD_SHARED_LIBS}")
  message("verbose: ${verbose}")
  target_link_libraries(${PROJECT_NAME} ws2_32)
endif()
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
if(coveralls)
  include(Coveralls)
  coveralls_turn_on_coverage()

  set(COVERAGE_SRCS "")
  foreach(S ${cbor_srcs})
    get_filename_component(S_ABS ${S} ABSOLUTE)
    list(APPEND COVERAGE_SRCS ${S_ABS})
  endforeach()

  # Create the coveralls target.
  coveralls_setup("${COVERAGE_SRCS}" ${coveralls_send} # If we should upload.
  )

  # add_dependencies(coveralls, all)
endif()

if(NOT MSVC)
  add_custom_target(
    size
    COMMAND echo "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o"
    COMMAND size "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o"
    COMMAND size -m "${CMAKE_BINARY_DIR}/src/CMakeFiles/cn-cbor.dir/cn-cbor.c.o"
    DEPENDS cn-cbor
    COMMENT "Output the size of the parse routine")
endif(NOT MSVC)

# ##############################################################################
# DOCS
# ##############################################################################

if(build_docs)
  find_package(Doxygen)

  if(NOT DOXYGEN_FOUND)
    message(WARNING "Doxygen is needed to build the documentation.")
  else()
    set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
    set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)

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

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

    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION share/doc)
  endif()
endif()

# ##############################################################################
# TESTS
# ##############################################################################

if(build_tests)
  include(CTest)
  add_subdirectory(test)
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
  include(LCov)
endif()

# ##############################################################################
# PACKAGING
# ##############################################################################

set(CPACK_GENERATOR "TGZ")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_IGNORE_FILES "/\\\\.git/")
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/.gitignore igs)
foreach(ig IN ITEMS ${igs})
  # remove comments
  string(REGEX REPLACE "^\\s*#.*" "" ig "${ig}")
  # remove any other whitespace
  string(STRIP "${ig}" ig)
  # anything left?
  if(ig)
    # dots are literal
    string(REPLACE "." "\\\\." ig "${ig}")
    # stars are on thars
    string(REPLACE "*" ".*" ig "${ig}")
    list(APPEND CPACK_SOURCE_IGNORE_FILES "/${ig}/")
  endif()
endforeach()

set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_CURRENT_SOURCE_DIR}/README.md)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")

include(CPack)

# ##############################################################################
# INSTALL
# ##############################################################################

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

install(FILES LICENSE README.md DESTINATION .)
set(CN_CBOR_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})

install(
  TARGETS ${PROJECT_NAME}
  EXPORT ${PROJECT_NAME}Targets
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib)

install(
  EXPORT ${PROJECT_NAME}Targets
  DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR}
  NAMESPACE ${PROJECT_NAME}::
  COMPONENT dev)

configure_package_config_file(cmake/Config.cmake.in ${PROJECT_NAME}Config.cmake
                              INSTALL_DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR})
write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
                                 COMPATIBILITY SameMajorVersion)
install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
  DESTINATION ${CN_CBOR_CONFIG_INSTALL_DIR}
  COMPONENT dev)

install(
  DIRECTORY include/
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  COMPONENT dev
  FILES_MATCHING
  PATTERN "*.h")
install(
  TARGETS cn-cbor
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin)
