Skip to content

Instantly share code, notes, and snippets.

@mcarletti
Last active October 17, 2019 09:07
Show Gist options
  • Save mcarletti/3be65ac46b9846820006e85b855ecc17 to your computer and use it in GitHub Desktop.
Save mcarletti/3be65ac46b9846820006e85b855ecc17 to your computer and use it in GitHub Desktop.
Simple cmake file (comments in ITA)
# ========================================================
# Assumo che la struttura del progetto sia la seguente:
#
# .
# ├── include
# │  └── engine
# │  └── ...
# ├── sources
# │  └── ...
# ├── examples
# │  └── 01_create_window
# │  └── main.cpp
# └── CMakeLists.txt
#
# ========================================================
# in ogni cmake e' buona norma specificare la versione
# minima di cmake da utilizzare
cmake_minimum_required(VERSION 3.10.2 FATAL_ERROR)
# il nome del progetto viene solitamente utilizzato per
# definire il nome di soluzioni e strutture di progetti
# piu' complessi, come per esempio le soluzioni di
# visual studio (microsoft)
# un altro utilizzo puo' essere utilizzare il nome del
# progetto per definire prefissi/suffissi utili ad evitare
# conflitti tra librerie e target differenti (in questo
# caso sarebbe meglio definire il nome del progetto in
# minuscolo e senza spazi)
project("Game Engine")
# imposto alcune opzioni del compilatore; da cmake 3.1
# esiste la variabile CMAKE_CXX_STANDARD per definire la
# versione del compilatore da utilizzare
set (CMAKE_CXX_STANDARD 11)
# librerie installate opportunamente vengono trovate
# automaticamente da cmake, il quale cerca per ogni
# libreria un file .cmake dove sono specificati il target
# della libreria stessa (usato nel linking tra l'applicazione
# e le sue dipendenze) e altre utili variabili, come le
# cartelle di inclusione e le librerie
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 REQUIRED)
# definisco una variabile ENGINE che definira' il nome
# dell'applicativo o libreria finale (i.e. eseguibile)
# set(VARNAME value)
set(ENGINE engine)
# includo la cartella contenente gli header del mio progetto
include_directories("include")
# cerco iterativamente tutti i file sorgente e li salvo
# in una variabile "sources" che utilizzero' al momento
# della compilazione
file(GLOB_RECURSE sources "source/*.cpp")
# compilo la libreria come shared object
# add_library( nome [opzioni] sorgenti )
add_library(${ENGINE} SHARED ${sources})
# ogni target, e quindi anche le librerie, devono essere linkate
# alle librerie richieste
# target_link_libraries( nome [opzioni] librerie )
# l'opzione PUBLIC dice a cmake che future compilazioni dipendenti
# da questa libreria erediteranno tutte le stesse dipendenze;
# il prefisso "target_" specifica che il link e' riferito solo
# all'ultimo target aggiunto/compilato;
# dalla versione cmake 3.10 non e' piu' necessario
# includere manualmente cartelle e librerie tramite il
# comando "include_directories", ma e' sufficiente accedere
# alle specifiche delle librerie tramite il target opportuno
# esempio: https://cmake.org/cmake/help/v3.10/module/FindOpenGL.html
target_link_libraries(${ENGINE} PUBLIC OpenGL::GL OpenGL::GLU GLEW::GLEW glfw)
# come per la libreria, definisco il nome dell'applicazione finale
# in una variabile per un utilizzo piu' comodo (evito il copia-incolla)
set(APP demo)
# aggiungo un target di tipo eseguibile
add_executable(${APP} examples/01_create_window/main.cpp)
# linko all'ultimo target aggiunto le dipendenze necessarie
target_link_libraries(${APP} ${ENGINE})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment