﻿
# Nous voulons un cmake "récent" pour utiliser les dernières fonctionnalités.
cmake_minimum_required(VERSION 3.20)

# Nom du projet.
set(ORDO OrdonnancementCorrectif)

set(INSGEN InstanceGenerator)

set(TESTS Tests)

project(${ORDO})

# Génération de la liste des fichiers sources.

file(GLOB_RECURSE
    SRCS_Ordo
    src/OrdoCorr/main.cpp
)

file(GLOB_RECURSE
    SRCS_Insgen
    src/InstanceGenerator/main.cpp
)

file(GLOB_RECURSE
    SRCS_Gen
    src/InstanceGenerator/Generator/*
)

file(GLOB_RECURSE
    SRCS_Interface
    src/OrdoCorr/Interface/*
)

file(GLOB_RECURSE
    SRCS_Solver
    src/OrdoCorr/Solver/*
)

file(GLOB_RECURSE
    SRCS_Config
    src/General/Configuration/*
)

file(GLOB_RECURSE
    SRCS_Model
    src/General/Model/*
)

file(GLOB_RECURSE
    SRCS_Logs
    src/General/Logs/*
)

file(GLOB_RECURSE
    SRCS_Tester
    src/OrdoCorr/Tester/*
)

# ---------------------------------------



# ------- Inclusion de JSONfMC++ --------
# JSONfMC++ Lib pour gestion fichier JSON, en mode header only.
if(WIN32)
    set(JSONlib_DIR ./lib/CMake/Windows)
else()
    set(JSONlib_DIR ./lib/CMake/Linux)
endif()

find_package(JSONlib REQUIRED)

if(JSONlib_FOUND)
    message("lib JSONFMC++ Trouvé")
else()
    message("lib JSONFMC++ Introuvable")
endif()
# ---------------------------------------



# ------- Inclusion de Boost Graph Library --------
# Boost Graph Library pour gestion des graphes en mode header only.
if(WIN32)
    set(BOOSTGRAPHlib_DIR ./lib/CMake/Windows)
else()
    set(BOOSTGRAPHlib_DIR ./lib/CMake/Linux)
endif()

find_package(BOOSTGRAPHlib REQUIRED)

if(BOOSTGRAPHlib_FOUND)
    message("lib Boost Graph Trouvé")
else()
    message("lib Boost Graph Introuvable")
endif()
# ---------------------------------------

# ------- Inclusion de httplib --------
# httplib Lib pour gestion des requetes web en mode header only.
if(WIN32)
    set(HTTPlib_DIR ./lib/CMake/Windows)
else()
    set(HTTPlib_DIR ./lib/CMake/Linux)
endif()

find_package(HTTPlib REQUIRED)

if(HTTPlib_FOUND)
    message("lib HTTP Trouvé")
else()
    message("lib HTTP Introuvable")
endif()
# ---------------------------------------
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/CMake/Linux/")
find_package(GUROBI REQUIRED)


set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS "Debug")

# Chemin executable
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin/${CMAKE_BUILD_TYPE}")

# On indique que l'on veut un exécutable nommé PROJECT compilé à partir des fichiers décrits par les variables SRCS et HEADERS.
add_executable(${ORDO} ${SRCS_Ordo})
add_executable(${INSGEN} ${SRCS_Insgen})


add_library(Interface STATIC ${SRCS_Interface})
add_library(Data STATIC ${SRCS_Model})
add_library(Solver STATIC ${SRCS_Solver})
add_library(Configuration STATIC ${SRCS_Config})
add_library(Logs STATIC ${SRCS_Logs})
add_library(Generator STATIC ${SRCS_Gen})
add_library(Tester STATIC ${SRCS_Tester})


add_dependencies(${ORDO} Interface Configuration Logs Data Solver Tester)
add_dependencies(Interface Configuration Logs Data Solver Tester)
add_dependencies(Solver Logs Configuration Data)
add_dependencies(Data Logs Configuration)
add_dependencies(Tester Solver Data Logs Configuration)

add_dependencies(${INSGEN} Data Logs Generator)



set_property(TARGET ${ORDO} PROPERTY CXX_STANDARD 17)
set_property(TARGET Interface PROPERTY CXX_STANDARD 17)
set_property(TARGET Data PROPERTY CXX_STANDARD 17)
set_property(TARGET Solver PROPERTY CXX_STANDARD 17)
set_property(TARGET Configuration PROPERTY CXX_STANDARD 17)
set_property(TARGET Logs PROPERTY CXX_STANDARD 17)
set_property(TARGET Tester PROPERTY CXX_STANDARD 17)

set_property(TARGET ${INSGEN} PROPERTY CXX_STANDARD 17)
set_property(TARGET Generator PROPERTY CXX_STANDARD 17)



# Fichier include
# CPLEX
# JSONFMCPP
include_directories(${JSONFMCPP_INCLUDE_DIRS})
include_directories(${HTTPLIB_INCLUDE_DIRS})
include_directories(${BOOSTGRAPH_INCLUDE_DIRS})
#cppunit

include_directories(${GUROBI_INCLUDE_DIRS})


# Fichier lib


target_link_libraries(${ORDO} 
	debug Interface 
	optimized Interface
)

target_link_libraries(${INSGEN} 
	debug Generator 
	optimized Generator
)

target_link_libraries(Interface 
    debug Solver 
	optimized Solver 
    debug Tester
    optimized Tester
)

target_link_libraries(Generator 
    debug Data 
	optimized Data 
)

target_link_libraries(Solver 
    debug ${CMAKE_DL_LIBS}
    optimized ${CMAKE_DL_LIBS}
    optimized ${GUROBI_CXX_LIBRARY}
    debug ${GUROBI_CXX_DEBUG_LIBRARY}
    optimized ${GUROBI_LIBRARY}
    debug ${GUROBI_LIBRARY}   
    debug Data 
	optimized Data 
)

target_link_libraries(Tester
    debug Solver
    optimized Solver
)

target_link_libraries(Data
	debug Configuration 
	optimized Configuration
    debug Logs 
	optimized Logs
)

# Fichier dll sous windows
if(WIN32)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
endif()

# Paramètre de compilation
if (UNIX)
    set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
    set(CMAKE_CXX_FLAGS "-Wall -Wno-deprecated -Wno-write-strings -Wno-maybe-uninitialized -pthread")
endif ()

foreach(source IN LISTS SRCS_Ordo)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Interface)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Solver)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Config)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Model)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Logs)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Insgen)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Gen)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

foreach(source IN LISTS SRCS_Tester)
    get_filename_component(source_path "${source}" PATH)
    STRING(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" source_path ${source_path})
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()


message(STATUS "Tree reorganized")

