cmake_minimum_required(VERSION 3.5)

set(LIBSTRONG_VERSION "1.0.0")
set(PACKAGE_NAME      "libstrong")
set(PACKAGE_VERSION   "${LIBSTRONG_VERSION}")
set(PACKAGE_STRING    "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_TARNAME   "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(PACKAGE_BUGREPORT "https://gitlab.office.nic.cz/fred/libstrong/")

set(LibStrong_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
set(LibStrong_INSTALL_CMAKEDIR "lib/cmake/${PACKAGE_NAME}" CACHE STRING "Installation directory for cmake config files")

# Options
option(LibStrong_BUILD_TESTS "Build tests" OFF)

cmake_policy(SET CMP0048 NEW)
project(LibStrong
    VERSION "${PACKAGE_VERSION}"
    LANGUAGES CXX)

message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")

get_directory_property(HAS_PARENT PARENT_DIRECTORY)
if(HAS_PARENT)
    set(LIBSTRONG_VERSION ${LibStrong_VERSION} PARENT_SCOPE)
endif()

find_package(Boost 1.35.0 REQUIRED)

##############################################
# Create target and set properties
add_library(strong INTERFACE)

#Add an alias so that library can be used inside the build tree, e.g. when testing
add_library(LibStrong::library ALIAS strong)

#Set target properties
target_include_directories(strong
    INTERFACE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
)

target_compile_features(strong INTERFACE cxx_decltype_auto)

add_library(strong-static-asserts src/type.cc)
target_compile_options(strong-static-asserts PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -ggdb -grecord-gcc-switches>)
set_target_properties(strong-static-asserts PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib")
target_link_libraries(strong-static-asserts PRIVATE LibStrong::library)

if(LibStrong_BUILD_TESTS)
    add_subdirectory(test)
endif()

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
    find_program(GIT_PROGRAM git)
    if(GIT_PROGRAM)
        if(TARBALL_FILE_NAME)
            add_custom_target(dist_libstrong
                COMMAND ${GIT_PROGRAM} archive --format=tar --prefix=${TARBALL_FILE_NAME}/external/lib/${PACKAGE_NAME}/ -o ${CMAKE_BINARY_DIR}/.${PACKAGE_NAME}.tar HEAD
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
        else()
            add_custom_target(make_dist_tarball
                COMMAND ${GIT_PROGRAM} archive --format=tar --prefix=${PACKAGE_TARNAME}/ -o ${CMAKE_BINARY_DIR}/.${PACKAGE_TARNAME}.tar HEAD
                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
            add_custom_target(dist
                COMMAND cat ${CMAKE_BINARY_DIR}/.${PACKAGE_TARNAME}.tar | gzip > ${CMAKE_BINARY_DIR}/${PACKAGE_TARNAME}.tar.gz
                COMMAND rm ${CMAKE_BINARY_DIR}/.${PACKAGE_TARNAME}.tar
                DEPENDS make_dist_tarball
                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

            set(DISTCHECK_BUILD_DIR "_build")
            if(${CMAKE_GENERATOR} STREQUAL "Ninja")
                set(DISTCHECK_BUILD_CMD "ninja")
            else()
                set(DISTCHECK_BUILD_CMD "$(MAKE)")
            endif()
            if(DEFINED ENV{DISTCHECK_CMAKE_FLAGS})
                set(distcheck_flags $ENV{DISTCHECK_CMAKE_FLAGS})
            endif()
            add_custom_target(clean_before_distcheck
                COMMAND rm -rf ${DISTCHECK_BUILD_DIR} ${PACKAGE_TARNAME}
                COMMENT "cleaning before distcheck start")
            add_custom_target(distcheck_make_dirs
                COMMAND mkdir ${DISTCHECK_BUILD_DIR}
                COMMENT "make distcheck build and install directories"
                DEPENDS clean_before_distcheck)
            add_custom_target(distcheck_unpack_archive
                COMMAND tar xzf ${PACKAGE_TARNAME}.tar.gz
                COMMENT "Checking the distribution archive..."
                DEPENDS dist distcheck_make_dirs)
            add_custom_target(distcheck_configure
                COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} ${distcheck_flags} ../${PACKAGE_TARNAME}
                COMMENT "configure distcheck"
                DEPENDS distcheck_unpack_archive
                WORKING_DIRECTORY ${DISTCHECK_BUILD_DIR})
            add_custom_target(distcheck_make
                COMMAND ${DISTCHECK_BUILD_CMD}
                COMMENT "make"
                DEPENDS distcheck_configure
                WORKING_DIRECTORY ${DISTCHECK_BUILD_DIR})
            add_custom_target(distcheck_clean
                COMMAND ${DISTCHECK_BUILD_CMD} clean
                COMMENT "make clean"
                DEPENDS distcheck_make
                WORKING_DIRECTORY ${DISTCHECK_BUILD_DIR})
            add_custom_target(distcheck
                COMMAND rm -rf ${DISTCHECK_BUILD_DIR} ${PACKAGE_TARNAME}
                COMMENT "PASS: '${PACKAGE_TARNAME}.tar.gz' is ready for distribution."
                DEPENDS distcheck_clean)
        endif()
    endif()
endif()
