cmake_minimum_required(VERSION 2.9.0)
project(RunTests)

message(STATUS "running 'CPP' makelists...")

# Set the correct C++ Standard
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Make certain, if windows, the correct declspecs (and windows platform) are defined.
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    # APPEND ANY OTHER COMPILER FLAGS HERE
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKOJEN_EXPORTS")
    # For some reason, in windows '_AMD64_' is not defined...and is required when using Windows stuff (inluding windows.h for critical sections etc)...to be better investigated. 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_AMD64_")
    #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Dx86")
    #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601 -DWINVER=0x400")
endif()

# Include all framework files
file(GLOB SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/*.cpp)
file(GLOB HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/*.h)

# Include all autogenerated files in parent directory...
set(AUTOGEN_DIR "${CMAKE_CURRENT_LIST_DIR}/../")
include_directories(${AUTOGEN_DIR})
file(GLOB AUTOGEN_SRC_FILES ${AUTOGEN_DIR}/*.cpp)
file(GLOB AUTOGEN_H_FILES ${AUTOGEN_DIR}/*.h)
set(AUTOGEN_FILES
    ${AUTOGEN_SRC_FILES}
    ${AUTOGEN_H_FILES}
)

# Include the current directory
include_directories(${CMAKE_CURRENT_LIST_DIR})

# Include the testsuite folder ... the main test application will be created in that.
set(TEST_SUITE_DIR "${CMAKE_CURRENT_LIST_DIR}/testsuite")
include_directories(${TEST_SUITE_DIR})
include(${TEST_SUITE_DIR}/CMakeLists.txt)

# Windows will do this automatically
if (NOT WIN32)
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE})
endif()

add_executable(RunTests
    ${AUTOGEN_FILES}
    ${SOURCE_FILES}
    ${HEADER_FILES}
    )

# Internal CMake module magic (https://github.com/Kitware/CMake/tree/v3.1.0/Modules)
# to find and link correct threading library based on platform (https://stackoverflow.com/questions/1620918/cmake-and-libpthread)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(RunTests PRIVATE Threads::Threads)


set(GENERATE_FREERTOS OFF)
message(CHECK_START "Generating FreeRTOS project...")
if(${GENERATE_FREERTOS})
    message(CHECK_PASS "enabled")
    ###
    ### For freertos (in windows) testing DLL project. DONT link to the executable...that is standalone.
    ### The lib is to be used from another project...add specific options to it.
    ###
    add_library (KoJen_FreeRTOS_Win32 SHARED
        ${AUTOGEN_FILES}
        ${SOURCE_FILES}
        ${HEADER_FILES}
        )
    target_compile_definitions(KoJen_FreeRTOS_Win32
                            PUBLIC
                            __FREERTOS__
                            __arm__
                            )

    set(FREERTOS_SOURCE_INCLUDE "D:/FreeRTOS/FreeRTOS/Source/include" CACHE FILEPATH "Path to your FreeRTOS source includes.")
    set(FREERTOS_DEMO_INCLUDE "D:/FreeRTOS/FreeRTOS/Demo/WIN32-MSVC" CACHE FILEPATH "Path to your FreeRTOS Win32 DEMO.")
    set(FREERTOS_PLUS_TRACE_INCLUDE "D:/FreeRTOS/FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace/Include" CACHE FILEPATH "Path to your FreeRTOS PLUS Trace include.")
    set(FREERTOS_PLUS_TRACE_REC_CONFIG_INCLUDE "D:/FreeRTOS/FreeRTOS/Demo/WIN32-MSVC/Trace_Recorder_Configuration" CACHE FILEPATH "Path to your FreeRTOS Win32 port trace recorder configuration include.")
    set(FREERTOS_PORT_INCLUDE "D:/FreeRTOS/FreeRTOS/Source/portable/MSVC-MingW" CACHE FILEPATH "Path to your FreeRTOS port.")
    target_include_directories(KoJen_FreeRTOS_Win32
                            PUBLIC
                            ${FREERTOS_SOURCE_INCLUDE}
                            ${FREERTOS_DEMO_INCLUDE}
                            ${FREERTOS_PLUS_TRACE_INCLUDE}
                            ${FREERTOS_PLUS_TRACE_REC_CONFIG_INCLUDE}
                            ${FREERTOS_PORT_INCLUDE}
                            )
else()
    message(CHECK_FAIL "disabled")
endif()
unset(GENERATE_FREERTOS CACHE) 
