Je suis nouveau avec cmake et j'essaie de créer un petit projet qui nécessite quelques librairies tierces. J'aimerais avoir les librairies sous forme de dépôts git pour être toujours à jour. Certaines librairies sont juste des fichiers .cpp et .hpp (glad, imgui) et d'autres sont des projets cmake (glfw, glm).
L'idée est d'avoir un projet tiers avec toutes les librairies comme une sorte de sous-projet et un projet sandbox qui utilise les librairies et les inclusions, etc. Et je voudrais utiliser un code cmake moderne qui n'installe pas quelque chose en dehors de la structure du framework.
Structure du dossier :
Framework
|--3rd_party
| |--glad
| | |--include
| | |--src
| |--glfw-master
| | |--...
| | |--CMakeLists.txt
| |--glm-master
| | |--..
| | |--CMakeLists.txt
| |--imgui-master
| | |--*.cpp
| | |--*.hpp
| | |--examples
| | | |--*.cpp
| | | |--*.hpp
| |--CMakeLists.txt
|--sandbox
| |--main.cpp
| |--CMakeLists.txt
|--CMakeLists.txt
J'ai donc créé cette structure de dossiers et aussi quelques CMakeLists :
CMakeLists.txt (Cadre)
cmake_minimum_required(VERSION 3.10)
project(Framework)
add_subdirectory("3rd_party")
add_subdirectory("sandbox")
CMakeLists.txt (3rd_party)
#GLFW
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(glfw-master)
# GLM
set(GLM_TEST_ENABLE OFF CACHE BOOL "" FORCE)
add_subdirectory(glm-master)
# Glad
add_library(
Glad STATIC
"glad/src/glad.c"
)
target_include_directories(Glad PUBLIC "glad/include")
# ImGui
add_compile_definitions(IMGUI_IMPL_OPENGL_LOADER_GLAD=1)
set(IMGUI_SOURCES
"imgui-master/imgui.cpp"
"imgui-master/imgui_demo.cpp"
"imgui-master/imgui_draw.cpp"
"imgui-master/imgui_widgets.cpp"
"imgui-master/examples/imgui_impl_glfw.cpp"
"imgui-master/examples/imgui_impl_opengl3.cpp"
)
set(IMGUI_HEADERS
"imgui-master/imconfig.h"
"imgui-master/imgui.h"
"imgui-master/imgui_internal.h"
"imgui-master/imstb_rectpack.h"
"imgui-master/imstb_textedit.h"
"imgui-master/imstb_truetype.h"
"imgui-master/examples/imgui_impl_glfw.h"
"imgui-master/examples/imgui_impl_opengl3.h"
)
add_library(
ImGui STATIC
${IMGUI_SOURCES}
${IMGUI_HEADERS}
)
target_include_directories(ImGui PUBLIC "imgui-master" "glfw-master/include" "glad/include")
CMakeLists.txt (bac à sable)
project(Sandbox)
find_package(OpenGL REQUIRED)
add_executable(sandbox main.cpp)
# OpenGL
target_include_directories(Sandbox PUBLIC ${OPENGL_INCLUDE_DIR})
target_include_directories(Sandbox PUBLIC external)
# Glfw
target_include_directories(Sandbox PUBLIC "../3rd_party/glfw-master/include")
# Link libs
target_link_libraries(Sandbox PUBLIC
${OPENGL_LIBRARIES}
"../3rd_party/glfw-master/src/Debug/glfw3"
Glad
ImGui
glm_static
)
Le code fonctionne mais pas comme je l'attends. Au début, je sais que c'est un peu laid et qu'il y a peut-être une meilleure façon de gérer le chemin pour les includes et les sources, mais le plus gros problème est la structure du projet. Par exemple, lorsque je le construit pour ms vs studio, j'ai trois solutions
./framework.sln
./sandbox/sandbox.sln
./3rd_party/glfw-master/glfw.sln
Et heureusement, glm et imgui font partie de sandbox.sln.
Ce que j'aimerais avoir c'est une solution avec deux sous-solutions sandbox et 3rd_party qui a aussi des sous-solutions ou des projets pour toutes les librairies.
Alors est-ce possible et si oui, comment puis-je créer une telle structure avec cmake ?