# Notes:
#
# Author: Paul Harris, June 2012
# Additions: Joakim Soderberg, Febuary 2013
#
# Supports: building static/shared, release/debug/etc, can also build html docs
# and some of the tests.
# Note that its designed for out-of-tree builds, so it will not pollute your
# source tree.
#
# TODO 1: Finish implementing tests. api tests are working, but the valgrind
# variants are not flagging problems.
#
# TODO 2: There is a check_exports script that would try and incorporate.
#
# TODO 3: Consolidate version numbers, currently the version number is written
# into: * cmake (here) * autotools (the configure) * source code header files.
# Should not be written directly into header files, autotools/cmake can do
# that job.
#
# Brief intro on how to use cmake:
# > mkdir build (somewhere - we do out-of-tree builds)
# > use cmake, ccmake, or cmake-gui to configure the project. for linux, you
# can only choose one variant: release,debug,etc... and static or shared.
# >> example:
# >> cd build
# >> ccmake -i ../path_to_jansson_dir
# >>  inside, configure your options. press C until there are no lines
#     with * next to them.
# >>  note, I like to configure the 'install' path to ../install, so I get
#     self-contained clean installs I can point other projects to.
# >>  press G to 'generate' the project files.
# >> make (to build the project)
# >> make install
# >> make test (to run the tests, if you enabled them)
#
# Brief description on how it works:
# There is a small heirachy of CMakeLists.txt files which define how the
# project is built.
# Header file detection etc is done, and the results are written into config.h
# and jansson_config.h, which are generated from the corresponding
# config.h.cmake and jansson_config.h.cmake template files.
# The generated header files end up in the build directory - not in
# the source directory.
# The rest is down to the usual make process.

cmake_minimum_required(VERSION 2.8)
# required for exports? cmake_minimum_required (VERSION 2.8.6)
project(jansson C)

# Options
option(JANSSON_BUILD_SHARED_LIBS "Build shared libraries." OFF)
option(USE_URANDOM "Use /dev/urandom to seed the hash function." ON)
option(USE_WINDOWS_CRYPTOAPI "Use CryptGenRandom to seed the hash function." ON)

if(MSVC)
    # This option must match the settings used in your program, in particular if you
    # are linking statically
    option(JANSSON_STATIC_CRT "Link the static CRT libraries" OFF)
endif()

# Set some nicer output dirs.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

# Give the debug version a different postfix for windows,
# so both the debug and release version can be built in the
# same build-tree on Windows (MSVC).
if(WIN32)
    set(CMAKE_DEBUG_POSTFIX "_d")
else(WIN32)

endif(WIN32)

# This is how I thought it should go
# set (JANSSON_VERSION "2.3.1")
# set (JANSSON_SOVERSION 2)

set(JANSSON_DISPLAY_VERSION "2.7")

# This is what is required to match the same numbers as automake's
set(JANSSON_VERSION "4.7.0")
set(JANSSON_SOVERSION 4)

# for CheckFunctionKeywords
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

include(CheckCSourceCompiles)
include(CheckFunctionExists)
include(CheckFunctionKeywords)
include(CheckIncludeFiles)
include(CheckTypeSize)

if(MSVC)
    # Turn off Microsofts "security" warnings.
    add_definitions("/W3 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo")

    if(STATIC_CRT)
        set(CMAKE_C_FLAGS_RELEASE "/MT")
        set(CMAKE_C_FLAGS_DEBUG "/MTd")
    endif()

endif()

if(NOT WIN32 AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX))
    add_definitions("-fPIC")
endif()

