Files
CosmicEngine/CMakeLists.txt
2026-02-13 19:15:05 +01:00

418 lines
13 KiB
CMake

# Nous voulons un cmake "récent" pour utiliser les dernières fonctionnalités.
cmake_minimum_required(VERSION 3.20)
set (CMAKE_CXX_STANDARD 23)
# Nom du projet.
set(PROJECT CosmicEngine)
project(${PROJECT})
# Génération de la liste des fichiers sources.
file(GLOB_RECURSE
SRCS_ENGINE
src/Engine/*
)
file(GLOB_RECURSE
SRCS
src/main.cpp)
file(GLOB_RECURSE
SRCS_TESTS
test/*
)
# ---------- Inclusion des packages sous windows -----------
if(WIN32)
endif()
# ---------- Inclusion des packages sous mac -----------
if(APPLE)
endif()
# ---------- Inclusion des packages sous linux -----------
if(UNIX)
# --------- Inclusion d'OpenGL ----------
# OpenGL Lib pour charger OpenGL, fournit avec les drivers, donc se trouve toute seul.
# find_package(OpenGL REQUIRED)
# if(OPENGL_FOUND)
# message("lib OpenGL Trouvé")
# else()
# message("lib OpenGL Introuvable")
# endif()
# ---------------------------------------
# --------- Inclusion de Vulkan ----------
# Vulkan Lib pour charger Vulkan, fournit avec les drivers, donc se trouve toute seul.
# find_package(Vulkan REQUIRED)
# if(VULKAN_FOUND)
# message("lib OpenGL Trouvé")
# else()
# message("lib OpenGL Introuvable")
# endif()
# ---------------------------------------
# ---------- Inclusion de GLM -----------
# GLM Lib pour mathématique, en mode header only.
set(GLMlib_DIR ./lib/CMake/Linux)
find_package(GLMlib REQUIRED)
if(GLMlib_FOUND)
message("lib GLM Trouvé")
else()
message("lib GLM Introuvable")
endif()
# ---------------------------------------
# ------- Inclusion de JSONfMC++ --------
# JSONfMC++ Lib pour gestion fichier JSON, en mode header only.
set(JSONlib_DIR ./lib/CMake/Linux)
find_package(JSONlib REQUIRED)
if(JSONlib_FOUND)
message("lib JSONFMC++ Trouvé")
else()
message("lib JSONFMC++ Introuvable")
endif()
# ---------------------------------------
# ------- Inclusion de EnTT --------
# EnTT Lib pour gestion fichier JSON, en mode header only.
set(EnTTlib_DIR ./lib/CMake/Linux)
find_package(EnTTlib REQUIRED)
if(EnTTlib_FOUND)
message("lib EnTTlib Trouvé")
else()
message("lib EnTTlib Introuvable")
endif()
# --------- Inclusion de Boost ----------
# Boost Lib pour diverse simplification
# set(Boost_USE_STATIC_LIBS OFF)
# set(Boost_USE_MULTITHREADED ON)
# set(Boost_USE_STATIC_RUNTIME OFF)
# find_package(Boost REQUIRED COMPONENTS log_setup log filesystem chrono thread date_time regex) # header only libraries must not be added here
# message(STATUS "Boost version: ${Boost_VERSION}")
# if(NOT TARGET Boost::filesystem)
# add_library(Boost::filesystem IMPORTED INTERFACE)
# set_property(TARGET Boost::filesystem PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::filesystem PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::thread)
# add_library(Boost::thread IMPORTED INTERFACE)
# set_property(TARGET Boost::thread PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::thread PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::chrono)
# add_library(Boost::chrono IMPORTED INTERFACE)
# set_property(TARGET Boost::chrono PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::chrono PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::date_time)
# add_library(Boost::date_time IMPORTED INTERFACE)
# set_property(TARGET Boost::date_time PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::date_time PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::regex)
# add_library(Boost::regex IMPORTED INTERFACE)
# set_property(TARGET Boost::regex PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::regex PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::log)
# add_library(Boost::log IMPORTED INTERFACE)
# set_property(TARGET Boost::log PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::log PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(NOT TARGET Boost::log_setup)
# add_library(Boost::log_setup IMPORTED INTERFACE)
# set_property(TARGET Boost::log_setup PROPERTY
# INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR})
# set_property(TARGET Boost::log_setup PROPERTY
# INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
# endif()
# if(Boost_FOUND)
# message("lib Boost Trouvé")
# else()
# message("lib Boost Introuvable")
# endif()
# ---------------------------------------
# -------- Inclusion de la SDL2 ----------
# SDL2 Lib pour fenetre et contrôle
# Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# find_package(SDL2 REQUIRED)
# if(SDL2_FOUND)
# message("lib SDL2 Trouvé")
# else()
# message("lib SDL2 Introuvable")
# endif()
# ---------------------------------------
# ------- Inclusion de SDL2_IMAGE --------
# SDL2_IMAGE Lib pour charger une image
# Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# find_package(SDL2_image QUIET)
# #find_library(SDL2_image libSDL2_image)
# if(SDL2_image_FOUND)
# message("lib SDL2_IMAGE Trouvé")
# else()
# message("lib SDL2_IMAGE Introuvable")
# endif()
# ---------------------------------------
# ------- Inclusion de SDL2_TTF --------
# SDL2_IMAGE Lib pour charger une police d'écriture.
# set(SDL2_ttf_DIR ./lib/CMake/Linux)
# # Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# find_package(SDL2_ttf QUIET)
# #find_library(SDL2_ttf libSDL2_ttf)
# if(SDL2_ttf_FOUND)
# message("lib SDL2_TTF Trouvé")
# else()
# message("lib SDL2_TTF Introuvable")
# endif()
# ---------------------------------------
# --------- Inclusion de GLEW -----------
# GLEW Lib pour charger utiliser OpenGL + extension
# Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# find_package(GLEW REQUIRED)
# if(GLEW_FOUND)
# message("lib GLEW Trouvé")
# else()
# message("lib GLEW Introuvable")
# endif()
# ---------------------------------------
# ---------- Inclusion de ASSIMP -----------
# Assimp Lib import modèles 3D.
# find_package(assimp REQUIRED)
# if(assimp_FOUND)
# message("lib ASSIMP Trouvé")
# else()
# message("lib ASSIMP Introuvable")
# endif()
# ---------------------------------------
# ---------- Inclusion de ODE -----------
# ODE Lib Moteur physique.
# set(ODE_DIR ./lib/CMake/Linux)
# # Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# find_package(ODE REQUIRED)
# if(ODE_FOUND)
# message("lib ODE Trouvé")
# else()
# message("lib ODE Introuvable")
# endif()
# ---------------------------------------
# --------- Inclusion de SNDFILE ----------
# SNDFILE Lib pour inclure le son.
# Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
#set(SNDFILE_DIR ./lib/CMake/Linux)
# find_package(sndfile QUIET)#TODO corrige
# #find_library(sndfile libsndfile)
# if(sndfile_FOUND)
# message("lib SNDFILE Trouvé")
# else()
# message("lib SNDFILE Introuvable")
# endif()
# ---------------------------------------
# ---------- Inclusion de OpenAL-----------
# OpenAL Lib gérer le son.
# Les autre plateforme (Linux...) ont un installateur de paquet, la lib se trouve toute seul.
# set(OPENAL_DIR ./lib/CMake/Linux)
# find_package(OPENAL REQUIRED)
# if(OPENAL_FOUND)
# message("lib OpenAL Trouvé")
# else()
# message("lib OpenAL Introuvable")
# endif()
# ---------------------------------------
# ---------- Inclusion de Catch2-----------
# Gestion des tests unitaires
find_package(Catch2 3 REQUIRED)
# These tests can use the Catch2-provided main
if(Catch2_found)
message("lib Catch2 Trouvé")
else()
message("lib Catch2 Introuvable")
endif()
endif()
# 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_library(Engine SHARED ${SRCS_ENGINE} ${SRCS_EXTERNAL_GLAD})
add_executable(${PROJECT} ${SRCS})
add_dependencies(${PROJECT} Engine)
add_executable(CosmicTest ${SRCS_TESTS})
target_link_libraries(CosmicTest PRIVATE Catch2::Catch2WithMain Engine)
# Fichier include
# OpenGL
#include_directories(${OPENGL_INCLUDE_DIR})
# SDL2
#include_directories(${SDL2_INCLUDE_DIRS})
# GLEW
#include_directories(${GLEW_INCLUDE_DIRS})
# SDL2_image
#include_directories(${SDL2_IMAGE_INCLUDE_DIRS})
# SDL2_ttf
#include_directories(${SDL2_TTF_INCLUDE_DIRS})
# GLM
include_directories(${GLM_INCLUDE_DIRS})
# JSONFMCPP
include_directories(${JSONFMCPP_INCLUDE_DIRS})
#ENTT
include_directories(${ENTT_INCLUDE_DIRS})
# ASSIMP
#include_directories(${ASSIMP_INCLUDE_DIRS})
# ODE
#include_directories(${ODE_INCLUDE_DIRS})
# SNDFILE
#include_directories(${SNDFILE_INCLUDE_DIRS})
# OPENAL
#include_directories(${OPENAL_INCLUDE_DIRS})
# Fichier lib
# OpenGL
#target_link_libraries(Engine OpenMP::OpenMP_CXX)
# OpenMP
#target_link_libraries(Engine ${OPENGL_LIBRARIES})
# SDL2
#target_link_libraries(Engine ${SDL2_LIBRARIES})
# GLEW
#target_link_libraries(Engine ${GLEW_LIBRARIES})
# SDL2_image
#target_link_libraries(Engine SDL2_image)
# SDL2_ttf
#target_link_libraries(Engine SDL2_ttf)
# Boost
# ASSIMP
#target_link_libraries(Engine ${ASSIMP_LIBRARIES})
# ODE
#target_link_libraries(Engine ${ODE_LIBRARIES})
# SNDFILE
#target_link_libraries(Engine sndfile)
# OPENAL
#target_link_libraries(Engine ${OPENAL_LIBRARIES})
#target_link_libraries(Engine ${CMAKE_DL_LIBS})
#target_link_libraries(${PROJECT} ${CMAKE_DL_LIBS})
# Boost
# target_link_libraries(Engine Boost::boost)
# target_link_libraries(Engine Boost::filesystem)
# target_link_libraries(Engine Boost::chrono)
# target_link_libraries(Engine Boost::thread)
# target_link_libraries(Engine Boost::date_time)
# target_link_libraries(Engine Boost::regex)
# target_link_libraries(Engine Boost::log)
# target_link_libraries(Engine Boost::log_setup)
target_link_libraries(${PROJECT} Engine)
if(UNIX)
add_custom_command(
TARGET Engine POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/libEngine.so
${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif()
# Paramètre de compilation
if (UNIX)
set(CMAKE_CXX_FLAGS "-Wall -ldl -fPIC")
endif ()
# Valgrind ne marche que pour Linux...
if (UNIX)
add_custom_target("valgrind"
COMMAND ${CMAKE_CTEST_COMMAND}
--force-new-ctest-process --test-action memcheck
COMMAND cat "${CMAKE_BINARY_DIR}/Testing/Temporary/MemoryChecker.*.log")
endif()
# Doxygen
# check if Doxygen is installed
find_package(Doxygen)
if (DOXYGEN_FOUND)
# set input and output files
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in)
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile)
# request to configure the file
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
message("Doxygen build started")
# note the option ALL which allows to build the docs together with the application
add_custom_target("doxygen"
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating API documentation with Doxygen"
VERBATIM)
else()
message("Doxygen need to be installed to generate the doxygen documentation")
endif()
foreach(source IN LISTS SRCS_ENGINE)
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)
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")