Ricerca…


Osservazioni

CMake è uno strumento per la definizione e la gestione di build di codice, principalmente per C ++.

CMake è uno strumento multipiattaforma; l'idea è di avere una singola definizione di come è costruito il progetto - che si traduce in definizioni di build specifiche per qualsiasi piattaforma supportata.

Lo fa abbinando a diversi sistemi di costruzione specifici della piattaforma; CMake è un passaggio intermedio che genera input di build per diverse piattaforme specifiche. Su Linux, CMake genera Makefile; su Windows, può generare progetti di Visual Studio e così via.

Il comportamento di generazione è definito nei file CMakeLists.txt , uno in ogni directory del codice sorgente. Il file CMakeLists ogni directory definisce cosa deve fare il buildsystem in quella specifica directory. Definisce anche quali sottodirectory CMake dovrebbe gestire anche.

Le azioni tipiche includono:

  • Costruisci una libreria o un eseguibile da alcuni dei file sorgente in questa directory.
  • Aggiungi un percorso file al percorso di inclusione utilizzato durante la compilazione.
  • Definire le variabili che il buildsystem utilizzerà in questa directory e nelle sue sottodirectory.
  • Genera un file, in base alla configurazione di build specifica.
  • Individua una libreria che si trova da qualche parte nell'albero dei sorgenti.

I file finali di CMakeLists possono essere molto chiari e chiari, poiché ciascuno ha una portata così limitata. Ognuno gestisce solo la parte della build presente nella directory corrente.

Per le risorse ufficiali su CMake, consultare la documentazione e il tutorial di CMake.

Versioni

Versione Data di rilascio
3.9 2017/07/18
3.8 2017/04/10
3.7 2016/11/11
3.6 2016/07/07
3.5 2016/03/08
3.4 2015/11/12
3.3 2015/07/23
3.2 2015/03/10
3.1 2014/12/17
3.0 2014/06/10
2.8.12.1 2013/11/08
2.8.12 2013/10/11
2.8.11 2013/05/16
2.8.10.2 2012/11/27
2.8.10.1 2012/11/07
2.8.10 2012-10-31
2.8.9 2012-08-09
2.8.8 2012-04-18
2.8.7 2011-12-30
2.8.6 2011-12-30
2.8.5 2011-07-08
2.8.4 2011-02-16
2.8.3 2010-11-03
2.8.2 2010-06-28
2.8.1 2010-03-17
2.8 2009-11-13
2.6 2008-05-05

Installazione di CMake

Vai alla pagina di download di CMake e ottieni un file binario per il tuo sistema operativo, ad esempio Windows, Linux o Mac OS X. In Windows fai doppio clic sul file binario da installare. Su Linux esegui il binario da un terminale.

Su Linux, puoi anche installare i pacchetti dal gestore di pacchetti della distribuzione. Su Ubuntu 16.04 puoi installare la riga di comando e l'applicazione grafica con:

sudo apt-get install cmake
sudo apt-get install cmake-gui

Su FreeBSD puoi installare la riga di comando e l'applicazione grafica basata su Qt con:

pkg install cmake
pkg install cmake-gui

Su Mac OSX, se si utilizza uno dei gestori di pacchetti disponibili per installare il software, il più notevole dei quali è MacPorts ( MacPorts ) e Homebrew ( Homebrew ), è possibile anche installare CMake tramite uno di essi. Ad esempio, in caso di MacPorts, digitare quanto segue

sudo port install cmake  

installerà CMake, mentre nel caso utilizzi il gestore di pacchetti Homebrew dovrai digitare

brew install cmake

Dopo aver installato CMake, puoi verificare facilmente procedendo come segue

cmake --version

Dovresti vedere qualcosa di simile al seguente

cmake version 3.5.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

Passaggio tra tipi di build, ad es. Debug e release

CMake conosce diversi tipi di build, che di solito influenzano i parametri predefiniti del compilatore e del linker (come le informazioni di debug in fase di creazione) o percorsi di codice alternativi.

Per impostazione predefinita, CMake è in grado di gestire i seguenti tipi di build:

  • Debug : solitamente una classica build di debug che include informazioni di debug, nessuna ottimizzazione, ecc.
  • Versione : la tipica versione di rilascio senza informazioni di debug e ottimizzazione completa.
  • RelWithDebInfo:: uguale a Release , ma con informazioni di debug.
  • MinSizeRel : una versione di rilascio speciale ottimizzata per le dimensioni.

