Come funziona esattamente CMake?


158

Non lo sto chiedendo solo per me stesso. Spero che questa domanda sia un riferimento per i molti neofiti che come me, lo hanno trovato assolutamente perplesso su cosa stesse succedendo esattamente dietro le quinte quando per un CMakeLists.txtfile così piccolo

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

e così piccolo tutorial.cpp

int main() { return 0; } 

ci sono così tanti file generati

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

e una CMakeFilescartella con così tanti file e cartelle

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Non capire cosa stesse succedendo dietro le quinte (es: perché così si dovevano generare file e quale fosse il loro scopo), era il più grande ostacolo nel poter imparare CMake.

Se qualcuno lo sa, potresti spiegarlo per il bene dei posteri? Qual è lo scopo di questi file, e quando cmake .scrivo, cosa sta esattamente configurando e generando cmake prima che costruisca il progetto?


1
Sono a conoscenza di build out-of-source. Nel caso in cui qualcuno non abbia fatto una build fuori dal sorgente e stia ancora cercando un modo per pulire i file generati, questa tecnica funziona bene: stackoverflow.com/a/12055610/453673
Nav

3
C'è una meravigliosa descrizione su: aosabook.org/en/cmake.html e probabilmente una risposta approfondita alla domanda (che non può essere riassunta in breve qui).
Parassita

@SebTu Link interrotto. La pagina cmake.html non esiste.
Nav

3
@Nav Yap, incasinato la sintassi del markup, scusa. Quindi, qui la versione corretta: per le persone nuove a cmake consiglio vivamente di leggere l' architettura di cmake . Fornisce le informazioni sufficienti per avere un'idea di come funziona cmake senza perdersi nei dettagli.
SebNag

Risposte:


92

Il segreto è che non devi capire cosa fanno i file generati.

CMake introduce molta complessità nel sistema di compilazione, la maggior parte dei quali paga solo se lo si utilizza per la creazione di progetti software complessi.

La buona notizia è che CMake fa un buon lavoro nel tenere lontano questo disordine: usa build out-of-source e non devi nemmeno guardare i file generati. Se non l'hai fatto finora (cosa che credo sia il caso, dal momento che hai scritto cmake .), ti preghiamo di controllarli prima di procedere . Mescolare la directory build e source è davvero doloroso con CMake e non è come dovrebbe essere usato il sistema.

In poche parole: invece di

cd <source_dir>
cmake .

usa sempre

cd <build_dir_different_from_source_dir>
cmake <source_dir>

anziché. Di solito uso una sottocartella vuota buildnella mia directory dei sorgenti come directory di build.

Per alleviare il tuo dolore, lascia che ti dia una rapida panoramica dei file rilevanti che CMake genera:

  • File di progetto / Makefile - A cosa sei realmente interessato: i file necessari per costruire il tuo progetto sotto il generatore selezionato. Questo può essere qualsiasi cosa, da un Makefile Unix a una soluzione di Visual Studio.
  • CMakeCache.txt : si tratta di un archivio persistente di stringa chiave / valore che viene utilizzato per memorizzare nella cache il valore tra le esecuzioni. I valori memorizzati qui possono essere percorsi alle dipendenze della libreria o se un componente facoltativo deve essere creato affatto. L'elenco delle variabili è per lo più identico a quello che vedi durante l'esecuzione ccmakeo cmake-gui. Questo può essere utile di volta in volta, ma consiglierei di usare gli strumenti sopra menzionati per modificare qualsiasi valore, se possibile.
  • File generati : questo può essere qualsiasi cosa, dai file di origine generati automaticamente alle macro di esportazione che ti aiutano a reintegrare il tuo progetto costruito con altri progetti CMake. La maggior parte di questi sono generati solo su richiesta e non appariranno in un semplice progetto come quello della tua domanda.
  • Qualsiasi altra cosa è praticamente rumorosa per rendere felice il sistema di compilazione. In particolare, non ho mai avuto bisogno di preoccuparmi di tutto ciò che sta accadendo all'interno della CMakeFilessottodirectory.

In generale non dovresti fare confusione con nessuno dei file che CMake genera per te. Tutti i problemi possono essere risolti dall'interno CMakeLists.txtin un modo o nell'altro. Finché il risultato costruisce il tuo progetto come previsto, probabilmente stai bene. Non preoccuparti troppo dei dettagli cruenti, poiché questo è ciò che CMake stava cercando di risparmiarti in primo luogo.


Grazie. Era a conoscenza delle build out of source, ma come vedevi, l'obiettivo di porre questa domanda era capire di più. La parte CMakeCache.txt della tua risposta ha davvero aiutato. È questo tipo di spiegazione che stavo cercando. Inoltre, l'ultima frase della mia domanda: " che cosa esattamente sta configurando e generando cmake prima che costruisca il progetto "
Nav

1
CMakeFilesdirectory contiene CMakeError.loge CMakeOutput.logimportante per la risoluzione dei problemi di build CMake.
Serge Rogatch,

