2014-09-09 9 views
8

Sto cercando di capire lo scopo dietro CMake. Perché è progettato come è adesso. Ecco alcune domande a cui vorrei avere una risposta.Capire lo scopo dietro CMake

  • Perché cmake genera makefile anziché solo la creazione del progetto?
  • Perché i file cmake sono una serie di comandi e non solo i file di configurazione, ad esempio: ini/xml/yaml
  • Quali sono i comandi che devo scrivere nel file CMakeLists.txt? Chiamare semplicemente il compilatore sarebbe troppo facile, immagino che
  • In quale ordine dovrei fare i comandi?
  • Tutto maiuscolo/minuscolo? Posso scrivere tutto in minuscolo?
  • Perché i tutorial mi consigliano di elencare esplicitamente ogni file sorgente?
  • Come strutturare il mio CMakeLists.txt per mantenerlo breve e semplice da mantenere. Ogni file che ho cercato nei progetti reali sembrava molto disordinato.

risposta

11

Può essere difficile capire come funziona CMake. Farò del mio meglio per rispondere brevemente ad alcune delle domande che hai postato.

Perché cmake genera makefile anziché solo la creazione del progetto?

CMake è un cross-platform make system ed è indipendente dal compilatore. Non genera solo i sistemi di compilazione, ma genera anche i file di soluzione di Visual Studio. Con lo stesso file CMakeList.txt, qualcuno può facilmente creare una build di Windows (Visual Studio) o una build Linux (g ++).

Perché sono file cmake [una serie di] comandi e non solo i file di configurazione ad esempio: ini/xml/yaml

compilatori non utilizzano una configurazione universale, in modo da CMake deve adattare per il target compilatore.

I file CMake sono una serie di comandi per generare la configurazione appropriata per il compilatore di destinazione.

Quali sono i comandi che devo scrivere nel comando CMakeLists.txt? Direi semplicemente che il compilatore sarebbe troppo facile, suppongo che

Suppongono di generare la configurazione appropriata per il compilatore di destinazione, e lo saranno se scritti correttamente.

In quale ordine si suppone di dover eseguire i comandi?

Nell'ordine che conta, se l'ordine è importante. Sì, è una risposta vaga, ma dipende dal progetto. Ad esempio, il comando include() verrà utilizzato per aggiungere ulteriori file cmake e, se li si include nell'ordine sbagliato, si può interrompere la generazione del sistema di generazione.

Il primo comando nel file cmake deve essere la versione minima richiesta con l'ultima versione di CMake (3.0.1). Da lì dipende.:)

Ad esempio questo comando non funzionerà con versioni di CMake inferiori a 2.6. cmake_minimum_required (VERSION 2.6)

Vedere alcuni dei collegamenti del tutorial alla fine di questa risposta.

Tutto maiuscolo/minuscolo? Posso scrivere tutto in minuscolo?

Come indicato sul wiki del CMake language syntax page, tutti i comandi sono case insensitive, ma è necessario prendere in considerazione caso per i contenuti passati a un comando.

Perché i tutorial mi consigliano di elencare esplicitamente ogni file sorgente?

Perché è necessario elencare esplicitamente ogni file sorgente. Questo può essere fatto all'interno di un file cmake o di una lista di file separata a cui si fa riferimento nel file cmake. Si prega di vedere Antonio answer per un avvertimento di utilizzare un elenco di file separato.

CMake fornisce un commandaux_source_directory che raccoglie i nomi di tutti i file di origine in una directory specificata e memorizza l'elenco a una variabile, ma dovrebbe essere utilizzato solo per i file di origine "generati" per lo stesso motivo di cui Antonio answer.

Come strutturare il mio CMakeLists.txt per mantenerlo breve e semplice da mantenere. Ogni file che ho cercato nei progetti reali sembrava molto disordinato.

È molto facile ingombrare un file CMake, e un modo per aiutare con questo è usare i file .cmake che si fanno riferimento usando il comando include.

Una buona risorsa (anche se ancora in fase di sviluppo) può essere trovata sul CMake about page.

E 'suddiviso in diverse sezioni:

  1. Overview
  2. Statistics (in fase di sviluppo)
  3. Participants
  4. Documentation
  5. License
  6. Success Stories
  7. Publications
  8. News

Tutorial

CMake Tutorial - Dalla CMake pagina di documentazione ufficiale

Getting Started With CMake - Un tutorial che utilizza CMake con gcc.

Using CMake To Build QT Projects - Un tutorial che utilizza CMake con QT.

+0

grazie mille per la vostra informazione. Ma questo non è ancora chiaro: qual è la configurazione appropriata che il mio file deve generare? So che è "dipende da cosa vuoi". Ma sono sempre confuso per aiutare me stesso qui. La documentazione che hai collegato qui è un riferimento, ciò che è esattamente ciò che non sto cercando, perché presuppone che io abbia già compreso lo scopo generale. – Arne

+0

@Arne, se vuoi una risposta specifica a una domanda specifica, allora ti suggerisco di creare una nuova domanda con quei dettagli. È difficile essere specifici senza questi dettagli. – jmstoker

+0

Ho pensato che la mia domanda fosse specifica nel chiedere un tutorial approfondito. Le domande erano solo alcuni esempi, non tutti i miei problemi. È semplicemente sbagliato iniziare a imparare CMake scrivendo 20 domande di overflow dello Stack. Così ho pensato di perdere qualcosa che tutti conoscono tranne che da me che ho bisogno di leggere. – Arne

2

Dal jmstoker ha dato già una risposta molto completo, mi concentrerò su questo punto specifico:

"Why do tutorials advise me to list every source file explicitly?"

In pratica è possibile utilizzare le funzioni globbing, ma il problema è che se si aggiunge un file, quindi devi eseguire esplicitamente cmake per rendere cmake consapevole della sua presenza. Di solito non è un problema se si lavora "da soli", ma in un progetto condiviso può essere un problema se qualcuno aggiunge un file, si aggiorna e quindi si compila affrontando strani errori.

Con git esiste una soluzione che consente di attivare "cmake". ogni volta che avviene un'unione. Getting cmake to run before building after pulling from git

+0

Il problema che ho con la scrittura manuale di ogni file nel mio CMakeLists.txt è che devo farlo manualmente.Sarebbe bello se l'elenco dei file del mio progetto fosse generato dal mio ide (qtcreator), in modo da non dover toccare nulla manualmente quando aggiungo un file al progetto. – Arne

+0

Questo è un grande punto Antonio, ben detto! @Arne Sì, sarebbe più semplice avere i file aggiunti automaticamente tramite l'IDE, ma questa funzionalità non esiste in modo nativo in CMake. Esistono plugin per alcuni IDE compatibili con CMake che possono fornire questo, ma in background scrivono su un file CMakeList.txt o .cmake. – jmstoker

+0

Non mi piace scrivere automaticamente in un file che dovrebbe essere scritto a mano, perché si sporca molto rapidamente. Ma questo è un altro argomento. Qui stavo solo chiedendo tutorial introduttivi. Non riferimenti e non storie di successo. Tutorial che mi fanno capire concetti di cmake a qualcuno come me che pensa che ogni linea di qualsiasi sistema di costruzione sia fastidiosa e inutile, perché è già dimostrato che generalmente funziona anche interamente senza di esso come in go. Alcuni tutorial che mi spiegano perché alcuni passaggi sono necessari per costruire C++. Questo è importante per me. – Arne