
cmake_minimum_required(VERSION 3.5)
enable_testing()

project(YAMML VERSION ${PROJECT_VERSION})

set(PEGTLIncludeDir "../PEGTL" CACHE PATH "PEGTL include directory")
set(YAMMLStaticLink FALSE CACHE BOOL "Link libraries statically")
set(YAMMLStaticCRT FALSE CACHE BOOL "Use static link CRT")
set(WarningAsError TRUE CACHE BOOL "Treat warnings as errors")

if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
    set(UsePCH TRUE CACHE BOOL "Use precompiled headers")
else()
    set(UsePCH FALSE CACHE BOOL "Use precompiled headers")
endif()

add_definitions(
    -DYAMML_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
    -DYAMML_VERSION_MINOR=${PROJECT_VERSION_MINOR}
    -DYAMML_VERSION_DATE=${PROJECT_VERSION_PATCH}
    -DYAMML_VERSION_BUILD=${PROJECT_VERSION_TWEAK}
    
    -DWIN32_LEAN_AND_MEAN
    -D_HAS_AUTO_PTR_ETC=1
    -D_CRT_SECURE_NO_WARNINGS
    -D_SCL_SECURE_NO_WARNINGS
)

if("${MSVC}")
    add_compile_options(/EHsc /W4)
else()
    add_compile_options(-std=c++1z -Wall -Wextra -Wno-missing-field-initializers)
endif()

if("${WarningAsError}")
    if("${MSVC}")
        add_compile_options(/WX)
    else()
        add_compile_options(-Werror)
    endif()
endif()

if("${MSVC}" AND (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 19.00.23918))
    set(MSVC14_3_OR_GREATER 1)
    add_compile_options(/std:c++latest)
endif()

if("${MSVC14}" AND "${MSVC14_3_OR_GREATER}")
    add_definitions(-D_HAS_VARIABLE_TEMPLATES=1)
endif()

if(${YAMMLStaticCRT})
    # http://stackoverflow.com/questions/14172856/cmake-compile-with-mt-instead-of-md
    set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
        )

    foreach(CompilerFlag ${CompilerFlags})
      string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
    endforeach()
    
    set(Boost_USE_STATIC_RUNTIME ON)
endif()

if(${YAMMLStaticLink})
    set(YAMMLLibLinkType "STATIC")
    set(Boost_USE_STATIC_LIBS ON)
else()
    set(YAMMLLibLinkType "SHARED")
    add_definitions(-DBOOST_ALL_DYN_LINK)
endif()

if("${CMAKE_BUILD_TYPE}" MATCHES "Rel")
    set(Boost_USE_DEBUG_RUNTIME OFF)
endif()

if("${CYGWIN}" OR "${MINGW}")
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s")
endif()

find_package(Boost COMPONENTS program_options unit_test_framework REQUIRED)

include(cmake/common.cmake)

include_directories("include" ${Boost_INCLUDE_DIRS} ${PEGTLIncludeDir})
link_directories(${Boost_LIBRARY_DIRS})

add_subdirectory(src)
add_subdirectory(test)