check_include_files(endian.h HAVE_ENDIAN_H)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_include_files(sched.h HAVE_SCHED_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(sys/param.h HAVE_SYS_PARAM_H)
check_include_files(sys/stat.h HAVE_SYS_STAT_H)
check_include_files(sys/time.h HAVE_SYS_TIME_H)
check_include_files(sys/time.h HAVE_SYS_TYPES_H)

check_function_exists(close HAVE_CLOSE)
check_function_exists(getpid HAVE_GETPID)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(open HAVE_OPEN)
check_function_exists(read HAVE_READ)
check_function_exists(sched_yield HAVE_SCHED_YIELD)

# Check for the int-type includes
check_include_files(stdint.h HAVE_STDINT_H)

# Check our 64 bit integer sizes
check_type_size(__int64 __INT64)
check_type_size(int64_t INT64_T)
check_type_size("long long" LONG_LONG_INT)

# Check our 32 bit integer sizes
check_type_size(int32_t INT32_T)
check_type_size(__int32 __INT32)
check_type_size("long" LONG_INT)
check_type_size("int" INT)
if(HAVE_INT32_T)
    set(JSON_INT32 int32_t)
elseif(HAVE___INT32)
    set(JSON_INT32 __int32)
elseif(HAVE_LONG_INT AND (${LONG_INT} EQUAL 4))
    set(JSON_INT32 long)
elseif(HAVE_INT AND (${INT} EQUAL 4))
    set(JSON_INT32 int)
else()
    message(FATAL_ERROR "Could not detect a valid 32-bit integer type")
endif()

check_type_size("unsigned long" UNSIGNED_LONG_INT)
check_type_size("unsigned int" UNSIGNED_INT)
check_type_size("unsigned short" UNSIGNED_SHORT)

check_type_size(uint32_t UINT32_T)
check_type_size(__uint32 __UINT32)
if(HAVE_UINT32_T)
    set(JSON_UINT32 uint32_t)
elseif(HAVE___UINT32)
    set(JSON_UINT32 __uint32)
elseif(HAVE_UNSIGNED_LONG_INT AND (${UNSIGNED_LONG_INT} EQUAL 4))
    set(JSON_UINT32 "unsigned long")
elseif(HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 4))
    set(JSON_UINT32 "unsigned int")
else()
    message(FATAL_ERROR "Could not detect a valid unsigned 32-bit integer type")
endif()

check_type_size(uint16_t UINT16_T)
check_type_size(__uint16 __UINT16)
if(HAVE_UINT16_T)
    set(JSON_UINT16 uint16_t)
elseif(HAVE___UINT16)
    set(JSON_UINT16 __uint16)
elseif(HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 2))
    set(JSON_UINT16 "unsigned int")
elseif(HAVE_UNSIGNED_SHORT AND (${UNSIGNED_SHORT} EQUAL 2))
    set(JSON_UINT16 "unsigned short")
else()
    message(FATAL_ERROR "Could not detect a valid unsigned 16-bit integer type")
endif()

check_type_size(uint8_t UINT8_T)
check_type_size(__uint8 __UINT8)
if(HAVE_UINT8_T)
    set(JSON_UINT8 uint8_t)
elseif(HAVE___UINT8)
    set(JSON_UINT8 __uint8)
else()
    set(JSON_UINT8 "unsigned char")
endif()

# Check for ssize_t and SSIZE_T existance.
check_type_size(ssize_t SSIZE_T)
check_type_size(SSIZE_T UPPERCASE_SSIZE_T)
if(NOT HAVE_SSIZE_T)
    if(HAVE_UPPERCASE_SSIZE_T)
        set(JSON_SSIZE SSIZE_T)
    else()
        set(JSON_SSIZE int)
    endif()
endif()
set(CMAKE_EXTRA_INCLUDE_FILES "")

# Check for all the variants of strtoll
check_function_exists(strtoll HAVE_STRTOLL)
check_function_exists(strtoq HAVE_STRTOQ)
check_function_exists(_strtoi64 HAVE__STRTOI64)

# Figure out what variant we should use
if(HAVE_STRTOLL)
    set(JSON_STRTOINT strtoll)
elseif(HAVE_STRTOQ)
    set(JSON_STRTOINT strtoq)
elseif(HAVE__STRTOI64)
    set(JSON_STRTOINT _strtoi64)