1
Due cose che a volte è necessario controllare nella CMakeFiles/target_name.dirdirectory sono i file flags.makee link.txt. Ho dovuto controllarli in un progetto complesso, che ha ereditato flag / oggetti collegati da progetti a monte. Ad esempio: ho avuto degli errori perché TPL A dipendeva da TPL B. Anche il mio progetto aveva una dipendenza da B, che ho installato localmente; ma A ha usato una versione di B dal mio sistema (piuttosto che la mia installazione locale) che aveva diverse opzioni abilitate, ed è arrivata prima, causando errori nel mio progetto. Solo guardando link.txt sono stato in grado di scoprire che stava succedendo.
bartgol,

13

Come indicato sul suo sito Web:

Cmake è un sistema di compilazione open source multipiattaforma per la gestione del processo di compilazione del software mediante un metodo indipendente dal compilatore

Nella maggior parte dei casi viene utilizzato per generare file project / make - nel tuo esempio ha prodotto i file Makefileutilizzati per creare il tuo software (principalmente su piattaforma Linux / Unix).

Cmake consente di fornire file di build multipiattaforma che genererebbero progetti specifici / realizzino file per particolari compilation / piattaforme.

Ad esempio, potresti provare a compilare il tuo software su Windows con Visual Studio, quindi CMakeLists.txtpuoi avviare la sintassi corretta nel tuo file

cmake .

all'interno della directory del progetto su piattaforma Windows, Cmake genererà tutti i file di progetto / soluzione necessari ( .slnecc.).

Se desideri costruire il tuo software su piattaforma Linux / Unix, vai semplicemente alla directory di origine in cui hai il tuo CMakeLists.txtfile e attivalo cmake .e genererà tutti i file necessari per costruire il software tramite makeo make all.

Ecco alcune ottime presentazioni sulle funzionalità chiave di Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

MODIFICARE

Se desideri rendere le librerie / definizioni variabili dipendenti dalla piattaforma ecc., Puoi utilizzare questa sintassi nel CMakeLists.txtfile

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Ci sono anche molti comandi con cui sei in grado di impedire il fallimento della compilazione e sul posto Cmake ti avviserà che per esempio non hai librerie di boost filesysteme regexinstallate sul tuo sistema. Per fare ciò è possibile utilizzare la sintassi seguente:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Dopo aver verificato che genererà i makefile per il sistema / IDE / compilatore appropriati.


1
Grazie Patryk. Risposta utile, ma il pdf a cui ti sei collegato, spiega principalmente la seconda fase dell'apprendimento di CMake, che è fondamentalmente l'implementazione di CMake. Sto chiedendo la spiegazione del primo stadio, in cui una persona deve capire cosa sta succedendo in CMake!
Nav

@Nav ho ampliato un po 'la mia risposta. Puoi ancora cercare sul Web per ulteriori informazioni.
Patryk,

Questo è abbastanza lontano dal rispondere alla domanda posta.
SenhorLucas,

1

Esattamente come funziona CMake è una domanda per gli sviluppatori, quindi non è possibile rispondere a questa domanda qui.

Tuttavia, possiamo dare un tocco di guida utile per quanto riguarda quando dovresti usare CMake e quando quindi devi preoccuparti di come funziona. Nemmeno io sono un fan delle risposte "oh funziona e basta", perché, soprattutto nel software, NIENTE "funziona" e NIENTE SEMPRE a un certo punto devi sempre entrare nei dettagli.

CMake è uno strumento di forza industriale. Automatizza diversi processi MOLTO complessi e tiene conto di molte variabili di cui potresti non essere a conoscenza, specialmente come sviluppatore abbastanza nuovo, probabilmente lavorando con una conoscenza limitata di tutti i sistemi operativi e strumenti di costruzione che CMake può gestire. Il motivo per cui vengono generati così tanti file e perché le cose sembrano così complesse è perché tutti quegli altri sistemi sono complessi e devono essere contabilizzati e automatizzati. Inoltre ci sono i problemi di "memorizzazione nella cache" e altre funzionalità che fanno risparmiare tempo dello strumento. Comprendere tutto in CMake significherebbe comprendere tutto in questi strumenti di build e sistemi operativi e tutte le possibili combinazioni di queste variabili, che come potete immaginare è impossibile.

È importante notare che se non sei responsabile della gestione di un grande sistema di build multipiattaforma e la tua base di codice è un po 'di KLOC, forse fino a 100KLOG, usare CMake sembra un po' come usare una rimozione di alberi forestali da 100.000 dollari macchina per rimuovere le erbacce dal tuo giardino di 2 piedi da 2 piedi. (A proposito, se non hai mai visto una macchina del genere, dovresti cercarne una su YouTube, sono fantastici)

Se il tuo sistema di compilazione è piccolo e semplice, è probabile che sia meglio scrivere a mano i tuoi makefile o copiarli da soli. Quando i tuoi makefile diventano ingombranti o devi creare una versione del tuo sistema su un'altra piattaforma, puoi passare a CMake. A quel punto, avrai molti problemi da risolvere e puoi porre domande più mirate al riguardo. Nel frattempo, dai un'occhiata ad alcuni dei grandi libri che sono stati scritti su CMake, o ancora meglio, scrivine uno tu stesso! 8)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.