2010-07-09 14 views
16

Domanda: CMake può generare script di compilazione che non utilizzano in alcun modo CMake? In caso contrario, quanto è difficile sventrare uno script di automake generato da CMake per non eseguire alcun controllo su CMake?CMake può generare script di compilazione che * non * usano cmake?

Sono un grande fan di CMake al punto in cui sto sostenendo l'idea di passare ad esso nel mio attuale ambiente di lavoro. Una cosa che potrebbe facilitare questa transizione dal nostro attuale sistema di compilazione a CMake sarebbe se potessi dimostrare che CMake può generare file di automake che non richiedono cmake.

Chiaramente, non vorrei mai farlo per l'uso quotidiano, ma avere la possibilità di creare facilmente un ramo del nostro codice che può essere compilato dalla sorgente senza richiedere cmake farebbe molto per aiutarmi a rendere il mio Astuccio.

+0

Trovo strano che le risposte qui siano "no". Sto solo arrivando al punto con cmake che sto iniziando a capire come usarlo (piuttosto che cercare di forzarlo a fare qualcosa per cui non è stato progettato), come l'uso di build out-source, ecc. Ma io Sappi che cmake è in bundle con cpack, che può generare tarball su Linux e simili. Se un tarball richiede cmake per costruire, non sono affatto convinto che sia un tarball. – Steve314

+0

Daremo un'occhiata più approfondita a CPack;) – Voltaire

+3

Gli archivi tarati da CPack in genere non sono tarball di origine per la compilazione, ma piuttosto tarball binari per l'esecuzione del sistema. – JesperE

risposta

5

No, CMake non può farlo. Non ha molto senso, dato che senza il supporto di CMake in fase di costruzione, non ci sarebbe alcun modo per controllare o aggiornare i file di makefile/di progetto quando i file di CMakeList.txt sono stati modificati.

Se si passa da Visual Studio a CMake, è possibile dare un'occhiata a vcproj2cmake.

+1

Questa è in realtà una conseguenza "desiderata" - Sono interessato a generare un tipo di build di strumenti automatici "pronti a distribuire", dove make può essere usato per costruire il progetto senza dipendenze di cmake di alcun tipo - a quel punto, è ok se le modifiche non vengono riflesse in CMake. – Voltaire

+5

Questo è un caso d'uso a cui CMake non si rivolge. – JesperE

2

Come qualcuno che ha preso un grande software complesso e recentemente ha estratto il suo sistema di generazione esistente, installando al suo posto un nuovo sistema di costruzione. Posso dirti che non è facile, ma sicuramente non voglio gli script di shell come parte del mio processo di creazione, se possono essere evitati. Sempre più sistemi si ritroveranno con CMake su di loro, come altri software di grandi nomi come LLVM e KDE iniziano a usarlo: questa è un'area in cui accelera davvero, grandi progetti.

Una delle cose carine di CMake è che costruisce le cose più velocemente. Ricorrere al bivio delle istanze di shell per interpretare uno script rallenta davvero il processo di compilazione.

3

I file generati da CMake dipendono da cmake per vari comandi come creare/rimuovere/etc ... non solo per rigenerare i makefile su una modifica, quindi rimuovere cmake non funzionerà.

+2

+1 CMake può anche essere usato come linguaggio di scripting (vedere l'opzione "-P" nella manpage di CMake), e molti progetti usano CMake come sostituto per script di shell, per cose come copiare file in giro o invocare programmi di aiuto. Questi progetti richiedono CMake in fase di compilazione, non solo per generare il makefile. – sleske

-1

E la "soluzione atomica"?

EX- generare automaticamente un file "QT moc" dal CMakeLists.txt, quindi costruire progetto che dipende dal file cpp generato

# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file 
if(UNIX) 
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(UNIX) 

Dove il file .sh contiene:

# generate_moc.sh 
echo "generating moc file: moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp " 
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp 

equivalente di Windows file batch, "moc_creator_win.bat":

moc "GUICreator.h" -o "moc_GUICreator.cpp" 

non ho provato questo l po ast in finestre, ma o qualcosa di molto vicino dovrebbero funzionare, subito dopo il blocco if (UNIX) in CMakeLists.txt:

if(WIN32) 
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(WIN32) 

Quindi, in sostanza, se sei intelligente puoi fare quello che vuoi da un script e utilizzare le variabili di CMake come argomenti, non sono sicuro che tu possa chiedere di più ...

il punto è quello di evitare 'tipi di build non portatili' a meno che non si ha realmente bisogno di incidere in un compilatore specializzato, o non ci si sente come l'utilizzo di Qt Designer per posizionare i widget ;-)

+0

Non sono sicuro che questo sia pertinente alla domanda originale. –

+0

Il punto in cui è possibile utilizzare CMake come previsto o all'estremità opposta dello spettro, è sufficiente avvolgerlo attorno a script arbitrari. Non c'è niente che ti impedisca di analizzare le variabili cmake e generare qualsiasi makefile desideri ... –

4

La capacità per fare ciò dipende dal tuo sistema operativo, presumo Unix/Makefile o Winderz/MSVC. Se stai usando MSVC, la dipendenza cmake dovrebbe essere eliminata dichiarando l'opzione CMAKE_SUPPRESS_REGENERATION all'inizio dello script cmake.

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

Sui sistemi basati su Unix, tuttavia, i Makefile sono tied esplicitamente al CMake costruire file (CMakeFiles, ecc). Sospetto che questa dipendenza possa essere aggirata dal commento strategico delle direttive Makefile sebbene, non posso dire quali potrebbero essere.