else()
    # fallback to strtol (32 bit)
    # this will set all the required variables
    set(JSON_STRTOINT strtol)
    set(JSON_INT_T long)
    set(JSON_INTEGER_FORMAT "\"ld\"")
    set(JSON_NUMBER_FORMAT "\"lu\"")
endif()

# if we haven't defined JSON_INT_T, then we have a 64 bit conversion function.
# detect what to use for the 64 bit type.
# Note: I will prefer long long if I can get it, as that is what the automake system aimed for.
if(NOT DEFINED JSON_INT_T)
    if(HAVE_LONG_LONG_INT AND (${LONG_LONG_INT} EQUAL 8))
        set(JSON_INT_T "long long")
    elseif(HAVE_INT64_T)
        set(JSON_INT_T int64_t)
    elseif(HAVE___INT64)
        set(JSON_INT_T __int64)
    else()
        message(
            FATAL_ERROR "Could not detect 64 bit type, although I detected the strtoll equivalent"
        )
    endif()

    # Apparently, Borland BCC and MSVC wants I64d,
    # Borland BCC could also accept LD
    # and gcc wants ldd,
    # I am not sure what cygwin will want, so I will assume I64d

    if(WIN32) # matches both msvc and cygwin
        set(JSON_INTEGER_FORMAT "\"I64d\"")
        set(JSON_NUMBER_FORMAT "\"I64u\"")
    else()
        set(JSON_INTEGER_FORMAT "\"lld\"")
        set(JSON_NUMBER_FORMAT "\"llu\"")
    endif()
endif()

# If locale.h and localeconv() are available, define to 1, otherwise to 0.
check_include_files(locale.h HAVE_LOCALE_H)
check_function_exists(localeconv HAVE_LOCALECONV)

if(HAVE_LOCALECONV AND HAVE_LOCALE_H)
    set(JSON_HAVE_LOCALECONV 1)
else()
    set(JSON_HAVE_LOCALECONV 0)
endif()

# check if we have setlocale
check_function_exists(setlocale HAVE_SETLOCALE)

# Check what the inline keyword is.
# Note that the original JSON_INLINE was always set to just 'inline', so this goes further.
check_function_keywords("inline")
check_function_keywords("__inline")
check_function_keywords("__inline__")

if(HAVE_INLINE)
    set(JSON_INLINE inline)
elseif(HAVE___INLINE)
    set(JSON_INLINE __inline)
elseif(HAVE___INLINE__)
    set(JSON_INLINE __inline__)
else()
    # no inline on this platform
    set(JSON_INLINE)
endif()

# Find our snprintf
check_function_exists(snprintf HAVE_SNPRINTF)
check_function_exists(_snprintf HAVE__SNPRINTF)

if(HAVE_SNPRINTF)
    set(JSON_SNPRINTF snprintf)
elseif(HAVE__SNPRINTF)
    set(JSON_SNPRINTF _snprintf)
endif()

check_c_source_compiles(
    "int main() { unsigned long val; __sync_bool_compare_and_swap(&val, 0, 1); return 0; } "
    HAVE_SYNC_BUILTINS
)
check_c_source_compiles(
    "int main() { char l; unsigned long v; __atomic_test_and_set(&l, __ATOMIC_RELAXED); __atomic_store_n(&v, 1, __ATOMIC_RELEASE); __atomic_load_n(&v, __ATOMIC_ACQUIRE); return 0; }"
    HAVE_ATOMIC_BUILTINS
)

# Create pkg-conf file.
# (We use the same files as ./configure does, so we
#  have to defined the same variables used there).
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    set(CMAKE_INSTALL_LIBDIR lib)
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(VERSION ${JANSSON_DISPLAY_VERSION})
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY
)

# configure the public config file
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_config.h.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h
)

# Copy the jansson.h file to the public include folder
file(
    COPY
    ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h
    DESTINATION
    ${CMAKE_CURRENT_BINARY_DIR}/include/
)

add_definitions(-DJANSSON_USING_CMAKE)

# configure the private config file
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_private_config.h.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h
)