Le modalità di gestione delle configurazioni dipendono dal generatore che viene utilizzato.

Alcuni generatori (come Visual Studio) supportano più configurazioni. CMake genererà tutte le configurazioni contemporaneamente e potrai selezionare dall'IDE o usare --config CONFIG (con cmake --build ) quale configurazione vuoi costruire. Per questi generatori, CMake farà del suo meglio per generare una struttura di directory di build in modo che i file di configurazioni diverse non si sovrappongano.

I generatori che supportano solo una singola configurazione (come Unix Makefile) funzionano diversamente. Qui la configurazione attualmente attiva è determinata dal valore della variabile CMake CMAKE_BUILD_TYPE .

Ad esempio, per scegliere un tipo di build diverso, è possibile eseguire i seguenti comandi da riga di comando:

cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source

Uno script CMake dovrebbe evitare di impostare lo stesso CMAKE_BUILD_TYPE , poiché generalmente è considerata responsabilità dell'utente farlo.

Per i generatori a configurazione singola, il passaggio alla configurazione richiede la riesecuzione di CMake. È probabile che una build successiva sovrascriva i file oggetto prodotti dalla configurazione precedente.

Semplice progetto "Hello World"

Dato un file di origine C ++ main.cpp definisce una funzione main() , un file CMakeLists.txt accompagnamento (con il seguente contenuto) istruirà CMake a generare le istruzioni di compilazione appropriate per il sistema corrente e il compilatore C ++ predefinito.

main.cpp ( C ++ Hello World Example )

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

add_executable(app main.cpp)

Guardalo dal vivo su Coliru

  1. cmake_minimum_required(VERSION 2.4) imposta una versione CMake minima necessaria per valutare lo script corrente.

  2. project(hello_world) avvia un nuovo progetto CMake. Ciò attiverà molta logica interna di CMake, in particolare il rilevamento del compilatore C e C ++ predefinito.

  3. Con add_executable(app main.cpp) viene creata app destinazione build che invoca il compilatore configurato con alcuni flag predefiniti per l'impostazione corrente per compilare app eseguibile dal file di origine specificato main.cpp .

Riga di comando (In-Source-Build, not recommended)

> cmake .
...
> cmake --build .

cmake . esegue il rilevamento del compilatore, valuta il CMakeLists.txt nel dato . directory e genera l'ambiente di compilazione nella directory di lavoro corrente.

Il cmake --build . comando è un'astrazione per la chiamata build / make necessaria.

Riga di comando (Out-of-Source, raccomandato)

Per mantenere il tuo codice sorgente pulito da eventuali artefatti di costruzione, dovresti creare build "fuori dall'origine".

> mkdir build
> cd build
> cmake ..
> cmake --build .

Oppure CMake può anche astrarre i comandi di base della tua piattaforma shell dall'esempio sopra riportato:

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 

"Hello World" con più file sorgente

Per prima cosa possiamo specificare le directory dei file di intestazione da include_directories() , quindi dobbiamo specificare i corrispondenti file di origine dell'eseguibile di destinazione da add_executable() , e accertarci che esista esattamente una funzione main() nei file di origine.

Di seguito è riportato un semplice esempio, tutti i file vengono presupposti inseriti nella directory PROJECT_SOURCE_DIR .

main.cpp

#include "foo.h"

int main()
{
    foo();
    return 0;
}

foo.h

void foo();

foo.cpp

#include <iostream>
#include "foo.h"

void foo()
{
    std::cout << "Hello World!\n";
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp)  # be sure there's exactly one main() function in the source files

Possiamo seguire la stessa procedura nell'esempio precedente per costruire il nostro progetto. Quindi l' app esecuzione verrà stampata

>./app
Hello World!

"Hello World" come libreria

Questo esempio mostra come distribuire il programma "Hello World" come libreria e come collegarlo ad altri target.

Supponiamo di avere lo stesso set di file sorgente / header come nell'esempio http://www.Scriptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-files . Invece di costruire da più file sorgente, possiamo prima distribuire foo.cpp come libreria usando add_library() e successivamente collegandolo con il programma principale con target_link_libraries() .

Modifichiamo CMakeLists.txt in

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)

e seguendo gli stessi passi, otterremo lo stesso risultato.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow