cmake_minimum_required (VERSION 3.20)

project (jsoncpp)

set(JSON_VERSION "1.9.0")
set(JSON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp)

if(EXISTS ${JSON_DIR})
    message(STATUS "jsoncpp exists.")
else()
    set(JSON_TAR_GZ "jsoncpp-${JSON_VERSION}.tar.gz")
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${JSON_TAR_GZ})
        message(STATUS "Using ${CMAKE_CURRENT_SOURCE_DIR}/${JSON_TAR_GZ}")
    else()
        # https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.0.tar.gz
        set(JSON_URL "https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/${JSON_VERSION}.tar.gz")

        message(STATUS "Downloading ${JSON_TAR_GZ} from: ${JSON_URL}")
        file(DOWNLOAD
            ${JSON_URL} "${CMAKE_CURRENT_SOURCE_DIR}/${JSON_TAR_GZ}"
            SHOW_PROGRESS
            STATUS DOWNLOAD_STATUS)

        list(GET DOWNLOAD_STATUS 0 DOWNLOAD_STATUS_CODE)
        list(GET DOWNLOAD_STATUS 1 DOWNLOAD_STATUS_MSG)
        if(DOWNLOAD_STATUS_CODE)
            message(FATAL_ERROR "Failed to download ${JSON_TAR_GZ}! -- Error: ${DOWNLOAD_STATUS_MSG}")
        else()
            message(STATUS "Download complete!")
        endif()
    endif()

    file(ARCHIVE_EXTRACT
        INPUT ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp-${JSON_VERSION}.tar.gz
        DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    )

    file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp-${JSON_VERSION} ${JSON_DIR})
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp_version.h.in ${JSON_DIR}/include/json/version.h COPYONLY)
endif()

if( CMAKE_COMPILER_IS_GNUCXX )
  #Get compiler version.
  execute_process( COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
                   OUTPUT_VARIABLE GNUCXX_VERSION )

  #-Werror=* was introduced -after- GCC 4.1.2
  if( GNUCXX_VERSION VERSION_GREATER 4.1.2 )
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=strict-aliasing")
  endif()
endif( CMAKE_COMPILER_IS_GNUCXX )

SET( JSONCPP_INCLUDE_DIR jsoncpp/include )
SET( JSONCPP_SOURCE_DIR jsoncpp/src/lib_json )

SET( PUBLIC_HEADERS
        ${JSONCPP_INCLUDE_DIR}/json/config.h
        ${JSONCPP_INCLUDE_DIR}/json/forwards.h
        ${JSONCPP_INCLUDE_DIR}/json/features.h
        ${JSONCPP_INCLUDE_DIR}/json/value.h
        ${JSONCPP_INCLUDE_DIR}/json/reader.h
        ${JSONCPP_INCLUDE_DIR}/json/writer.h
        ${JSONCPP_INCLUDE_DIR}/json/assertions.h
        ${JSONCPP_INCLUDE_DIR}/json/version.h
    )

SOURCE_GROUP( "Public API" FILES ${PUBLIC_HEADERS} )

SET(jsoncpp_sources
        ${JSONCPP_SOURCE_DIR}/json_tool.h
        ${JSONCPP_SOURCE_DIR}/json_reader.cpp
        ${JSONCPP_SOURCE_DIR}/json_valueiterator.inl
        ${JSONCPP_SOURCE_DIR}/json_value.cpp
        ${JSONCPP_SOURCE_DIR}/json_writer.cpp
    )

ADD_LIBRARY(jsoncpp_lib_static STATIC ${PUBLIC_HEADERS} ${jsoncpp_sources})
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES OUTPUT_NAME jsoncpp
                        DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )

INSTALL( TARGETS jsoncpp_lib_static ${INSTALL_EXPORT}
        RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
        LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
            ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})

IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
    TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib_static PUBLIC
                            $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
                            $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
                            )
    ENDIF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