# and tell the source code to include it
add_definitions(-DHAVE_CONFIG_H)

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/private_include)

# Add the lib sources.
file(GLOB JANSSON_SRC src/*.c)

set(
    JANSSON_HDR_PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src/hashtable.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson_private.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/strbuffer.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/utf.h
    ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h
)

set(
    JANSSON_HDR_PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h
)

source_group("Library Sources" FILES ${JANSSON_SRC})
source_group("Library Private Headers" FILES ${JANSSON_HDR_PRIVATE})
source_group("Library Public Headers" FILES ${JANSSON_HDR_PUBLIC})

if(JANSSON_BUILD_SHARED_LIBS)
    add_library(
        jansson
        SHARED
        ${JANSSON_SRC}
        ${JANSSON_HDR_PRIVATE}
        ${JANSSON_HDR_PUBLIC}
        src/jansson.def
    )

    set_target_properties(
        jansson
        PROPERTIES
            VERSION
            ${JANSSON_VERSION}
            SOVERSION
            ${JANSSON_SOVERSION}
    )
else()
    add_library(jansson ${JANSSON_SRC} ${JANSSON_HDR_PRIVATE} ${JANSSON_HDR_PUBLIC})
endif()

# For building Documentation (uses Sphinx)
option(JANSSON_BUILD_DOCS "Build documentation (uses python-sphinx)." ON)
if(JANSSON_BUILD_DOCS)
    find_package(Sphinx)

    if(NOT SPHINX_FOUND)
        message(WARNING "Sphinx not found. Cannot generate documentation!
      Set -DJANSSON_BUILD_DOCS=OFF to get rid of this message.")
    else()
        if(Sphinx_VERSION_STRING VERSION_LESS 1.0)
            message(WARNING "Your Sphinx version is too old!
               This project requires Sphinx v1.0 or above to produce
               proper documentation (you have v${Sphinx_VERSION_STRING}).
               You will get output but it will have errors.")
        endif()

        # configured documentation tools and intermediate build results
        set(BINARY_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/_build")

        # Sphinx cache with pickled ReST documents
        set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees")

        # CMake could be used to build the conf.py file too,
        # eg it could automatically write the version of the program or change the theme.
        # if(NOT DEFINED SPHINX_THEME)
        #    set(SPHINX_THEME default)
        # endif()
        #
        # if(NOT DEFINED SPHINX_THEME_DIR)
        #    set(SPHINX_THEME_DIR)
        # endif()
        #
        # configure_file(
        #    "${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in"
        #    "${BINARY_BUILD_DIR}/conf.py"
        #    @ONLY)

        # TODO: Add support for all sphinx builders: http://sphinx-doc.org/builders.html

        # Add documentation targets.
        set(DOC_TARGETS html)

        option(JANSSON_BUILD_MAN "Create a target for building man pages." ON)

        if(JANSSON_BUILD_MAN)
            if(Sphinx_VERSION_STRING VERSION_LESS 1.0)
                message(
                    WARNING
                        "Sphinx version 1.0 > is required to build man pages. You have v${Sphinx_VERSION_STRING}."
                )
            else()
                list(APPEND DOC_TARGETS man)
            endif()
        endif()

        option(JANSSON_BUILD_LATEX "Create a target for building latex docs (to create PDF)." OFF)

        if(JANSSON_BUILD_LATEX)
            find_package(LATEX)

            if(NOT LATEX_COMPILER)
                message("Couldn't find Latex, can't build latex docs using Sphinx")
            else()
                message(
                    "Latex found! If you have problems building, see Sphinx documentation for required Latex packages."
                )
                list(APPEND DOC_TARGETS latex)
            endif()
        endif()

        # The doc target will build all documentation targets.
        add_custom_target(doc)

        foreach(DOC_TARGET ${DOC_TARGETS})
            add_custom_target(
                ${DOC_TARGET} ${SPHINX_EXECUTABLE}
                # -q   # Enable for quiet mode
                -b
                ${DOC_TARGET}
                -d
                "${SPHINX_CACHE_DIR}"
                # -c "${BINARY_BUILD_DIR}" # enable if using cmake-generated conf.py
                "${CMAKE_CURRENT_SOURCE_DIR}/doc" "${CMAKE_CURRENT_BINARY_DIR}/doc/${DOC_TARGET}"
                COMMENT "Building ${DOC_TARGET} documentation with Sphinx"
            )

            add_dependencies(doc ${DOC_TARGET})
        endforeach()

        message("Building documentation enabled for: ${DOC_TARGETS}")
    endif()
endif()

option(JANSSON_WITHOUT_TESTS "Don't build tests ('make test' to execute tests)" OFF)

if(NOT JANSSON_WITHOUT_TESTS)
    option(JANSSON_TEST_WITH_VALGRIND "Enable valgrind tests." OFF)

    ENABLE_TESTING()

    if(JANSSON_TEST_WITH_VALGRIND)
        # TODO: Add FindValgrind.cmake instead of having a hardcoded path.

        add_definitions(-DVALGRIND)

        # enable valgrind
        set(CMAKE_MEMORYCHECK_COMMAND valgrind)
        set(
            CMAKE_MEMORYCHECK_COMMAND_OPTIONS
            "--error-exitcode=1 --leak-check=full --show-reachable=yes --track-origins=yes -q"
        )

        set(MEMCHECK_COMMAND "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}")
        separate_arguments(MEMCHECK_COMMAND)
    endif()

    #
    # Test suites.
    #
    if(CMAKE_COMPILER_IS_GNUCC)
        add_definitions(-Wall -Wextra -Wdeclaration-after-statement)
    endif()

    set(
        api_tests
        test_array
        test_copy
        test_dump
        test_dump_callback
        test_equal
        test_load
        test_loadb
        test_number
        test_object
        test_pack
        test_simple
        test_unpack
    )

    # Doing arithmetic on void pointers is not allowed by Microsofts compiler
    # such as secure_malloc and secure_free is doing, so exclude it for now.
    if(NOT MSVC)
        list(APPEND api_tests test_memory_funcs)
    endif()

    # Helper macro for building and linking a test program.
    macro(build_testprog name dir)
        add_executable(${name} ${dir}/${name}.c)
        add_dependencies(${name} jansson)
        target_link_libraries(${name} jansson)
    endmacro(build_testprog)

    # Create executables and tests/valgrind tests for API tests.
    foreach(test ${api_tests})
        build_testprog(${test} ${PROJECT_SOURCE_DIR}/test/suites/api)

        if(JANSSON_TEST_WITH_VALGRIND)
            add_test(
                memcheck__${test} ${MEMCHECK_COMMAND} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test}
            )
        else()
            add_test(${test} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test})
        endif()
    endforeach()

    # Test harness for the suites tests.
    build_testprog(json_process ${PROJECT_SOURCE_DIR}/test/bin)

    set(SUITES encoding-flags valid invalid invalid-unicode)
    foreach(SUITE ${SUITES})
        file(GLOB TESTDIRS ${jansson_SOURCE_DIR}/test/suites/${SUITE}/*)

        foreach(TESTDIR ${TESTDIRS})
            if(IS_DIRECTORY ${TESTDIR})
                get_filename_component(TNAME ${TESTDIR} NAME)

                set(SUITE_TEST_CMD ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/json_process)

                if(JANSSON_TEST_WITH_VALGRIND)
                    add_test(
                        memcheck__${SUITE}__${TNAME}
                        ${MEMCHECK_COMMAND}
                        ${SUITE_TEST_CMD}
                        ${TESTDIR}
                    )
                else()
                    add_test(${SUITE}__${TNAME} ${SUITE_TEST_CMD} ${TESTDIR})
                endif()

                if(
                    (${SUITE} STREQUAL "valid" OR ${SUITE} STREQUAL "invalid")
                    AND NOT EXISTS ${TESTDIR}/nostrip
                )
                    if(JANSSON_TEST_WITH_VALGRIND)
                        add_test(
                            memcheck__${SUITE}__${TNAME}__strip
                            ${MEMCHECK_COMMAND}
                            ${SUITE_TEST_CMD}
                            --strip
                            ${TESTDIR}
                        )
                    else()
                        add_test(${SUITE}__${TNAME}__strip ${SUITE_TEST_CMD} --strip ${TESTDIR})
                    endif()
                endif()
            endif()
        endforeach()
    endforeach()

    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS json_process ${api_tests})
endif()

#
# Installation preparation.
#

# Allow the user to override installation directories.
set(JANSSON_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(JANSSON_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
set(JANSSON_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")

if(WIN32 AND NOT CYGWIN)
    set(DEF_INSTALL_CMAKE_DIR cmake)
else()
    set(DEF_INSTALL_CMAKE_DIR lib/cmake/jansson)
endif()

set(
    JANSSON_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR}
    CACHE PATH "Installation directory for CMake files"
)

# Make sure the paths are absolute.
foreach(p LIB BIN INCLUDE CMAKE)
    set(var JANSSON_INSTALL_${p}_DIR)
    if(NOT IS_ABSOLUTE "${${var}}")
        set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
    endif()
endforeach()

# Export targets (This is used for other CMake projects to easily find the libraries and include files).
export(TARGETS jansson FILE "${PROJECT_BINARY_DIR}/JanssonTargets.cmake")
export(PACKAGE jansson)

# Generate the config file for the build-tree.
set(JANSSON__INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include" "${PROJECT_BINARY_DIR}/include")
set(JANSSON_INCLUDE_DIRS ${JANSSON__INCLUDE_DIRS} CACHE PATH "Jansson include directories")
configure_file(
    ${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in ${PROJECT_BINARY_DIR}/JanssonConfig.cmake
    @ONLY
)

# Generate the config file for the installation tree.
file(
    RELATIVE_PATH REL_INCLUDE_DIR "${JANSSON_INSTALL_CMAKE_DIR}" "${JANSSON_INSTALL_INCLUDE_DIR}"
) # Calculate the relative directory from the Cmake dir.

# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in,
# we escape it here so it's evaluated when it is included instead
# so that the include dirs are given relative to where the
# config file is located.
set(JANSSON__INCLUDE_DIRS "\${JANSSON_CMAKE_DIR}/${REL_INCLUDE_DIR}")
configure_file(
    ${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in
    ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake @ONLY
)

# Generate version info for both build-tree and install-tree.
configure_file(
    ${PROJECT_SOURCE_DIR}/cmake/JanssonConfigVersion.cmake.in
    ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake @ONLY
)

# Define the public headers.
set_target_properties(jansson PROPERTIES PUBLIC_HEADER "${JANSSON_HDR_PUBLIC}")
#TODO: fix this.

# Create pkg-conf file.
# (We use the same files as ./configure does, so we
#  have to defined the same variables used there).
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/${JANSSON_INSTALL_LIB_DIR})
set(VERSION ${JANSSON_DISPLAY_VERSION})
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY
)

#
# Install targets.
#
install(
    TARGETS jansson
    EXPORT JanssonTargets
    LIBRARY DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib
    ARCHIVE DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib
    RUNTIME
        DESTINATION "${JANSSON_INSTALL_BIN_DIR}"
        COMPONENT
            lib # Windows DLLs
    PUBLIC_HEADER DESTINATION "${JANSSON_INSTALL_INCLUDE_DIR}" COMPONENT dev
)

# Install the pkg-config.
install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc
    DESTINATION ${JANSSON_INSTALL_LIB_DIR}/pkgconfig
    COMPONENT dev
)

# Install the configs.
install(
    FILES
        ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake
        ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake
    DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}"
    COMPONENT dev
)

# Install exports for the install-tree.
install(EXPORT JanssonTargets DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev)

# For use when simply using add_library from a parent project to build jansson.
set(JANSSON_LIBRARIES jansson CACHE STRING "Jansson libraries")
