Last active
October 17, 2019 09:07
-
-
Save mcarletti/3be65ac46b9846820006e85b855ecc17 to your computer and use it in GitHub Desktop.
Simple cmake file (comments in ITA)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ======================================================== | |
# 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