2013-07-08 16 views
80

Non lo sto chiedendo solo per me stesso. Spero che questa domanda sarà un punto di riferimento per i tanti neofiti che come me, l'ho trovato assolutamente perplessi su cosa esattamente quello che stava succedendo dietro le quinte quando per una tale piccolo file CMakeLists.txtCome funziona esattamente CMake?

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

e tale una piccola tutorial.cpp

int main() { return 0; } 

ci sono così tanti file generati

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

e una cartella CMakeFiles con s O molti 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 che cosa stava succedendo dietro le quinte (cioè: perché così può file doveva essere prodotta e quale sia il loro scopo era), era il più grande ostacolo di essere in grado di imparare CMake.

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

+0

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

+3

C'è una descrizione meravigliosa a: http://www.aosabook.org/en/cmake.html e probabilmente una risposta approfondita alla domanda (che non può essere riassunta in breve qui). – parasrish

+0

@SebTu Collegamento interrotto. La pagina cmake.html non esiste. – Nav

risposta

53

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

CMake introduce un sacco di complessità nel sistema di compilazione, la maggior parte delle quali vale solo se la si utilizza per la creazione di progetti software complessi.

La buona notizia è che CMake fa un buon lavoro di tenere lontano questo disordine da te: usa out-of-source builds e non devi nemmeno guardare i file generati. Se non l'hai fatto fino ad ora (che credo sia il caso, dal momento che hai scritto cmake .), , per favore controlla prima di procedere. Mescolare la directory di compilazione e di origine è davvero complicato con CMake e non è come dovrebbe essere usato il sistema.

In poche parole: invece di

cd <source_dir> 
cmake . 

utilizzare sempre

cd <build_dir_different_from_source_dir> 
cmake <source_dir> 

invece. Di solito utilizzo una sottocartella vuota build nella directory di origine come directory di build.

Per alleviare il dolore, mi permetta di dare una rapida panoramica dei file in questione, che CMake genera:

  • file di progetto/Makefile - Che si sono effettivamente interessati a: i file necessari per costruire il vostro progetto sotto il generatore selezionato. Questo può essere qualsiasi cosa, da Unix Makefile a una soluzione di Visual Studio.
  • CMakeCache.txt - Si tratta di una memoria di chiavi/valori persistente che viene utilizzata per memorizzare il valore tra le esecuzioni. I valori memorizzati qui possono essere percorsi verso le dipendenze della libreria o se un componente opzionale deve essere costruito. L'elenco delle variabili è per lo più identico a quello visualizzato durante l'esecuzione di ccmake o cmake-gui. Questo può essere utile da consultare 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 consentono di reintegrare il progetto creato con altri progetti CMake. Molti di questi sono generati solo su richiesta e non appariranno in un progetto semplice come quello della tua domanda.
  • Tutto il resto è piuttosto rumore per mantenere il sistema di generazione felice. In particolare, non ho mai avuto bisogno di preoccuparmi di tutto ciò che accade nella sottodirectory .

In generale, non si deve interferire con nessuno dei file generati da CMake. Tutti i problemi possono essere risolti all'interno di CMakeLists.txt in un modo o nell'altro. Finché il risultato costruisce il tuo progetto come previsto, probabilmente stai bene. Non preoccuparti troppo dei dettagli cruenti, perché questo è ciò che CMake stava cercando di risparmiarti in primo luogo.

+0

Grazie. Era a conoscenza delle build di origine, ma come vedresti, 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 cmake sta configurando e generando prima di costruire il progetto *" – Nav

+0

La directory 'CMakeFiles' contiene' CMakeError.log' e 'CMakeOutput.log' importanti per la risoluzione dei problemi di build di CMake. –

8

Come dichiarato sul suo sito web:

cmake è cross-platform, sistema di build open-source per la gestione del processo di generazione di software utilizzando un metodo compilatore indipendente

Nella maggior parte dei casi è usato per generare project/make files - nel tuo esempio ha prodotto Makefile che sono usati per costruire il tuo software (principalmente sulla piattaforma Linux/Unix).

Cmake consente di fornire file di compilazione multipiattaforma che generano progetti/file specifici di piattaforma per un particolare compilatore/piattaforma.

Per esempio si può provare a compilare il software su Windows con Visual Studio poi con sintassi corretta nel file CMakeLists.txt è possibile lanciare

cmake . 

all'interno della directory del progetto su piattaforma Windows e CMake generare tutta la file di progetto/soluzione necessari (.sln ecc.).

Se si desidera costruire il vostro software su piattaforma Linux/Unix si dovrebbe semplicemente andare alla directory di origine in cui si ha il file CMakeLists.txt e innescare lo stesso cmake . e genererà tutti i file necessari per voi per costruire software via sipmle make oppure make all.

Ecco alcuni molto buona presentazione sulla chiave funcitonalities CMake http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

Se vuoi per rendere la piattaforma biblioteca dipendente include le definizioni di variabili, ecc /è possibile utilizzare questa sintassi nel CMakeLists.txt file di

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

C'è anche un sacco di comandi con cui uso si è in grado di prevenire l'accumulo di fallire e al posto cmake vi comunicheremo che, per esempio non si dispone di spinta librerie filesystem e regex installate sul sistema. Per fare questo è possibile utilizzare la seguente sintassi:

find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

aver verificato che genererà i makefile per appropriata sistema/IDE/compilatore.

+0

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 della prima fase, in cui una persona deve capire cosa sta succedendo in CMake! – Nav

+0

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

Problemi correlati