####################### OPTIONS #########################
option(CROSS_COMPILE "Enables crosscompiling for raspberry pi" OFF)
option(BUILD_SHARED_LIB "Build a shared lib instead of a static." OFF)
option(ENABLE_TESTING "Enables testing." ON)
option(BUILD_NETWORKING "Build socket communication executable." ON)
option(BUILD_CLI "Makes a basic testing cli" OFF)

#################### CONFIGURATION ######################
set(OUTPUT_PATH bin)
set(LIB_DIR lib)
set(DEFAULT_BUILD_TYPE DEBUG)

set(CMAKE_CXX_STANDARD 14)

SET(CMAKE_CXX_FLAGS -pthread)

IF(NOT_PI)
    add_definitions(-DNOT_PI)
    message("Compiling not for Pi")
ENDIF()

project(FlippR-Driver)

###################### START_CMAKE #######################
cmake_minimum_required(VERSION 3.0.1)
project(FlippR-Driver VERSION 0.1.0)# LANGUAGES CXX)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

#set easylogging flags
add_definitions(-DELPP_NO_DEFAULT_LOG_FILE)

# Compile library to output_path
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/${OUTPUT_PATH})


# Default to Release build
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE})
endif(NOT CMAKE_BUILD_TYPE)


#set code-coverage flags if Debug mode
IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
    message("Setting gcov flags")   
    SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
    SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

    SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
    SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG)

#################### Adding Library #####################
file(GLOB_RECURSE SOURCES src/*.cpp)

if(BUILD_SHARED_LIB)
  add_library(${PROJECT_NAME} SHARED ${SOURCES})
else()
  add_library(${PROJECT_NAME} STATIC ${SOURCES} cli/OutputInterpreter.cpp cli/OutputInterpreter.h src/output/items/detail/DriverBoardItem.cpp src/output/items/detail/DriverBoardItem.h include/DriverFactory.h src/utility/Colors.h src/output/factories/SoundFactory.cpp src/output/factories/SoundFactory.h src/output/factories/ItemFactory.cpp src/output/factories/ItemFactory.h src/output/factories/FlipperFactory.cpp src/output/factories/FlipperFactory.h src/output/factories/LampFactory.cpp src/output/factories/LampFactory.h src/output/factories/DisplayFactory.cpp src/output/factories/DisplayFactory.h src/output/factories/SolenoidFactory.cpp src/output/factories/SolenoidFactory.h src/utility/helper_functions.hpp)
endif(BUILD_SHARED_LIB)

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/src)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/include)

# Set libraries include path
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/${LIB_DIR})

######################### BOOST #########################
# Boost configuration
set(BOOST_COMPONENTS program_options thread timer chrono filesystem)
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
if(Boost_FOUND)
  # Include and link with boost
  target_include_directories(${PROJECT_NAME} PUBLIC ${Boost_INCLUDE_DIRS})
  LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
  target_link_libraries(${PROJECT_NAME} PUBLIC ${Boost_LIBRARIES})
  message ("Boost found and linked at ${Boost_INCLUDE_DIRS}")
else()
    message (FATAL_ERROR "Can't find Boost.")
endif(Boost_FOUND)

##################### WIRING_PI ##########################
find_library(wiringPi_LIB wiringPi)

if(NOT wiringPi_LIB)
  message(WARNING "Could not find wiringPi library, used testing wiring pi lib instead.")
    add_definitions(-DNO_WIRING_PI)
else()
    message(STATUS "Found wiring pi.")
    target_include_directories(${PROJECT_NAME} PUBLIC ${wiringPi_INCLUDE_DIRS})
    target_link_libraries(${PROJECT_NAME} PUBLIC ${wiringPi_LIB})
endif()

find_library(crypt_LIB crypt)
if(NOT crypt_LIB)
    message(FATAL_ERROR "Could not find crypt library")
endif()
target_link_libraries(${PROJECT_NAME} PUBLIC ${crypt_LIB})

##################### EASYLOGGING #########################
set(EASYLOGGING_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${LIB_DIR}/easylogging)
add_library(Easylogging STATIC ${EASYLOGGING_INCLUDE_DIR}/easylogging++.cc)

target_include_directories(${PROJECT_NAME} PUBLIC ${EASYLOGGING_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC Easylogging)

######################## CATCH ############################
set(CATCH_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/tests)

add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})

####################### THREAD ############################
find_package(Threads REQUIRED)

if(NOT CMAKE_THREAD_LIBS_INIT)
    message(FATAL_ERROR, "Could not find libthread")
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE ${Threads_LIBRARIES})


if(ENABLE_TESTING)
  #add_subdirectory(tests)
    message(WARNING "Tests not built!")
endif(ENABLE_TESTING)

if(BUILD_NETWORKING)
    add_subdirectory(networking)
endif(BUILD_NETWORKING)

if(BUILD_CLI)
    add_subdirectory(cli)
endif(BUILD_CLI)
####################### END_CMAKE ########################
