cmake_minimum_required(VERSION 3.14)

# Keep this source list aligned with VrUtils.pro. Do not glob Src/: it contains
# legacy standalone sources such as getopt.c that are not part of VrUtils.
set(VRUTILS_SOURCES
    Src/VrDateUtils.cpp
    Src/VrFileUtils.cpp
    Src/VrLog.cpp
    Src/VrNetUtils.cpp
    Src/VrStringUtils.cpp
    Src/VrTimeUtils.cpp
    ini/ConvertUTF.c
    log4cpp/src/AbortAppender.cpp
    log4cpp/src/Appender.cpp
    log4cpp/src/AppenderSkeleton.cpp
    log4cpp/src/AppendersFactory.cpp
    log4cpp/src/BasicConfigurator.cpp
    log4cpp/src/BasicLayout.cpp
    log4cpp/src/BufferingAppender.cpp
    log4cpp/src/Category.cpp
    log4cpp/src/CategoryStream.cpp
    log4cpp/src/Configurator.cpp
    log4cpp/src/DailyRollingFileAppender.cpp
    log4cpp/src/DllMain.cpp
    log4cpp/src/DummyThreads.cpp
    log4cpp/src/FactoryParams.cpp
    log4cpp/src/FileAppender.cpp
    log4cpp/src/Filter.cpp
    log4cpp/src/FixedContextCategory.cpp
    log4cpp/src/HierarchyMaintainer.cpp
    log4cpp/src/IdsaAppender.cpp
    log4cpp/src/LayoutAppender.cpp
    log4cpp/src/LayoutsFactory.cpp
    log4cpp/src/LevelEvaluator.cpp
    log4cpp/src/Localtime.cpp
    log4cpp/src/LoggingEvent.cpp
    log4cpp/src/MSThreads.cpp
    log4cpp/src/Manipulator.cpp
    log4cpp/src/NDC.cpp
    log4cpp/src/NTEventLogAppender.cpp
    log4cpp/src/OmniThreads.cpp
    log4cpp/src/OstreamAppender.cpp
    log4cpp/src/PThreads.cpp
    log4cpp/src/PassThroughLayout.cpp
    log4cpp/src/PatternLayout.cpp
    log4cpp/src/PortabilityImpl.cpp
    log4cpp/src/Priority.cpp
    log4cpp/src/Properties.cpp
    log4cpp/src/PropertyConfigurator.cpp
    log4cpp/src/PropertyConfiguratorImpl.cpp
    log4cpp/src/RemoteSyslogAppender.cpp
    log4cpp/src/RollingFileAppender.cpp
    log4cpp/src/SimpleConfigurator.cpp
    log4cpp/src/SimpleLayout.cpp
    log4cpp/src/SmtpAppender.cpp
    log4cpp/src/StringQueueAppender.cpp
    log4cpp/src/StringUtil.cpp
    log4cpp/src/SyslogAppender.cpp
    log4cpp/src/TimeStamp.cpp
    log4cpp/src/TriggeringEventEvaluatorFactory.cpp
    log4cpp/src/Win32DebugAppender.cpp
    log4cpp/src/snprintf.c
    tinyxml2/tinyxml2.cpp
    jsoncpp/json_reader.cpp
    jsoncpp/json_value.cpp
    jsoncpp/json_writer.cpp
)

add_library(VrUtils STATIC ${VRUTILS_SOURCES})

set_target_properties(VrUtils PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)

target_include_directories(VrUtils
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/Inc
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/ini
        ${CMAKE_CURRENT_SOURCE_DIR}/tinyxml2
        ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp
        ${CMAKE_CURRENT_SOURCE_DIR}/log4cpp/include
        ${CMAKE_CURRENT_SOURCE_DIR}/log4cpp/src
)

target_compile_definitions(VrUtils PRIVATE
    TINYXML2_EXPORT
    HAVE_SNPRINTF
    LOG4CPP_HAVE_SSTREAM=1
    VR_UTILS_EXPORTS
)

if(UNIX AND NOT APPLE)
    target_compile_definitions(VrUtils PRIVATE LOG4CPP_HAVE_UNISTD_H)
    set_target_properties(VrUtils PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()

find_package(Threads REQUIRED)
target_link_libraries(VrUtils PUBLIC Threads::Threads)

if(WIN32)
    # qmake's Windows mkspec supplies these definitions. log4cpp uses the
    # generic Win32 API names and therefore must see the same character mode.
    target_compile_definitions(VrUtils PRIVATE UNICODE _UNICODE)
    target_link_libraries(VrUtils PUBLIC ws2_32 iphlpapi advapi32 shell32)
endif()

if(MSVC)
    target_compile_definitions(VrUtils PRIVATE _HAS_AUTO_PTR_ETC=1)
    target_compile_options(VrUtils PRIVATE /utf-8)
endif()
